吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 6680|回复: 4
收起左侧

[第二课] 关于第二课作业去弹窗的一点小想法

[复制链接]
usosalpha 发表于 2016-9-7 14:43
本帖最后由 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分支也跳过了,
弹浏览器的广告就也不会出现了,一举两得。实验之后也不会出现任何错误,说明这么改是合理的。
改正后程序执行的的逻辑就是我不管你在哪生成的消息框,一旦执行到设置属性值部分我就直接把你的消息框销毁了,屏幕上也就不会显示弹窗广告了,这样改对源代码的改动也非常小。最后发一张我的成品图

完成

完成

欢迎大佬们批评指教。

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
海天一色001 + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Hmily 发表于 2016-9-7 14:52
图片没上传成功。
万一行了呢 发表于 2016-9-7 15:05
 楼主| usosalpha 发表于 2016-9-7 15:07
nihg 发表于 2016-10-3 08:01 来自手机
很好的好的
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-22 10:05

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表