【软件名称】:WinRar 【软件版本】:5.4 【软件下载】:自己搜索下载 【外壳保护】:无 话说硬柿子都被大牛捏掉了,我们这些屌丝只能捏捏软柿子了。 话说winrar原来在中国改变战略了(现在才知道,汗),只是在软件里搞个Nag。 这个东西其实挺讨厌的,尤其是我这种电脑配置不好的。 1. 下断CretaeWindow 2. 看看是哪块不开眼的代码创建了这个窗口 3. 做了它 OD载入它,按Ctrl+N,发现只有CreateWindowExW这一个API。 我们当然不能直接傻乎乎地在那里一个一个的跟踪,假设有20个控件,那么就要调用这个API20次…… 所以我们考虑一下条件断点,我查了下这个API的参数列表。 第一个参数是风格,不用鸟他 第二个参数是类名,这个很重要 第三个参数是标题名,不喜欢用。 我们来看看第二个参数,按照stdcall的调用方式,参数从右边往左边入栈,同时栈空间是从高往低增长的, 比如调用 a,a(1, 2, 3) Push 3 ;入栈3,执行完成后,esp = esp - 4 Push 2 ;入栈2,esp = esp - 8 Push 1; 入栈1,esp = esp – 0xC Call a ;入栈返回地址eip,esp = esp – 0x10 栈空间里就是这样排放的数据 返回地址eip ESP 参数1(1) ESP+ 4 参数2(2) ESP+ 8 参数3(3) ESP+ 0xC 本人语文不好,可能没讲清楚,别打我啊…… 于是我们可以得出,ESP + 8就是参数二(stdcall调用方式),而ESP + 8是一个字符串地址 我们再来看看OD的条件断点语法。 [UNICODE [ESP]]== “12345” ;如果ESP(字符串地址)指向的字符串等于12345就中断,因为CreateWindowExW使用的是UNICODE字符串,所以这里也用UNICODE,如果是以A结尾的API,则使用STRING 其实也可以这么写 [UNICODE[[ESP]]] ;这个就相当于字符串的指针了。好吧,扯歪了一点。
我们在OD的CPU窗口中按Ctrl+G,输入CreateWindowExW,按确定,来到该API头部,再按Shift + F2,输入以下表达式。 按确定,至于这个类名是怎么得到的吗,其实很简单啊,比如说我用的是Spy4Win这个小工具 点确定之后,我们按下F9,让程序跑起来。 断在这里,我们右键那个第一行的CALL到……,点击反汇编窗口中跟随,发现来到了这里 004A17AD |> \68 00010000 push 100 004A17B2 |. 68 186F5200 push 00526F18 ; ASCII"http://ad.winrar.com.cn/show_2.html?L=7&bl=7&v=540personal&a=32&src=pe005" 004A17B7 |. E8 24F3FFFF call 004A0AE0 004A17BC |. 6A 00 push 0 ;/lParam = NULL 004A17BE |. FF35 24DF5600 push dword ptr[56DF24] ; |hInst =00400000 004A17C4 |. 6A 00 push 0 ;|hMenu = NULL 004A17C6 |. 6A 00 push 0 ;|hParent = NULL 004A17C8 |. 57 push edi ; |Height 004A17C9 |. 56 push esi ;|Width 004A17CA |. 55 push ebp ; |Y 004A17CB |. FF7424 2C push dword ptr [esp+2C] ; |X 004A17CF |. 53 push ebx ; |Style 004A17D0 |. 68ACE05000 push 0050E0AC ; |WindowName ="WinRAR" 004A17D5 |. 6804065100 push 00510604 ; |Class ="RarReminder" 004A17DA |. 6A 00 push 0 ; |ExtStyle = 0 004A17DC |. FF15 A0B65000 call dword ptr[<&USER32.CreateWindow>; \CreateWindowExW 004A17E2 |. F605 A86B5200>test byte ptr [526BA8], 1 004A17E9 |. 5F pop edi 004A17EA |. 5D pop ebp 004A17EB |. 7413 je short 004A1800 004A17ED |. 6A 03 push 3 ;/Flags = SWP_NOSIZE|SWP_NOMOVE 004A17EF |. 6A 00 push 0 ;|Height = 0 004A17F1 |. 6A 00 push 0 ;|Width = 0 004A17F3 |. 6A 00 push 0 ;|Y = 0 004A17F5 |. 6A 00 push 0 ;|X = 0 004A17F7 |. 6A FF push -1 ; |InsertAfter =HWND_TOPMOST 004A17F9 |. 50 push eax ; |hWnd 004A17FA |. FF15 88B65000 call dword ptr[<&USER32.SetWindowPos>; \SetWindowPos 004A1800 |> 833D 14895300>cmp dword ptr[538914], 0 004A1807 |. 7433 je short 004A183C 004A1809 |. C605 64A05700>mov byte ptr [57A064], 1 004A1810 |. EB 2A jmp short 004A183C 004A1812 |> 84DB test bl, bl 004A1814 |. 7426 je short 004A183C 004A1816 |. 6A 00 push 0 ;/lParam = NULL 004A1818 |. 68403D4D00 push 004D3D40 ; |DlgProc =WinRAR.004D3D40 004A181D |. C60564A05700>mov byte ptr [57A064], 1 ; | 004A1824 |. FF15 B0B65000 call dword ptr[<&USER32.GetFocus>] ;|[GetFocus 004A182A |. 50 push eax ; |hOwner 004A182B |. 68 1C065100 push 0051061C ; |pTemplate ="REMINDER" 004A1830 |. FF35 20DF5600 push dword ptr[56DF20] ; |hInst =00400000 004A1836 |. FF15 78B65000 call dword ptr[<&USER32.DialogBoxPar>; \DialogBoxParamW 通篇都是创建窗口,我们把代码往上面拉一拉。 这些字符串很可疑啊,看起来就是网址,而且还含有ad(广告),我们继续把代码往上面翻。 原来这是一个函数啊,考虑直接在段首RET掉。我们回到段尾,发现是RET8,我们就把段首第一句改成RET8好了(堆栈平衡参数,否则会崩溃)。 保存,打开,发现弹窗已经被去掉了。 清清爽爽的,多秀气的小姑娘啊。 打完收工了。
|