【文章标题】: 破解的第一个软件
【文章作者】: windtrace
【软件名称】: 游戏助手
【软件大小】: 760K
【下载地址】:
http://www.live-share.com/files/145124/UChelpersetup.rar.html
【加壳方式】: 无
【保护方式】: 启动验证和注册码及使用次数限制
【编写语言】: Microsoft Visual C++ 5.0
【使用工具】: OD1.10
【操作平台】: XP
【软件介绍】: UC连连看、跳跳鼠外挂
【作者声明】: 破解的第一个软件,只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
这个软件比较简单,非常适合新手入门。
程序会在HKEY_LOCAL_MACHINE\SOFTWARE\sina\pass中建立相关数据,启动时检测相关健值并进行运算,结果正确则运行,
不对则弹出错误信息。未注册版有使用次数限制。
OD载入,点帮助,输入试验码78787878 点击“注册”,显示“注册码错误”。回到CPU窗口,查找字符串参考,没有相关
字串(其实在程序的rdata段里有该字符串的UNICODEO数据,而且程序执行过程中有过对该地址的压栈操作,不知为什么
OD没有列出,请指教)。试着下API断点吧,ctrl+n打开参考,在MessageBoxA下断(F2),返回CPU窗口,再次点击注册,
程序断在 5F4323C6
5F432397 C2 0800 retn 8
5F43239A > 55 push ebp
5F43239B 8BEC mov ebp, esp
5F43239D 83EC 08 sub esp, 8
5F4323A0 894D F8 mov [ebp-8], ecx
5F4323A3 837D 0C 00 cmp dword ptr [ebp+C], 0
5F4323A7 75 08 jnz short MFC42D.5F4323B1
5F4323A9 E8 4EB00400 call MFC42D.#1089
5F4323AE 8945 0C mov [ebp+C], eax
5F4323B1 8B45 10 mov eax, [ebp+10]
5F4323B4 50 push eax
5F4323B5 8B4D 0C mov ecx, [ebp+C]
5F4323B8 51 push ecx
5F4323B9 8B55 08 mov edx, [ebp+8]
5F4323BC 52 push edx ; 错误信息入栈
5F4323BD 8B4D F8 mov ecx, [ebp-8]
5F4323C0 E8 97130500 call MFC42D.#2995
5F4323C5 50 push eax
5F4323C6 FF15 38D94A5F call [<&USER32.MessageBoxA>] ; 显示注册错误
5F4323CC 8945 FC mov [ebp-4], eax
5F4323CF 8B45 FC mov eax, [ebp-4]
5F4323D2 8BE5 mov esp, ebp
5F4323D4 5D pop ebp
5F4323D5 C2 0C00 retn 0C
上面没有能跳过该API的跳转,所以继续向上分析,看到5F432397 C2 0800 retn 8
,断定其下面的代码应该是从某处跳过来的,去除刚才的断点换成在5F4323B9 处下断后再次点击
注册,程序被断下,看一下栈窗口"0012E004 0040174F 返回到 UCHelp.0040174F 来自 <jmp.&MFC42D.#3517>"
没错是这里了。再把刚刚的断点取消,在栈窗口 "UCHelp.0040174F 来自 <jmp.&MFC42D.#3517>"上按回车,来到
0040174A |. E8 39420000 call <jmp.&MFC42D.#3517> ; 刚刚调用messageboxa的call
0040174F |> \5F pop edi
00401750 |. 5E pop esi
00401751 |. 5B pop ebx
00401752 |. 83C4 60 add esp, 60
00401755 |. 3BEC cmp ebp, esp
00401757 |. E8 B4440000 call <jmp.&MSVCRTD._chkesp>
0040175C |. 8BE5 mov esp, ebp
0040175E |. 5D pop ebp
0040175F \. C3 retn
因为在调用call时程序会自动将EIP的下一条指令压栈,所以我们判断0040174A就是刚刚调用messageboxa的CALL,
继续向上找发现
004016A6 |. /0F85 8F000000 jnz UCHelp.0040173B ; 关健跳转
004016AC |. |8BF4 mov esi, esp
004016AE |. |6A 0A push 0A ; /radix = A (10.)
004016B0 |. |8D45 E8 lea eax, [ebp-18] ; |
004016B3 |. |50 push eax ; |string
004016B4 |. |8B4D E4 mov ecx, [ebp-1C] ; |
004016B7 |. |51 push ecx ; |value
004016B8 |. |FF15 18BA4100 call [<&MSVCRTD._itoa>] ; \_itoa
004016A6 指令处有个大的跳转,而且该指令跳过的部分调用过对注册表的操作,怀疑是关健CALL,于是在
00401666处下断,返回程序再点注册,断下
00401666 |. 6A 01 push 1
00401668 |. 8B4D FC mov ecx, [ebp-4]
0040166B |. E8 1E430000 call <jmp.&MFC42D.#5056> :开始怀疑为算法call,跟进无结果
00401670 |. 8B4D FC mov ecx, [ebp-4]
00401673 |. 8B91 00010000 mov edx, [ecx+100] ; 注册码入EDX
00401679 |. 8955 E4 mov [ebp-1C], edx ; EDX入栈 [0012E064]
0040167C |. 8B45 FC mov eax, [ebp-4]
0040167F |. 8B88 00010000 mov ecx, [eax+100] ; 注册码入ECX
00401685 81F1 37A4A001 xor ecx, 1A0A437 ; 关健计算,晕倒
0040168B |. 8B55 FC mov edx, [ebp-4] ; 特定的STACK地址入EDX
0040168E |. 898A 00010000 mov [edx+100], ecx ; 计算后的注册码入[0012ECD4]
00401694 |. 8B45 FC mov eax, [ebp-4]
00401697 |. 8B4D FC mov ecx, [ebp-4]
0040169A |. 8B90 00010000 mov edx, [eax+100] ; 计算后注册码入EDX
004016A0 |. 3B91 08010000 cmp edx, [ecx+108] ; 关健比较(计算后的注册码与变为整形的用户名)
004016A6 |. 0F85 8F000000 jnz UCHelp.0040173B ; 关健跳转
004016AC |. 8BF4 mov esi, esp
004016AE |. 6A 0A push 0A ; /radix = A (10.)
004016B0 |. 8D45 E8 lea eax, [ebp-18] ; |
004016B3 |. 50 push eax ; |string
0040166B处的CALL开始怀疑为算法CALL,跟进后一无所获,头大的要命于是从004016A0处着手分析,发现该指令是将转
为整型的认证码与栈中的另一数据做比较,用大脚趾都想的出一定是关健比较了。通过几次在上面代码下断分析
发现 0040167F一句是注册码入ECX,下面的一句将注册码与1A0A437异或即得出比较码,差点撞墙!!!
修改一下,将00401685的xor ecx, 1A0A437改为mov ecx, [eax+108] ,追几步就知道了,[eax+108]是认证码
F9运行,弹出"注册成功"。
还没完,因为程序在启动时会检查存放在注册表中的注册码,并再次验证。考虑到刚刚的几次下断,猜想程序开
始的验证一定还是那个 XOR R32 1A0A437,于是在CPU窗口按ctrl+B(二进制查找),输入37 A4 A0 01(注意数据在内存
中可是什么尾的“大大小小”存放的)回车,找到
00404561 |. 81F1 37A4A001 xor ecx, 1A0A437
00404567 |. 894D A0 mov [ebp-60], ecx
0040456A 8B55 A0 mov edx, [ebp-60] ; 计算后注册码转移 mov edx, [ebp-60]
0040456D |. 3B55 A4 cmp edx, [ebp-5C] ; 程序运行时关健比较
00404570 |. 0F84 A0020000 je UCHelp.00404816
用上面的方法,将0040456A改成mov edx, [ebp-5C]
右健\复制到可执行文件\所有修改 ,保存,大功告成。。。
问题:1、在程序的rdata段里有“注册码错误”字符串,而且程序执行过程中有过对该地址的压栈操作,为什么 OD没有列出
2、异或的逆向运算怎么做?我找不到注册码,呵呵
请指教
--------------------------------------------------------------------------------
【经验总结】
因为是新手,所以走了不走弯路,一共用了三个下午才搞定。程序比较简单,很适合新手熟悉一下操作。
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2007年01月26日 11:42:00
[课程]Android-CTF解题方法汇总!