逆向破解之160个CrackMe —— 010-011
CrackMe —— 010
160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合一共160个待逆向破解的程序
CrackMe:它们都是一些公开给别人尝试破解的小程序,制作 crackme 的人可能是程序员,想测试一下自己的软件保护技术,也可能是一位 cracker,想挑战一下其它 cracker 的破解实力,也可能是一些正在学习破解的人,自己编一些小程序给自己破。
来源 <-点击查看
编号 | 作者 | 保护方式 |
010 | Andrénalin3 | Serial |
011 | Andrénalin4 | Serial |
工具
x32dbg
VB Decompiler Pro
吾爱破解内存补丁生成器1.0
开始破解之旅
ON.1
首先使用x32dbg打开程序搜索字符串
我们看到有一个 “RiCHTiG !" 的字符串,从字面上猜测应该是输入正确的Key之后所跳转的地方
我们点进进入来地址,向上翻看,看到最近的一个跳转,跳过了正确跳转的提示地方,我们在此下断点
F9运行,在输入框内输入任意文字,停在了我们的断点处,将寄存器ZF值设置为0,F9运行,发现弹出正确提示框
首先我们使用DelphiDecompiler 打开010号程序
点击左侧边框中的Code -> Form1 -> Command1_Click
右侧显示出了源代码
我们分析源代码可得
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | loc_00401EC2: var_58 = Text1.Text 取输入框文本 loc_00401EFA: var_44 = var_58 loc_00401F56: For var_24 = 1 To Len(var_44) Step 1 循环输入框文本长度 loc_00401F68: loc_00401F6A: If var_104 = 0 Then GoTo loc_0040202B loc_00401FA3: var_58 = CStr(Mid(var_44, CLng(var_24), 1)) 取变量var_24个长度的字符串 loc_00401FB0: Asc(var_58) = Asc(var_58) + 000Ah 将变量进行ascii运算+000AH loc_00401FC4: var_84 = Chr$(Asc(var_58)+000Ah) 将变量进行ascii运算+000AH 将结果转化为字符串 loc_00401FE6: var_9C = var_34 & Chr$(Asc(var_58)+000Ah) 将变量进行ascii运算+000AH 将结果转化为字符串 同时和var_34变量相加 loc_00401FED: var_34 = var_9C loc_00402020: Next var_24 loc_00402026: GoTo loc_00401F68 loc_0040202B: 'Referenced from: 00401F6A loc_00402053: If (var_34 = "kXy^rO|*yXo*m\kMuOn*+" ) = 0 Then GoTo loc_00402119 比较如何变量var_34等于 kXy^rO|*yXo*m\kMuOn*+ 进行跳转 |
ON.2
爆破方式破解
1 2 3 4 5 6 7 8 9 10 11 12 13 | 00402050 | 66:85C0 | test ax,ax | 00402053 | 0F84 C0000000 | je andrénalin.3.402119 | 将JE 修改为NOP 00402059 | FF15 6C414000 | call dword ptr ds:[<&rtcBeep>] | 0040205F | 8B1D 94414000 | mov ebx,dword ptr ds:[<&__vbaVarDup>] | 00402065 | B9 0A000000 | mov ecx,0xA | A: '\n' 0040206A | B8 04000280 | mov eax,0x80020004 | 0040206F | 898D 64FFFFFF | mov dword ptr ss:[ebp-0x9C],ecx | [ebp-9C]: "梵" 00402075 | 898D 74FFFFFF | mov dword ptr ss:[ebp-0x8C],ecx | 0040207B | 8D95 44FFFFFF | lea edx,dword ptr ss:[ebp-0xBC] | [ebp-BC]: "梵" 00402081 | 8D4D 84 | lea ecx,dword ptr ss:[ebp-0x7C] | 00402084 | 8985 6CFFFFFF | mov dword ptr ss:[ebp-0x94],eax | 0040208A | 8985 7CFFFFFF | mov dword ptr ss:[ebp-0x84],eax | 00402090 | C785 4CFFFFFF 281B4000 | mov dword ptr ss:[ebp-0xB4],andrénalin.3.401B28 | 401B28:L "RiCHTiG !" |
我们将00402053地址修改为NOP保存,即可爆破成功
内存补丁方式
我们打开内存补丁生成器,在内存地址中填入00402053 ,修改指令处填写0F84 ,原指令为84对应汇编语言为je,jne为85
将程序拖入内存补丁程序内,点击添加指令,再点击导出补丁即可
打开010号程序,打开生成的内存补丁程序,点击开始补丁,在输入框内输入任意数据,点击OK,破解成功
CrackMe —— 011
ON.1
首先使用 VB Decompiler Pro程序打开011号程序
点击Code -> Form1
我们看到下面有4个Timer函数,我们点击一个查看反编译代码
经过分析可以得知计算方式
循环:
向前取第N为计算ascii 值+从后取一位转换为数值型
计算其16进制
字符串相加其结果
循环完毕
对比判断Key
以上为伪代码
我们可以得知最后两位为数值型
我们可以逆向其已知Key
拿 0817E747D7A7D7C7F82836D74747A7F7E7B7C7D826D817E7B7C 举例,x32dbg搜索字符串会搜索到很多类似的字符串,仔细观察发现其中会充满RR之类的字符无法转成16进制,固寻找一个正确的字符串
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | data = '0817E747D7A7D7C7F82836D74747A7F7E7B7C7D826D817E7B7C' a = [ '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' , '0' , '*' , '#' ] k = 0 for i in a: for j in a: if j in [ '*' , '#' ] or i in [ '*' , '#' ]: 因为 * # 字符无法转换为 10 进制所以跳过 continue if ord (i) + ( 10 * int (i) + int (j)) = = int (data[ 1 : 3 ], 16 ): k = 10 * int (i) + int (j) print ( '最后一位为:' , k) break password = '' for i in range ( 1 , len (data), 2 ): password = password + chr ( int ( str (data[i:i + 2 ]), 16 ) - k) print (password) |
最后计算出结果为 74*3032589#**0541238#7412
我们填入输入框内,提示我们注册成功
ON.2
搜索字符串,找到正确的注册字符,地址为0040D0CC,进入该地址
1 2 3 4 5 6 7 8 | 0040D0AE | 66 : 85C0 | test ax,ax | 0040D0B1 | 74 4C | je andrénalin. 4.40D0FF | 0040D0B3 | 8B45 08 | mov eax,dword ptr ss:[ebp + 0x8 ] | 0040D0B6 | 50 | push eax | 0040D0B7 | 8B10 | mov edx,dword ptr ds:[eax] | edx:EntryPoint 0040D0B9 | FF92 38030000 | call dword ptr ds:[edx + 0x338 ] | 0040D0BF | 50 | push eax | 0040D0C0 | 8D45 AC | lea eax,dword ptr ss:[ebp - 0x54 ] | |
看到最近的跳转处0040D0B1,此处跳转会经过我们的正确代码,将其改为NOP
此时回到程序界面发现程序已经注册成功
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?