winrar 5.4 去广告教程
【软件名称】:WinRar【软件版本】:5.4【软件下载】:自己搜索下载【外壳保护】:无话说硬柿子都被大牛捏掉了,我们这些屌丝只能捏捏软柿子了。
话说winrar原来在中国改变战略了(现在才知道,汗),只是在软件里搞个Nag。
这个东西其实挺讨厌的,尤其是我这种电脑配置不好的。
理一理逆向分析思路。1. 下断CretaeWindow2. 看看是哪块不开眼的代码创建了这个窗口3. 做了它
OD载入它,按Ctrl+N,发现只有CreateWindowExW这一个API。我们当然不能直接傻乎乎地在那里一个一个的跟踪,假设有20个控件,那么就要调用这个API20次……所以我们考虑一下条件断点,我查了下这个API的参数列表。第一个参数是风格,不用鸟他第二个参数是类名,这个很重要第三个参数是标题名,不喜欢用。我们来看看第二个参数,按照stdcall的调用方式,参数从右边往左边入栈,同时栈空间是从高往低增长的,比如调用 a,a(1, 2, 3)Push 3 ;入栈3,执行完成后,esp = esp - 4Push 2 ;入栈2,esp = esp - 8Push 1; 入栈1,esp = esp – 0xCCall 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的条件断点语法。]== “12345” ;如果ESP(字符串地址)指向的字符串等于12345就中断,因为CreateWindowExW使用的是UNICODE字符串,所以这里也用UNICODE,如果是以A结尾的API,则使用STRING其实也可以这么写]] ;这个就相当于字符串的指针了。好吧,扯歪了一点。我们在OD的CPU窗口中按Ctrl+G,输入CreateWindowExW,按确定,来到该API头部,再按Shift + F2,输入以下表达式。
按确定,至于这个类名是怎么得到的吗,其实很简单啊,比如说我用的是Spy4Win这个小工具
点确定之后,我们按下F9,让程序跑起来。
断在这里,我们右键那个第一行的CALL到……,点击反汇编窗口中跟随,发现来到了这里
004A17AD|> \68 00010000 push 100
004A17B2|.68 186F5200push 00526F18 ;ASCII"http://ad.winrar.com.cn/show_2.html?L=7&bl=7&v=540personal&a=32&src=pe005"
004A17B7|.E8 24F3FFFFcall 004A0AE0
004A17BC|.6A 00 push 0 ;/lParam = NULL
004A17BE|. FF35 24DF5600 push dword ptr ; |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 ; |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 , 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, 0
004A1807|.7433 je short 004A183C
004A1809|. C605 64A05700>mov byte ptr , 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 , 1 ; |
004A1824|. FF15 B0B65000 call dword ptr[<&USER32.GetFocus>] ;|[GetFocus
004A182A|. 50 push eax ; |hOwner
004A182B|.68 1C065100push 0051061C ; |pTemplate ="REMINDER"
004A1830|. FF35 20DF5600 push dword ptr ; |hInst =00400000
004A1836|. FF15 78B65000 call dword ptr[<&USER32.DialogBoxPar>; \DialogBoxParamW
通篇都是创建窗口,我们把代码往上面拉一拉。
这些字符串很可疑啊,看起来就是网址,而且还含有ad(广告),我们继续把代码往上面翻。
原来这是一个函数啊,考虑直接在段首RET掉。我们回到段尾,发现是RET8,我们就把段首第一句改成RET8好了(堆栈平衡参数,否则会崩溃)。
保存,打开,发现弹窗已经被去掉了。
清清爽爽的,多秀气的小姑娘啊。
打完收工了。
**** Hidden Message *****
我把最后让大家轻点*你的话给删了,就可以发布了。 很解渴。{:5_120:} 这个不错呀没广告老带劲了! Shark恒 发表于 2016-11-26 16:57
我把最后让大家轻点*你的话给删了,就可以发布了。
谢谢鲨鱼提醒 条件断点最骚的就是断不下具体数值,比如你上图的extStyle=0,然后断==0断不下来,,伤脑筋 这个教程太给力啦 没广告老带劲了!谢谢楼主 看看怎么怼 学习..大神厉害了{:5_116:}