乐于分享
好东西不私藏

软件逆向零基础新手入门实例33-难度一颗星手把手教你分析逆向找出注册码

软件逆向零基础新手入门实例33-难度一颗星手把手教你分析逆向找出注册码

免责声明

本文档所有内容仅供安全研究、学术交流与技术学习使用,严禁用于任何未经授权的逆向破解、网络攻击、隐私窃取、恶意软件开发。使用者应确保已获得目标软件权利人的合法授权并自行承担因使用本文档内容所产生的一切法律责任与后果,作者不对任何直接或间接损害承担任何责任,继续阅读即视为您已知悉并同意上述全部条款。


    继续学习软件逆向入门技术,本篇学习的软件也是一个crackeme,非常的简单。难度1颗星。掌握了分析的方法,你也可以单独逆向分析完。
软件的要求不是破解而是逆向出它的注册码,上图输入假的注册码直接提示错误消息。
    有提示,就简单了。最好用的逆向方法,就是根据错误信息去查找它的字符串找关键位置了。    
    打开调试器 Ollydbg.exe,把程序拖入F9运行起来。打开内存窗口ALT+M,找到程序的CODE段,右键反汇编窗口查看。
到反汇编窗口,查找字符串。如图:
根据输入注册码后的提示字符串,进行搜索CTRL+F
搜索到了关键位置,双击查看反汇编代码。
可以看到有个跳转,跳到错误字符的位置。在最上面进行下断点。
下好断点后, 输入假码,程序断下后进行分析。
00401191    628           push 0x2800401193    68 A6204000     push phox_2.004020A6                     ; ASCII "it0365"00401198    FF35 4C204000   push dword ptr ds:[0x40204C]0040119E    E8 00010000     call <jmp.&USER32.GetWindowTextA>004011A3    FF35 44204000   push dword ptr ds:[0x402044]             ; phox_2.00400000004011A9    E8 5D000000     call phox_2.0040120B004011AE    83F8 01         cmp eax,0x1004011B1    75 1E           jnz Xphox_2.004011D1
这里注意看4011A9,这个CALL应该就是关键CALL返回后可以看到EAX和1在做比较。如果不为1就是失败。为1 就是成功。大概猜测CALL就是计算注册码的关键算法CALL。 我们F7进入分析。
0040121D    33DB            xor ebx,ebx0040121F    33D2            xor edx,edx00401221    8A18            mov bl,byte ptr ds:[eax]00401223    C1C3 08         rol ebx,0x800401226    03D3            add edx,ebx00401228    40              inc eax00401229    8038 00         cmp byte ptr ds:[eax],0x00040122C  ^ 75 F3           jnz Xphox_2.00401221
进入CALL后,看到这里的关键算法。它把注册码的值右移8位进行累加。
0040122E    52              push edx0040122F    68 54204000     push phox_2.00402054                     ; %lX00401234    68 BF204000     push phox_2.004020BF                     ; ASCII "4177AC0D"00401239    E8 8F000000     call <jmp.&USER32.wsprintfA>
段代码把累加的数值转成了字符
0040123E    BB BF204000     mov ebx,phox_2.004020BF                  ; ASCII "4177AC0D"00401243    80338         cmp byte ptr ds:[ebx],0x3800401246    75 35           jnz Xphox_2.0040127D00401248    80701 44      cmp byte ptr ds:[ebx+0x1],0x440040124C    75 2F           jnz Xphox_2.0040127D0040124E    80702 43      cmp byte ptr ds:[ebx+0x2],0x4300401252    75 29           jnz Xphox_2.0040127D00401254    80703 41      cmp byte ptr ds:[ebx+0x3],0x4100401258    75 23           jnz Xphox_2.0040127D0040125A    80704 46      cmp byte ptr ds:[ebx+0x4],0x460040125E    75 1D           jnz Xphox_2.0040127D00401260    80705 33      cmp byte ptr ds:[ebx+0x5],0x3300401264    75 17           jnz Xphox_2.0040127D00401266    80706 36      cmp byte ptr ds:[ebx+0x6],0x360040126A    75 11           jnz Xphox_2.0040127D0040126C    80707 38      cmp byte ptr ds:[ebx+0x7],0x3800401270    75 0B           jnz Xphox_2.0040127D00401272    B8 01000000     mov eax,0x1
这段汇编代码就非常简单了,把上面累加的值转成字符和固定数值做比较。最后面一个代码给EAX赋值1. 这里就逆向到了它的注册码。
004020D0                          38 44 43 41 46 33 36 38          8DCAF368
注册码是固定的:“8DCAF368”,但是我们输入这个字符。还是提示错误。大家有没发现什么问题?原因在于上面它做了运算和转换,得到这个字符后比较的。
    那么就需要逆向分析出这个字符未转换和运算前的值。具体逆向还原如下:
    前面有个对字符右移相加的运算。它是相加,那么我们就根据它的算法反着来,做相减运算。
逆向流程如下
1. 算法中把字符右移,我们就把字符反向取,变成:68f3ca8d
2.算法中第一位字符,未参与运算。就是68
3.   第二位的值就是:8D-68=25
4.第三位的值就是:CA-8D=3D
5.第四位的值就是:F3-CA=29
在数值转成字符方便输入变成
00402109     68 25 329 00 00 00                           h%=)...
得到了正确的注册码:h%=)
输入后,软件注册码正确。
这样一个软件的注册码就分析出来了。
获取文中软件可关注后回复:练习样品 (33.rar)
如果喜欢这类的技术文章,请关注喜欢推荐 ♥  后续为大家更新更多实用技术文章。