吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 7602|回复: 81
收起左侧

[分享] 学破解第153天,《yyhd大佬的玩玩破解教程16-18集反调试、破解软件使用次数》学习

  [复制链接]
小菜鸟一枚 发表于 2021-11-5 08:50

学破解第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 [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掉即可,运行试试,成功过掉了反调试。

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 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,脱壳后运行程序,点登录,提示修改了代码。

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 [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,输入密码,成功:

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:[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,成功变成已注册版本。

https://z3.ax1x.com/2021/11/04/IVoLlD.png

0x5 总结

  1.易语言程序反调试,可以通过CreateToolhelp32Snap函数API断点来过。

  2.易语言自校验程序可以通过打补丁,然后使用test edx,3通杀补丁找到真码。

  3.软件的注册验证,启动的时候必然会校验,读写注册表,读写文件,或网络验证。

0x6 参考资料

  1.玩玩破解,写给新人看(第十六集)

  2.玩玩破解,写给新人看(第十七集)

  3.玩玩破解,写给新人看(第十八集)

  PS:善于总结,善于发现,找到分析问题的思路和解决问题的办法。虽然我现在还是零基础的小菜鸟一枚,也许学习逆向逆天改命我会失败,但也有着成功的可能,只要还有希望,就决不放弃!

免费评分

参与人数 23吾爱币 +21 热心值 +19 收起 理由
我爱你12 + 1 + 1 我很赞同!
zhu0574 + 1 + 1 用心讨论,共获提升!
chenerndong + 1 + 1 我很赞同!
zxyfy + 1 用心讨论,共获提升!
mm950811 + 1 + 1 厉害&amp;amp;#128077;
czdhk + 1 我很赞同!
helloworld0069 + 1 + 1 热心回复!
丨点儿 + 1 + 1 用心讨论,共获提升!
marlborogolo + 1 + 1 谢谢@Thanks!
CPip + 1 我很赞同!
hydswcxx + 2 + 1 热心回复!
小蘑菇他哥 + 1 + 1 我很赞同!
3303232005 + 1 + 1 热心回复!
yoslimshady + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
yt13299374849 + 1 + 1 热心回复!
fjzry + 1 + 1 我很赞同!
elevo + 1 + 1 我很赞同!
祥林love + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
有点低调 + 1 + 1 用心讨论,共获提升!
司空节糙 + 1 我很赞同!
 + 1 + 1 用心讨论,共获提升!
Atlantis908 + 1 我很赞同!
青涩年华 + 1 我很赞同!

查看全部评分

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

展大锤 发表于 2021-11-7 22:22
CreateToolhelp32Snapshot        可用于进程判断
IsDebuggerPresent                    确定调用进程是否由用户模式的调试器调试

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
小菜鸟一枚 + 1 + 1 热心回复!

查看全部评分

xiao15939987 发表于 2021-11-7 18:04
有句话是这么说的,楼主你发这些不是炫耀就是打着教新手的幌子炫耀哈哈,这些东西老手看不上,新手你也最好别给他们看这些,有句老话这么说的,学习一件事没有任何人教你,靠的是这个人的觉悟和恒心,我补充下  兴趣-耐心-悟性 决定你在任何领域技术的深度,新手教学都不要出,让他们自己去学 去积累 才是他们自己的知识
Atlantis908 发表于 2021-11-5 08:55
colinjian22 发表于 2021-11-5 09:19
看不懂汇编,没法学。。
wqipk 发表于 2021-11-5 09:19
很棒,感谢分享.
乔木自燃 发表于 2021-11-5 09:27
很棒,感谢分享.
chentest 发表于 2021-11-5 09:33
汇编底子确实薄弱  很难看懂
头像被屏蔽
xtkj4382 发表于 2021-11-5 09:40
提示: 作者被禁止或删除 内容自动屏蔽
zzhmzj1226 发表于 2021-11-5 09:54
g感谢分享,学习一下
QingYi. 发表于 2021-11-5 09:58
扮豬吃老虎
Sekios 发表于 2021-11-5 10:00
很有精神
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-16 00:26

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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