学破解第153天,《yyhd大佬的玩玩破解教程16-18集反调试、破解软件使用次数》学习
前言:
从小学到大专(计算机网络技术专业),玩过去的,所以学习成绩惨不忍睹,什么证书也没考,直到找不到工作才后悔,不知道怎么办才好。
2017年12月16日,通过19元注册码注册论坛账号,开始做伸手党,潜水一年多,上来就是找软件。(拿论坛高大上的软件出去装X)
2018年8月10日,报名了华中科技大学网络教育本科(计算机科学与技术专业)2018级秋季。(开始提升学历)
2019年6月17日,不愿再做小菜鸟一枚,开始零基础学习破解。(感谢小糊涂虫大哥在我刚开始学习脱壳时,录制视频解答我的问题)
2020年7月7日,感谢H大对我的鼓励,拥有了第一篇获得优秀的文章。(接下来希望学习逆向,逆天改命)
2021年8月11日,华科学位英语2次不过,仅取得了毕业证书,学业提升失败,开始琢磨考注册类和职称类证书,谋求涨薪
坛友们,年轻就是资本,和我一起逆天改命吧,我的学习过程全部记录及学习资源:https://www.52pojie.cn/thread-1503734-1-1.html
立帖为证!--------记录学习的点点滴滴
0x1 扫盲
1.软件开发作者通常为了保护自己的程序不被破解,可能会加入反调试技术,阻止逆向人员进行破解。
2.常见的手段就是检测窗口标题,Windows API反调试,加壳自校验等手段。
3.CreateToolhelp32Snap函数,获取系统中正在运行的进程信息,线程信息,等:
HANDLE WINAPI CreateToolhelp32Snapshot(
DWORD dwFlags, //用来指定“快照”中需要返回的对象,可以是TH32CS_SNAPPROCESS等
DWORD th32ProcessID //一个进程ID号,用来指定要获取哪一个进程的快照,当获取系统进程列表或获取 当前进程快照时可以设为0
);
4.读文件大小相关函数:
计算文件尺寸的API函数是什么?
主要是三个,一个是FindFirstFile,一个Filelength,一个是GetFileSize。
5.注册表相关函数:
对读注册表的API函数下断点RegOpenKeyA、RegOpenKeyExA
写注册表的API函数下断点RegSetValueA和RegSetValueExA
0x2 第十六集 反调试
1.先阅读文章学习,然后下载程序,OD载入被检测了。
2.搜索字符串“调戏”,右键-》中文搜索引擎,智能搜索,没有,Ctrl+B快捷键,ASCII骂和UNICODE码也搜索不到,试试作者的方法,输入命令bp CreateToolhelp32Snapshot下断点,重新载入程序,F9跑起来。
反汇编窗口
0040123E |. 68 00000000 push 0x0
00401243 |. 68 02000000 push 0x2
00401248 |. B8 01000000 mov eax,0x1
0040124D |. E8 9F280000 call 反调试_?00403AF1
00401252 |. 3965 F0 cmp [local.4],esp
00401255 |. 74 17 je short 反调试_?0040126E
00401257 |. 68 19000000 push 0x19
0040125C |. 68 0E530104 push 0x401530E
00401261 |. 68 06000000 push 0x6
00401266 |. E8 80280000 call 反调试_?00403AEB
堆栈窗口
0018FCA8 00401252 /CALL 到 CreateToolhelp32Snapshot 来自 反调试_?0040124D
0018FCAC 00000002 |Flags = TH32CS_SNAPPROCESS
0018FCB0 00000000 \ProcessID = 0x0
0018FCB4 0041B511 返回到 反调试_?0041B511
3.继续F8单步向下走,看到可疑的跳转就修改试一试,最终发现经过这段代码的时候,寄存器eax出现了可疑字符串。
00401134 |> \B8 83734A00 mov eax,反调试_?004A7383
00401139 |. 8945 FC mov [local.1],eax
0040113C |. 8D45 FC lea eax,[local.1]
0040113F |. 50 push eax
00401140 |. E8 90170000 call 反调试_?004028D5
eax=00694E98, (ASCII "你正在用OD调戏我,我要报警!")
4.向上走发现004010BD这个jnz跳转到检测OD提示的地方,将其nop掉即可,运行试试,成功过掉了反调试。
0x3 第十七集 自校验
1.将程序载入OD,提示加壳了,那么使用查壳工具看看,是什么壳:
2.UPX壳,载入程序,F8,hr esp下硬件访问断点,F9运行,取消硬件断点,看到jmp大跳,F4过去,F8单步到达oep,OD插件dump脱壳。
004873E1 55 push ebp
004873E2 8BEC mov ebp,esp
004873E4 6A FF push -0x1
004873E6 68 B0654B00 push CM_文件?004B65B0
004873EB 68 F0C64800 push CM_文件?0048C6F0
004873F0 64:A1 00000000 mov eax,dword ptr fs:[0]
004873F6 50 push eax
004873F7 64:8925 0000000>mov dword ptr fs:[0],esp
3.win7脱壳有点问题,脱完打不开了,这里我使用论坛爱盘的UPX脱壳工具:https://down.52pojie.cn/Tools/Unpackers/UPX%20Unpacker.zip,脱壳后运行程序,点登录,提示修改了代码。
4.说明修改了程序会有检测,例如自校验功能,CRC校验,文件大小检测等等,通常压缩壳会缩小程序体积,我们脱壳后程序体积会变大,搜索字符串看到提示,然后段首直接retn返回,即可过文件大小校验:
0040345D |. 55 push ebp
0040345E |. 8BEC mov ebp,esp
00403460 |. 81EC 04000000 sub esp,0x4
00403466 |. 817D 08 00E40>cmp [arg.1],0x6E400
0040346D |. 0F8E 3E000000 jle CM_文件?004034B1
00403473 |. BB 06000000 mov ebx,0x6
00403478 |. E8 D8FFFFFF call CM_文件?00403455
0040347D |. 68 01030080 push 0x80000301
00403482 |. 6A 00 push 0x0
00403484 |. 68 00000000 push 0x0
00403489 |. 68 04000080 push 0x80000004
0040348E |. 6A 00 push 0x0
00403490 |. 68 BCBA4A00 push CM_文件?004ABABC ; 你修改了代码
5.然后搜索登录失败,发现没有地方可以跳过去,找不到关键跳:
00403D80 |. A3 6CFE4D00 mov dword ptr ds:[0x4DFE6C],eax
00403D85 |. B8 11BA4A00 mov eax,1.004ABA11 ; 52pojie
00403D8A |. 8945 FC mov [local.1],eax
00403D8D |. 8D45 FC lea eax,[local.1]
00403D90 |. 50 push eax
00403D91 |. B8 CBBA4A00 mov eax,1.004ABACB ; 登录失败,非常遗憾
6.使用易语言比较通杀补丁,Ctrl+F查找test edx,3,下断点,输入123,点击登录,成功的断了下来,发现真码:
0040229A /$ 8B5424 04 mov edx,dword ptr ss:[esp+0x4] ; 堆栈 ss:[0018F68C]=0066A6D0, (ASCII "123")
0040229E |. 8B4C24 08 mov ecx,dword ptr ss:[esp+0x8] ; 堆栈 ss:[0018F690]=00667168, (ASCII "ACB57D71107FOK16888")
004022A2 |. 85D2 test edx,edx ; 1.004ABA0C
004022A4 |. 75 0D jnz short 1.004022B3
7.所以密码就是ACB57D71107FOK16888,输入密码,成功:
8.借用作者原话:如果是比较文件大小的反调试程序,当你用GetFileSize函数断不了,可以用FindFirstFile函数下断点试试看。
9.如果是程序的自身校验,我们还可以使用补丁工具,带壳打补丁,避免触发程序的NAG。
0x4 破解软件使用次数
1.同样把程序下载下来,看到有未注册版本,你还可以使用xx次。
2.作者原文中给出了4种方法:
第一种方法可以搜索字符串
第二种方法可以对读注册表的API函数下断点RegOpenKeyA、RegOpenKeyExA
第三种方法可以下易语言“按钮事件”断点
第四种方法可以对写注册表的API函数下断点RegSetValueA和RegSetValueExA
3.按照我自己的思路,读取次数,要么从配置文件读取,要么从注册表读取,或者从网络读取,这里先尝试对注册表下读断点,也就是RegOpenKeyA、RegOpenKeyExA,跑起来看看。
0018FC20 00405E7B /CALL 到 RegOpenKeyA 来自 CM_使用?00405E76
0018FC24 80000002 |hKey = HKEY_LOCAL_MACHINE
0018FC28 006BB288 |Subkey = "SOFTWARE\CM0202"
0018FC2C 0018FC58 \pHandle = 0018FC58
0018FC28 00409301 /CALL 到 RegOpenKeyExA 来自 CM_使用?004092FB
0018FC2C 80000002 |hKey = HKEY_LOCAL_MACHINE
0018FC30 01FD6308 |Subkey = "SOFTWARE\CM0202"
0018FC34 00000000 |Reserved = 0x0
0018FC38 00020006 |Access = KEY_WRITE
0018FC3C 0018FC70 \pHandle = 0018FC70
搜索注册表,找不到这一个注册项,不知道哪里出问题了。
4.从读这里下不了手,试试写,我们每次打开软件使用次数少一次,下RegSetValueExA断点
0040938A |. 51 push ecx ; /BufSize = 0x2
0040938B |. 8B4C24 30 mov ecx,dword ptr ss:[esp+0x30] ; |CM_使用?004AA24B
0040938F |. 56 push esi ; |Buffer = 006AA498
00409390 |. 6A 01 push 0x1 ; |ValueType = REG_SZ
00409392 |. 50 push eax ; |Reserved = 0x0
00409393 |. 51 push ecx ; |ValueName = 00000002 ???
00409394 |. 52 push edx ; |hKey = 0x128
00409395 |. FF15 04004A00 call dword ptr ds:[<&ADVAPI32.RegSetValu>; \RegSetValueExA
5.仍然没有找到写入次数的地方,注册表又搜不到,那么怎么办?直接将RegSetValueExA这段代码nop掉,再将程序,保存出去,就可以锁定软件试用次数了。
6.能力有限,通过字符串搜索未注册版本,但是没有找到关键跳。
004034AC |. 68 1BA24A00 push CM_使用?004AA21B ; 次!
004034B1 |. FF75 EC push [local.5] ; CM_使用?0049206A
004034B4 |. 68 20A24A00 push CM_使用?004AA220 ; 未注册版本。 你还可以使用
004034B9 |. B9 03000000 mov ecx,0x3
004034BE |. E8 D0E7FFFF call CM_使用?00401C93
通过段首,转到调用call,来到这里,我怀疑jnz就是关键跳。
00401B91 |. /0F85 0A000000 jnz CM_使用?00401BA1
00401B97 |. |E8 5B170000 call CM_使用?004032F7
00401B9C |. |E9 05000000 jmp CM_使用?00401BA6
00401BA1 |> \E8 0A1A0000 call CM_使用?004035B0
现在是不跳转,如果jnz跳转了,执行的就是00401BA1这个call,回车进去看看里面的代码:
004035B0 /$ 55 push ebp
004035B1 |. 8BEC mov ebp,esp
004035B3 |. 6A 00 push 0x0
004035B5 |. 68 54A24A00 push CM_使用?004AA254 ; 已注册版本,您可以无限次使用!
7.看到这里思路应该很清晰,爆破应该很直接了,jnz改jmp,成功变成已注册版本。
0x5 总结
1.易语言程序反调试,可以通过CreateToolhelp32Snap函数API断点来过。
2.易语言自校验程序可以通过打补丁,然后使用test edx,3通杀补丁找到真码。
3.软件的注册验证,启动的时候必然会校验,读写注册表,读写文件,或网络验证。
0x6 参考资料
1.玩玩破解,写给新人看(第十六集)
2.玩玩破解,写给新人看(第十七集)
3.玩玩破解,写给新人看(第十八集)
PS:善于总结,善于发现,找到分析问题的思路和解决问题的办法。虽然我现在还是零基础的小菜鸟一枚,也许学习逆向逆天改命我会失败,但也有着成功的可能,只要还有希望,就决不放弃!