• 标 题:我的第一篇“小菜”之作
  • 作 者:未日独留
  • 时 间:004-08-11,20:34
  • 链 接:http://bbs.pediy.com

目的:自己第一次写点东西,从这个开始我也从明码查找开始向算法方式转变
 目标:找注册码
 目标软件: BT 发动机动机3.0 
 难度:容易
 声明:因为网上已有注册码,所以这里才写出软件的名字
 工具软件: TRW、W32Dasm黄金版



:00404180    lea eaxdword ptr [ebp-04]=====>断到这里,取地址
:00404183   mov eaxdword ptr [eax]========>这里eax放入种子数
:00404185   call 004801C8                   ==========>数值计算,重要,进入  (1)     
:0040418A   mov dword ptr [ebp-64], eax   ====>eax为计算后值,假设为X,放入[ebp-64]
:0040418D   dec [edi+1C]
:00404190   lea eaxdword ptr [ebp-04]
:00404193   mov edx, 00000002
:00404198   call 00505C90
:0040419D   mov [edi+10], 0008
:004041A3   mov [edi+10], 0020
:004041A9   xor ecxecx
:004041AB   mov dword ptr [ebp-08], ecx
:004041AE   lea edxdword ptr [ebp-08]
:004041B1   inc [edi+1C]
:004041B4   mov eaxdword ptr [ebx+00000310]
:004041BA   call 004D7CF0
:004041BF   lea eaxdword ptr [ebp-08]=======>取注册码地址
:004041C2   mov eaxdword ptr [eax]   ===========>将注册码放入eax
:004041C4   call 004801C8                     数值计算,重要,进入,(2)/*算法同(1)*/
:004041C9   mov dword ptr [ebp-68], eax     ========>   eax计算后的值,假设为Y,放入[ebp-68]
:004041CC   dec [edi+1C]
:004041CF   lea eaxdword ptr [ebp-08]
:004041D2   mov edx, 00000002
:004041D7   call 00505C90
:004041DC   mov [edi+10], 0008
:004041E2   mov ecx, 00015B33               =====>将常数十六进制15b33 放入ecx
:004041E7   sub ecxdword ptr [ebp-64]  =======>然后减去X
:004041EA   mov eaxecx              =========>放到eax里
:004041EC   add eaxeax             ======>eax=eax+eax
:004041EE   lea eaxdword ptr [eax+4*eax] ======>eax=eax+eax*4  
:004041F1   add eax, FFFFFFDF                 ======>eax=eax+(-21)
:004041F4   cmp eaxdword ptr [ebp-68]  ======>用结果同Y比较,相同则注册成功(假成功^_^)
:004041F7   jne 00404472            ==========>后面是写注册表和显示注册成功,和除去注册按钮
================================》第一部分结束,但虽然显示是注册用户,但还是有下面的提示出现
第二部分,先用W32Dasm 反汇编,然后查找,“对不起,对不起,只有注册用户才能使用优化功能..."
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00401D40(C), :00401D4F(C)               ==============》知道有00401d40,和00401d4f跳到这里
|
:00401E30 66C745DC2C00            mov [ebp-24], 002C

* Possible StringData Ref from Data Obj ->"对不起,只有注册用户才能使用优化功能..."
                                  |
:00401E36 BA55A25100              mov edx, 0051A255
查打上面两个地方
:00401D39 E82E010000              call 00401E6C  =========》进入,跟踪发现只是重复第一部分
:00401D3E 84C0                    test alal
:00401D40 0F84EA000000            je 00401E30    =====》如果,你上面第一部分已经通过那这里不会跳
:00401D46 8BC3                    mov eaxebx
:00401D48 E8CF0F0000              call 00402D1C动=====》这里面就是第二部分验证啦!进入
:00401D4D 84C0                    test alal
:00401D4F 0F84DB000000            je 00401E30
===========================================================================================
* Referenced by a CALL at Addresses:
|:00401D48   , :00402274   
|
:00402D1C 55                      push ebp               ==========》来到这里,然后跟踪
:00402D1D 8BEC                    mov ebpesp
:00402D1F 83C48C                  add esp, FFFFFF8C
~~~~~   
~~~~略~~~~
~~~~~
* Possible StringData Ref from Data Obj ->"reg_code"    =======》上面通过一系列的注册表判断和读取                                                                 
                                  |
:00402FFD BAC2A45100              mov edx, 0051A4C2
:00403002 8D45C4                  lea eaxdword ptr [ebp-3C]
:00403005 E8262B1000              call 00505B30
:0040300A FF461C                  inc [esi+1C]
:0040300D 8B10                    mov edxdword ptr [eax]
:0040300F 8BC3                    mov eaxebx
:00403011 E836A60700              call 0047D64C
:00403016 89458C                  mov dword ptr [ebp-74], eax
:00403019 FF4E1C                  dec [esi+1C]
:0040301C 8D45C4                  lea eaxdword ptr [ebp-3C]
:0040301F BA02000000              mov edx, 00000002
:00403024 E8672C1000              call 00505C90
:00403029 8B4D8C                  mov ecxdword ptr [ebp-74]  -====》最后把Y放入ecx,X放入edi
:0040302C 2BCF                    sub ecxedi         =========>然后用Y-X,结果放到ecx
:0040302E 81F9784B0900            cmp ecx, 00094B78     =======>同这个常数94b78比较
:00403034 753B                    jne 00403071        ======》相同,就可运行啦!


总结:

第一部分  
种子数转换成十六进制数
假设为abcde
那么结果等于
(A 为十六进制的A,十进制的10)
X=(((a*A+b)*A+c)*A+d)*A+e
注册码的转换
Y=.........同种子数一样
验证
(15b33-X)*A-21=B
第二部分
验证
Y-X=94b78
 
看上面两个验证公试,就知道可以列一个二元一次方程,X、Y唯一,可解得X=634F,Y=9AEC7

最后逆算成abcde的方法很简单,把X和Y用计算器转换成十进制就可啦

感谢:
       看雪老大创造的良好学习环境
       版主们的敬业,如:fly等偶象            
       DB老师的教导!
       心如止水(不是搞破解的,不过是个刷三星手机的高手QQ:8362598)
       还有广大在这里和我一起成长的菜鸟们

备注:上面的文章,一定有写的不对的地方,谢谢强人、牛人们指教,改正!向你们致敬!!
      还有,谁愿意做我的老师,自学语言累啊!
                                                         

                                                      2004年8月11日
                                                   学生  未日独留

                                                写于辽宁的某个地方^_^