好友
阅读权限10
听众
最后登录1970-1-1
|
本帖最后由 usosalpha 于 2016-9-7 15:06 编辑
我也是新来的,想要学习一下破解的技术,当时培训的时候因为比较忙也没有参与,最近时间多了就来看一看教程的录像自学一下。
对于第二课的作业,其实本身和老师讲解的例子没有太大的区别,但是在处理弹窗的时候遇到了一点小问题。虽然之前也学过一点windows编程,了解一些基本的API,但是因为很久不用都记不住了,特别是弹窗对话框那一个,于是就自己摸索了一个别的处理方法,拿出来和大家讨论一下
处理资源的时候我用了最基本的字符串检索法,很容易就找到了弹窗中出现的文字
文字搜索
然后双击进入了代码部分,发现这部分应该是一个函数里面
004027E0 55 push ebp
004027E1 8BEC mov ebp,esp
004027E3 83EC 08 sub esp,0x8
004027E6 8B45 0C mov eax,dword ptr ss:[ebp+0xC]
004027E9 8945 FC mov dword ptr ss:[ebp-0x4],eax
004027EC 837D FC 02 cmp dword ptr ss:[ebp-0x4],0x2
004027F0 74 6A je short HW1_dump.0040285C //分支0x2
004027F2 817D FC 1001000>cmp dword ptr ss:[ebp-0x4],0x110
004027F9 74 0E je short HW1_dump.00402809 //分支0x110
004027FB 817D FC 1101000>cmp dword ptr ss:[ebp-0x4],0x111
00402802 74 66 je short HW1_dump.0040286A //分支0x111
00402804 E9 99000000 jmp HW1_dump.004028A2
00402809 68 83000000 push 0x83 //对话框初始化部分
0040280E 6A 00 push 0x0
00402810 FF15 30745200 call dword ptr ds:[<&kernel32.#GetNamedP>; kernel32.GetModuleHandleW
00402816 50 push eax
00402817 FF15 50785200 call dword ptr ds:[<&user32.#445>] ; user32.LoadIconW
0040281D 50 push eax
0040281E 6A 00 push 0x0
00402820 68 80000000 push 0x80
00402825 8B4D 08 mov ecx,dword ptr ss:[ebp+0x8] ; HW1_dump.<ModuleEntryPoint>
00402828 51 push ecx
00402829 FF15 44785200 call dword ptr ds:[<&user32.#577>] ; user32.SendMessageW
0040282F 68 181A5500 push HW1_dump.00551A18 ; 我就是广告\r\n来把我干掉啊\r\n加油! //字符串搜索到这里了
00402834 68 E9030000 push 0x3E9
00402839 8B55 08 mov edx,dword ptr ss:[ebp+0x8] ; HW1_dump.<ModuleEntryPoint>
0040283C 52 push edx ; ntdll.KiFastSystemCallRet
0040283D FF15 40785200 call dword ptr ds:[<&user32.#597>] ; user32.SetDlgItemTextW
00402843 6A 00 push 0x0
00402845 6A 00 push 0x0
00402847 8B45 08 mov eax,dword ptr ss:[ebp+0x8] ; HW1_dump.<ModuleEntryPoint>
0040284A 50 push eax
0040284B 68 90274000 push HW1_dump.00402790
00402850 6A 00 push 0x0
00402852 6A 00 push 0x0
00402854 FF15 2C745200 call dword ptr ds:[<&kernel32.#CreateThr>; kernel32.CreateThread
0040285A EB 46 jmp short HW1_dump.004028A2
0040285C 6A 00 push 0x0 //对话框销毁
0040285E 8B4D 08 mov ecx,dword ptr ss:[ebp+0x8] ; HW1_dump.<ModuleEntryPoint>
00402861 51 push ecx
00402862 FF15 3C785200 call dword ptr ds:[<&user32.#199>] ; user32.EndDialog
00402868 EB 38 jmp short HW1_dump.004028A2
0040286A 8B55 10 mov edx,dword ptr ss:[ebp+0x10] //弹浏览器广告
0040286D 81E2 FFFF0000 and edx,0xFFFF
00402873 0FB7C2 movzx eax,dx
00402876 8945 F8 mov dword ptr ss:[ebp-0x8],eax
00402879 837D F8 01 cmp dword ptr ss:[ebp-0x8],0x1
0040287D 74 08 je short HW1_dump.00402887
0040287F 837D F8 02 cmp dword ptr ss:[ebp-0x8],0x2
00402883 74 11 je short HW1_dump.00402896
00402885 EB 1B jmp short HW1_dump.004028A2
00402887 6A 05 push 0x5
00402889 68 401A5500 push HW1_dump.00551A40 ; ASCII "explorer.exe http://www.52pojie.cn/thread-384195-1-1.html"
0040288E FF15 28745200 call dword ptr ds:[<&kernel32.#WriteCons>; kernel32.WinExec
00402894 EB 0C jmp short HW1_dump.004028A2
00402896 6A 00 push 0x0
00402898 8B4D 08 mov ecx,dword ptr ss:[ebp+0x8] ; HW1_dump.<ModuleEntryPoint>
0040289B 51 push ecx
0040289C FF15 3C785200 call dword ptr ds:[<&user32.#199>] ; user32.EndDialog
004028A2 33C0 xor eax,eax
004028A4 8BE5 mov esp,ebp
004028A6 5D pop ebp ; kernel32.7C817067
004028A7 C3 retn
分析这一整段代码发现,这段可以分为几个部分来看。最开始是跳转部分,总共有三个跳转都是比较eax的值(dword ptr ss:[ebp-0x4]的值,因为前面有mov)和三个固定值0x2,0x110和0x111,之后跳转到的部分最后接的都是jmp并且都跳到了4028A2这个位置上,
粗略的判断这应该是一个switch case分支结构,再看看每个分支都干了什么。首先是0x2的分支跳转到了40285C,这一分支后面的指令是user32.EndDialog;这个操作是销毁对话框的操作。而0x110正好跳转到了对话框的创建部分,包括获取窗口句柄、设置对话框内容,
最后是建立线程,应该是对话框的属性配置函数;而0x111跳到了40286A,这部分调用了WinExec这个API,是一个弹浏览器的广告操作。从功能上看这个函数非常凌乱,各种功能混杂在一起,显然不是一个高内聚低耦合的程序,所以我觉得这应该是一系列回调函数然后
编译器为了节约空间把他们整合在一起了,而这一大组函数都是没什么用的,所以我最先考虑把这整个函数retn掉,直接把4027E0 修改为retn。
无效的弹窗
修改后发现浏览器少弹出了一次(默认的360浏览器不弹网页了)还是弹,去除弹网页在别的地方,这里可能是个骗人的,但是弹出的对话框还在,只不过没有字了,而且鼠标移动到没有字的框上就变成了漏斗的形状。
看起来这么改有效果但是不行。从症状上来看弹窗对话框应该是先再别处进行了初始化操作,然后再在我们找到的字符串位置修改内容,然后建立线程处理消息。由于我们直接把函数retn了,弹窗并没有机会建立线程,也就没法处理任何对于它的消息了,但是它却实实在在的建立了,
所以表面上看就是死了,程序也没有出错,说明弹窗线程并没有做其他的事情,线程结束也无妨。
把4027E0改回去,并下断点,发现执行时这个函数会被调用两次,不会进入0x2的分支,弹窗也没消失,说明0x2分支确实是弹窗结束的分支,而恰好函数的第一个分支je就是0x2,所以把4027F0的je改成jmp应该就可以了,而分支结束后的jmp把0x111分支也跳过了,
弹浏览器的广告就也不会出现了,一举两得。实验之后也不会出现任何错误,说明这么改是合理的。
改正后程序执行的的逻辑就是我不管你在哪生成的消息框,一旦执行到设置属性值部分我就直接把你的消息框销毁了,屏幕上也就不会显示弹窗广告了,这样改对源代码的改动也非常小。最后发一张我的成品图
完成
欢迎大佬们批评指教。
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|