既然大家这么希望看到我的破文,我就出下丑吧 ,我是一菜鸟,若有不足或错误之处,希望大家批评指证,本人也将虚心接受。
1、运行KGMe,发现已经有机器码了,要求我们输入CODE,随便输入"abcde",出现"please input your Number!的窗口,说明程序要求我们输入数字!
2、PEID查壳,发现为Borland Delphi 6.0 - 7.0,DeDe载入!找到Register对应按钮起始位置为: 00467C30
3、OD载入,CTR+G直接到00467C30处下断,F9运行,输入123456789,点击断下,开始分析!
00467C6C |. 8B45 FC mov eax, dword ptr [ebp-4] ; 取假码
00467C6F |. E8 6CB3F9FF call 00402FE0 ; 将假码转化为浮点数123456789.0
00467C74 |. DD5D F0 fstp qword ptr [ebp-10] ; 将假码保存在[EBP-10]中
00467C77 |. 9B wait
00467C78 |. 837D E4 00 cmp dword ptr [ebp-1C], 0
00467C7C |. 0F85 D0000000 jnz 00467D52
00467C82 |. 8D55 E0 lea edx, dword ptr [ebp-20]
00467C85 |. 8B83 00030000 mov eax, dword ptr [ebx+300]
00467C8B |. E8 B0B0FCFF call 00432D40
00467C90 |. 8B45 E0 mov eax, dword ptr [ebp-20] ; 取机器码
00467C93 |. E8 F81AFAFF call 00409790 ; 将机器码转为浮点数
00467C98 |. 83C4 F8 add esp, -8
00467C9B |. DD1C24 fstp qword ptr [esp]
00467C9E |. 9B wait
00467C9F |. E8 D0FCFFFF call 00467974 ; 此处为机器码处理部分,F7进入
进入后来到这里:
00467974 /$ 55 push ebp
00467975 |. 8BEC mov ebp, esp
00467977 |. 83C4 DC add esp, -24
0046797A |. 33C0 xor eax, eax
0046797C |. 8945 EC mov dword ptr [ebp-14], eax
0046797F |. 8945 E8 mov dword ptr [ebp-18], eax
00467982 |. 8945 DC mov dword ptr [ebp-24], eax
前面是进行一些变量的初始化工作,继续向下看:
00467993 |. DD45 08 fld qword ptr [ebp+8] ; 加载机器码
00467996 |. D825 407A4600 fsub dword ptr [467A40] ; 机器码-常数9527.0
0046799C |. DD5D 08 fstp qword ptr [ebp+8] ; 保存差
0046799F |. 9B wait
004679A0 |. DD45 08 fld qword ptr [ebp+8] ; 加载差
004679A3 |. D835 447A4600 fdiv dword ptr [467A44] ; 差除以常数139.0,即(机器码- 9527.0)/139.0
004679A9 |. DD5D F0 fstp qword ptr [ebp-10] ; 保存结果到[EBP-10]
004679AC |. 9B wait
004679AD |. 8D45 E8 lea eax, dword ptr [ebp-18]
004679B0 |. 50 push eax ; /Arg1
004679B1 |. 0FB705 20BC46>movzx eax, word ptr [46BC20] ; |EAX=0D79h=十进制2009
004679B8 |. 8945 E0 mov dword ptr [ebp-20], eax ; |
004679BB |. C645 E4 00 mov byte ptr [ebp-1C], 0 ; |
004679BF |. 8D55 E0 lea edx, dword ptr [ebp-20] ; |
004679C2 |. 33C9 xor ecx, ecx ; |
004679C4 |. A1 08BC4600 mov eax, dword ptr [46BC08] ; |"%d"
004679C9 |. E8 2E16FAFF call 00408FFC ; \KGMe.00408FFC
004679CE |. FF75 E8 push dword ptr [ebp-18] ; 将数字2009转化为字串"2009"并入栈
004679D1 |. FF35 04BC4600 push dword ptr [46BC04] ; 月份字串"03"
004679D7 |. DD05 FCBB4600 fld qword ptr [46BBFC] ; 保存当前日期-1的数字
004679DD |. 83C4 F4 add esp, -0C
004679E0 |. DB3C24 fstp tbyte ptr [esp] ; |
004679E3 |. 9B wait ; |
004679E4 |. 8D45 DC lea eax, dword ptr [ebp-24] ; |
004679E7 |. E8 441DFAFF call 00409730 ; \KGMe.00409730
004679EC |. FF75 DC push dword ptr [ebp-24]
004679EF |. 8D45 EC lea eax, dword ptr [ebp-14]
004679F2 |. BA 03000000 mov edx, 3
004679F7 |. E8 A4CCF9FF call 004046A0 ; 计算,取当前日期-1字串"2009031"
004679FC |. 8B45 EC mov eax, dword ptr [ebp-14] ; EAX=当前日期-1字串
004679FF |. E8 8C1DFAFF call 00409790 ; 将字串转化为浮点数,2009031.0
00467A04 |. DC45 F0 fadd qword ptr [ebp-10] ; (机器码-9527.0)/139.0+当前日期-1
00467A07 |. DD5D F8 fstp qword ptr [ebp-8] ; 保存上面计算结果=10753849.971223020920
00467A0A |. 9B wait
00467A0B |. 33C0 xor eax, eax
00467A0D |. 5A pop edx
00467A0E |. 59 pop ecx
00467A0F |. 59 pop ecx
00467A10 |. 64:8910 mov dword ptr fs:[eax], edx
00467A13 |. 68 357A4600 push 00467A35
00467A18 |> 8D45 DC lea eax, dword ptr [ebp-24]
00467A1B |. E8 00C9F9FF call 00404320
00467A20 |. 8D45 E8 lea eax, dword ptr [ebp-18]
00467A23 |. BA 02000000 mov edx, 2
00467A28 |. E8 17C9F9FF call 00404344
00467A2D \. C3 retn
00467A2E .^ E9 C9C2F9FF jmp 00403CFC
00467A33 .^ EB E3 jmp short 00467A18
00467A35 . DD45 F8 fld qword ptr [ebp-8] ; 将机器码计算结果载入
00467A38 . 8BE5 mov esp, ebp
00467A3A . 5D pop ebp
00467A3B . C2 0800 retn 8
到这里,我们就知道机器码的计算方法是:(机器码-9527.0)/139.0+当前日期-1,然后走出此CALL,继续下面分析:
......
00467C9F |. E8 D0FCFFFF call 00467974 ; 此处为机器码处理部分,F7进入
00467CA4 |. DD5D E8 fstp qword ptr [ebp-18] ; 将机器码计算结果保存到[EBP-18]中
00467CA8 |. 8D45 D8 lea eax, dword ptr [ebp-28]
下面的两个CALL与计算机器码的一样,都是些格式化操作,不必理会:
00467CA7 |. 9B wait
00467CA8 |. 8D45 D8 lea eax, dword ptr [ebp-28]
00467CAB |. 50 push eax ; /Arg1
00467CAC |. 0FB705 20BC46>movzx eax, word ptr [46BC20] ; |
00467CB3 |. 8945 D0 mov dword ptr [ebp-30], eax ; |
00467CB6 |. C645 D4 00 mov byte ptr [ebp-2C], 0 ; |
00467CBA |. 8D55 D0 lea edx, dword ptr [ebp-30] ; |
00467CBD |. 33C9 xor ecx, ecx ; |
00467CBF |. A1 08BC4600 mov eax, dword ptr [46BC08] ; |
00467CC4 |. E8 3313FAFF call 00408FFC ; \KGMe.00408FFC
00467CC9 |. FF75 D8 push dword ptr [ebp-28]
00467CCC |. FF35 04BC4600 push dword ptr [46BC04]
00467CD2 |. 8D45 CC lea eax, dword ptr [ebp-34]
00467CD5 |. 50 push eax ; /Arg1
00467CD6 |. 0FB705 26BC46>movzx eax, word ptr [46BC26] ; |
00467CDD |. 8945 D0 mov dword ptr [ebp-30], eax ; |
00467CE0 |. C645 D4 00 mov byte ptr [ebp-2C], 0 ; |
00467CE4 |. 8D55 D0 lea edx, dword ptr [ebp-30] ; |
00467CE7 |. 33C9 xor ecx, ecx ; |
00467CE9 |. A1 08BC4600 mov eax, dword ptr [46BC08] ; |
00467CEE |. E8 0913FAFF call 00408FFC ; \KGMe.00408FFC
00467CF3 |. FF75 CC push dword ptr [ebp-34]
00467CF6 |. 8D45 DC lea eax, dword ptr [ebp-24]
00467CF9 |. BA 03000000 mov edx, 3
00467CFE |. E8 9DC9F9FF call 004046A0 ; 取当前日期字串
00467D03 |. 8B45 DC mov eax, dword ptr [ebp-24] ; 保存当前日期"2009032"
00467D06 |. E8 851AFAFF call 00409790 ; 将日期字串转化为浮点数2009032.0
00467D0B |. DC6D F0 fsubr qword ptr [ebp-10] ; 当前日期-输入的假码
00467D0E |. DB7D C0 fstp tbyte ptr [ebp-40] ; 将差保存到[EBP-40]中
00467D11 |. 9B wait
00467D12 |. DD45 E8 fld qword ptr [ebp-18] ; 取机器码计算的结果
00467D15 |. E8 92AFF9FF call 00402CAC ; 将机器码的计算结果转为整数->EAX中
00467D1A |. 8945 D0 mov dword ptr [ebp-30], eax ; 保存机器码计算的整数结果
00467D1D |. 8955 D4 mov dword ptr [ebp-2C], edx
00467D20 |. DF6D D0 fild qword ptr [ebp-30] ; 加载机器码计算的整数结果
00467D23 |. DB6D C0 fld tbyte ptr [ebp-40] ; 加载当前日期-假码的结果
00467D26 |. DED9 fcompp ; 比较这两个结果是否相同
00467D28 |. DFE0 fstsw ax
00467D2A |. 9E sahf
00467D2B |. 74 0E je short 00467D3B ; 关键跳,如果结果相等,则跳,出现“Please restart again!"窗口
综上所述,设输入的注册码为X,则应该满足:
(机器码-9527.0)/139.0+当前日期-1 = 当前日期 - x
当等式的左边比当前日期大的时候,会出现x为负,通过补码的计算方法可得:
x = [(机器码-9527.0)/139.0+当前日期-1]+当前日期
比如,机器码=1215539086,则 x =[(1215539086-9527)/139+2009031]+2009032 = 12762879
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!