首页
社区
课程
招聘
破解的第一个软件[原创]
发表于: 2007-1-26 15:25 7026

破解的第一个软件[原创]

2007-1-26 15:25
7026
【文章标题】: 破解的第一个软件
【文章作者】: 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

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
up
2007-1-26 15:29
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
都已经模式化了
2007-1-26 15:30
0
雪    币: 220
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
(a XOR b) XOR b =a

注册验证过程:
if( (atol(szSN) ^ 0x1A0A437 == atol(机器码))
  注册成功;
else
  注册失败;
2007-1-26 15:43
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
穿自己的鞋,让别人走路去吧
2007-4-11 09:53
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
呵呵,我是初次啊,自己试一试
2007-4-11 13:06
0
雪    币: 144
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
不错的分析:)
2007-4-11 13:28
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
老大也来了,我也来顶一个
2007-4-11 13:41
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
支持,up,强,支持了,再支持,顶上
2007-4-11 16:37
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
看不懂,纯支持下,辛苦了
2007-4-11 22:29
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
纯支持下,辛苦了
2007-4-11 22:30
0
雪    币: 200
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
很有启发,谢谢楼主!
2007-4-12 12:54
0
游客
登录 | 注册 方可回帖
返回
//