学破解第153天,《yyhd大佬的玩玩破解教程16-18集反调试、破解软件使用次数》学习
## 学破解第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载入被检测了。
!(https://z3.ax1x.com/2021/11/03/IEi8mt.png)
  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 ,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 ,eax
0040113C|.8D45 FC lea eax,
0040113F|.50 push eax
00401140|.E8 90170000 call 反调试_?004028D5
eax=00694E98, (ASCII "你正在用OD调戏我,我要报警!")
```
  4.向上走发现004010BD这个jnz跳转到检测OD提示的地方,将其nop掉即可,运行试试,成功过掉了反调试。
!(https://z3.ax1x.com/2021/11/03/IEyg91.png)
### 0x3 第十七集 自校验
  1.将程序载入OD,提示加壳了,那么使用查壳工具看看,是什么壳:
!(https://z3.ax1x.com/2021/11/03/IE2sr6.png)
  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 00000000mov eax,dword ptr fs:
004873F6 50 push eax
004873F7 64:8925 0000000>mov dword ptr fs:,esp
```
  3.win7脱壳有点问题,脱完打不开了,这里我使用论坛爱盘的UPX脱壳工具:(https://down.52pojie.cn/Tools/Unpackers/UPX%20Unpacker.zip),脱壳后运行程序,点登录,提示修改了代码。
!(https://z3.ax1x.com/2021/11/03/IVpAte.png)
  4.说明修改了程序会有检测,例如自校验功能,CRC校验,文件大小检测等等,通常压缩壳会缩小程序体积,我们脱壳后程序体积会变大,搜索字符串看到提示,然后段首直接retn返回,即可过文件大小校验:
```
0040345D|.55 push ebp
0040345E|.8BEC mov ebp,esp
00403460|.81EC 04000000 sub esp,0x4
00403466|.817D 08 00E40>cmp ,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:,eax
00403D85|.B8 11BA4A00 mov eax,1.004ABA11 ;52pojie
00403D8A|.8945 FC mov ,eax
00403D8D|.8D45 FC lea eax,
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: ;堆栈 ss:=0066A6D0, (ASCII "123")
0040229E|.8B4C24 08 mov ecx,dword ptr ss: ;堆栈 ss:=00667168, (ASCII "ACB57D71107FOK16888")
004022A2|.85D2 test edx,edx ;1.004ABA0C
004022A4|.75 0D jnz short 1.004022B3
```
  7.所以密码就是ACB57D71107FOK16888,输入密码,成功:
!(https://z3.ax1x.com/2021/11/03/IVA0MQ.png)
  8.借用作者原话:如果是比较文件大小的反调试程序,当你用GetFileSize函数断不了,可以用FindFirstFile函数下断点试试看。
  9.如果是程序的自身校验,我们还可以使用补丁工具,带壳打补丁,避免触发程序的NAG。
### 0x4 破解软件使用次数
  1.同样把程序下载下来,看到有未注册版本,你还可以使用xx次。
!(https://z3.ax1x.com/2021/11/04/IV7pDJ.png)
  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: ; |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 ;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,成功变成已注册版本。
!(https://z3.ax1x.com/2021/11/04/IVoLlD.png)
### 0x5 总结
  1.易语言程序反调试,可以通过CreateToolhelp32Snap函数API断点来过。
  2.易语言自校验程序可以通过打补丁,然后使用test edx,3通杀补丁找到真码。
  3.软件的注册验证,启动的时候必然会校验,读写注册表,读写文件,或网络验证。
### 0x6 参考资料
  1.[玩玩破解,写给新人看(第十六集)](https://www.52pojie.cn/thread-1365114-1-1.html)
  2.[玩玩破解,写给新人看(第十七集)](https://www.52pojie.cn/thread-1366037-1-1.html)
  3.[玩玩破解,写给新人看(第十八集)](https://www.52pojie.cn/thread-1366869-1-1.html)
  **PS:善于总结,善于发现,找到分析问题的思路和解决问题的办法。虽然我现在还是零基础的小菜鸟一枚,也许学习逆向逆天改命我会失败,但也有着成功的可能,只要还有希望,就决不放弃!** CreateToolhelp32Snapshot 可用于进程判断
IsDebuggerPresent 确定调用进程是否由用户模式的调试器调试 有句话是这么说的,楼主你发这些不是炫耀就是打着教新手的幌子炫耀哈哈,这些东西老手看不上,新手你也最好别给他们看这些,有句老话这么说的,学习一件事没有任何人教你,靠的是这个人的觉悟和恒心,我补充下兴趣-耐心-悟性 决定你在任何领域技术的深度,新手教学都不要出,让他们自己去学 去积累 才是他们自己的知识 来咯来咯,沙发 看不懂汇编,没法学。。 很棒,感谢分享. 很棒,感谢分享. 汇编底子确实薄弱很难看懂 g感谢分享,学习一下 扮豬吃老虎 很有精神