Winrar v5.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 100004A17B2|.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 004A0AE0004A17BC|.6A 00 push 0 ;/lParam = NULL004A17BE|. FF35 24DF5600 push dword ptr ; |hInst =00400000004A17C4|.6A 00 push 0 ;|hMenu = NULL004A17C6|.6A 00 push 0 ;|hParent = NULL004A17C8|. 57 push edi ; |Height004A17C9|. 56 push esi ;|Width004A17CA|. 55 push ebp ; |Y004A17CB|. FF7424 2C push dword ptr ; |X004A17CF|. 53 push ebx ; |Style004A17D0|.68ACE05000 push 0050E0AC ; |WindowName ="WinRAR"004A17D5|.6804065100 push 00510604 ; |Class ="RarReminder"004A17DA|.6A 00 push 0 ; |ExtStyle = 0004A17DC|.FF15 A0B65000 call dword ptr[<&USER32.CreateWindow>; \CreateWindowExW004A17E2|.F605 A86B5200>test byte ptr , 1004A17E9|.5F pop edi004A17EA|. 5D pop ebp004A17EB|.7413 je short 004A1800004A17ED|.6A 03 push 3 ;/Flags = SWP_NOSIZE|SWP_NOMOVE004A17EF|.6A 00 push 0 ;|Height = 0004A17F1|.6A 00 push 0 ;|Width = 0004A17F3|.6A 00 push 0 ;|Y = 0004A17F5|.6A 00 push 0 ;|X = 0004A17F7|.6A FF push -1 ; |InsertAfter =HWND_TOPMOST004A17F9|. 50 push eax ; |hWnd004A17FA|. FF15 88B65000 call dword ptr[<&USER32.SetWindowPos>; \SetWindowPos004A1800|> 833D 14895300>cmp dword ptr, 0004A1807|.7433 je short 004A183C004A1809|. C605 64A05700>mov byte ptr , 1004A1810|.EB 2A jmp short 004A183C004A1812|> 84DB test bl, bl004A1814|.7426 je short 004A183C004A1816|.6A 00 push 0 ;/lParam = NULL004A1818|.68403D4D00 push 004D3D40 ; |DlgProc =WinRAR.004D3D40004A181D|.C60564A05700>mov byte ptr , 1 ; |004A1824|. FF15 B0B65000 call dword ptr[<&USER32.GetFocus>] ;|004A182A|. 50 push eax ; |hOwner004A182B|.68 1C065100push 0051061C ; |pTemplate ="REMINDER"004A1830|. FF35 20DF5600 push dword ptr ; |hInst =00400000004A1836|. FF15 78B65000 call dword ptr[<&USER32.DialogBoxPar>; \DialogBoxParamW 通篇都是创建窗口,我们把代码往上面拉一拉。这些字符串很可疑啊,看起来就是网址,而且还含有ad(广告),我们继续把代码往上面翻。原来这是一个函数啊,考虑直接在段首RET掉。我们回到段尾,发现是RET8,我们就把段首第一句改成RET8好了(堆栈平衡参数,否则会崩溃)。保存,打开,发现弹窗已经被去掉了。清清爽爽的,多秀气的小姑娘啊。{:2_155:} 打完收工了。{:2_153:}
谢谢楼主分享,这教程看了受益匪浅,思路不错。 恩恩,不错的思路 学习了,感谢分享了 非常赞,就需要这样的技术帖 大牛吃柿子 小牛吃柿皮 {:3_163:}感谢楼主,小牛就跟着你吃软柿子(好像今天在那见过这贴!) 看起来很不错哦,收藏之~~~ 谢谢LZ啦!!!思路看起来挺简单啊 平凡中见功底。 学习学习啦{:lol:}!
页:
[1]
2