目的:自己第一次写点东西,从这个开始我也从明码查找开始向算法方式转变
目标:找注册码
目标软件: BT 发动机动机3.0
难度:容易
声明:因为网上已有注册码,所以这里才写出软件的名字
工具软件: TRW、W32Dasm黄金版
:00404180 lea eax, dword ptr [ebp-04]=====>断到这里,取地址
:00404183 mov eax, dword ptr [eax]========>这里eax放入种子数
:00404185 call 004801C8 ==========>数值计算,重要,进入 (1)
:0040418A mov dword ptr [ebp-64], eax ====>eax为计算后值,假设为X,放入[ebp-64]
:0040418D dec [edi+1C]
:00404190 lea eax, dword ptr [ebp-04]
:00404193 mov edx, 00000002
:00404198 call 00505C90
:0040419D mov [edi+10], 0008
:004041A3 mov [edi+10], 0020
:004041A9 xor ecx, ecx
:004041AB mov dword ptr [ebp-08], ecx
:004041AE lea edx, dword ptr [ebp-08]
:004041B1 inc [edi+1C]
:004041B4 mov eax, dword ptr [ebx+00000310]
:004041BA call 004D7CF0
:004041BF lea eax, dword ptr [ebp-08]=======>取注册码地址
:004041C2 mov eax, dword 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 eax, dword ptr [ebp-08]
:004041D2 mov edx, 00000002
:004041D7 call 00505C90
:004041DC mov [edi+10], 0008
:004041E2 mov ecx, 00015B33 =====>将常数十六进制15b33 放入ecx
:004041E7 sub ecx, dword ptr [ebp-64] =======>然后减去X
:004041EA mov eax, ecx =========>放到eax里
:004041EC add eax, eax ======>eax=eax+eax
:004041EE lea eax, dword ptr [eax+4*eax] ======>eax=eax+eax*4
:004041F1 add eax, FFFFFFDF ======>eax=eax+(-21)
:004041F4 cmp eax, dword 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 al, al
:00401D40 0F84EA000000 je 00401E30 =====》如果,你上面第一部分已经通过那这里不会跳
:00401D46 8BC3 mov eax, ebx
:00401D48 E8CF0F0000 call 00402D1C动=====》这里面就是第二部分验证啦!进入
:00401D4D 84C0 test al, al
:00401D4F 0F84DB000000 je 00401E30
===========================================================================================
* Referenced by a CALL at Addresses:
|:00401D48 , :00402274
|
:00402D1C 55 push ebp ==========》来到这里,然后跟踪
:00402D1D 8BEC mov ebp, esp
:00402D1F 83C48C add esp, FFFFFF8C
~~~~~
~~~~略~~~~
~~~~~
* Possible StringData Ref from Data Obj ->"reg_code" =======》上面通过一系列的注册表判断和读取
|
:00402FFD BAC2A45100 mov edx, 0051A4C2
:00403002 8D45C4 lea eax, dword ptr [ebp-3C]
:00403005 E8262B1000 call 00505B30
:0040300A FF461C inc [esi+1C]
:0040300D 8B10 mov edx, dword ptr [eax]
:0040300F 8BC3 mov eax, ebx
:00403011 E836A60700 call 0047D64C
:00403016 89458C mov dword ptr [ebp-74], eax
:00403019 FF4E1C dec [esi+1C]
:0040301C 8D45C4 lea eax, dword ptr [ebp-3C]
:0040301F BA02000000 mov edx, 00000002
:00403024 E8672C1000 call 00505C90
:00403029 8B4D8C mov ecx, dword ptr [ebp-74] -====》最后把Y放入ecx,X放入edi
:0040302C 2BCF sub ecx, edi =========>然后用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日
学生 未日独留
写于辽宁的某个地方^_^
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课