作者:wangshq397=8100303
目标:FinalData 1.0 (这是老版本,最新版本:2.0。)序列号
工具:ollydbg exescope w32dsm
特点:序列号和姓名无关,没有反跟踪、没有花指令、没有加壳。原来用TRW跟过,算法不难,但很罗嗦。表述不够详细,请谅解。
简介:在windows NT/2000下,有回收站来保护错误删除的文件。如果你在这些系统中删除了文件,在这些文件从硬盘上实际删掉前都送到了回收站。只要我们需要,我们能很方便的从回收站恢复他们来重新使用它们。但是由于硬盘空间有限。在回收站里的文件必须被清空来重新获得这些空间。一旦清空,在windows本身系统里,再没有办法可以找回这些数据。但是,你可以在windows中用恢复工具"FinalData"来恢复这些数据的大部分甚至全部。一旦你从回收站中清空你一些敏感的文件,操作系统(Windows 95,98或Windoes NT)并没有把磁盘上真正的文件内容删掉,只是从某些系统表中把这些文件的“参考”删掉而已,同样的情况包括被病毒袭击和快速格式化。FinalData 能恢复你的数据,甚至是主引导纪录,引导扇区,FAT以及很多其他的数据。当绝大部分其他的恢复程序说“不可能了!”的时候,FinalData能将你的“决定性数据”安全,快速,专业地恢复过来。我们强烈建议你在上述所说的不幸发生前在你的机器上安装FinalData.和很多数据恢复公司一样,世界上很多IT管理人员将FinalData作为一种数据恢复和反删除的一种非常有效的工具。
步骤:
1、用exescope查看主程序资源找到如下:
51204,FinalData NT-OEM v1.0
51205,FinalData NT-OEM v1.0 (%c:)
51206,FinalData NT-OEM v1.0 (Harddisk %d)
51207,Cannot load INFDRV.DLL. Be sure that INFDRV.DLL and INFTHK.DLL are copied into windows's SYSTEM folder.
51208,请输入姓名和序列号. =〉这里是提示语句
51209,无效序列号. =〉这里是提示语句
51210,不支持该文件格式.
51211,打不开驱动器
51212,打不开驱动器.$0A你必须是管理员.
51213,改软件不能在windows NT 3.51及更低版本运行.
51214,你必须是管理员.
51215,名称
2、用w32dsm反汇编主程序,串式参考中中文全部是乱码,直接查找ID=51209,找到如下地址:
:004F3B4B 55 push ebp
:004F3B4C 8BEC mov ebp, esp
:004F3B4E 83EC08 sub esp, 00000008
:004F3B51 894DF8 mov dword ptr [ebp-08], ecx
:004F3B54 E8A7E3F4FF call 00441F00
:004F3B59 8945FC mov dword ptr [ebp-04], eax
:004F3B5C 6A01 push 00000001
:004F3B5E 8B4DF8 mov ecx, dword ptr [ebp-08]
:004F3B61 E8342A0500 call 0054659A
:004F3B66 68FC0D7500 push 00750DFC
:004F3B6B 8B45F8 mov eax, dword ptr [ebp-08]
:004F3B6E 83C064 add eax, 00000064
:004F3B71 50 push eax
:004F3B72 E829A3F1FF call 0040DEA0
:004F3B77 25FF000000 and eax, 000000FF
:004F3B7C 85C0 test eax, eax
:004F3B7E 751A jne 004F3B9A
:004F3B80 68000E7500 push 00750E00
:004F3B85 8B4DF8 mov ecx, dword ptr [ebp-08]
:004F3B88 83C168 add ecx, 00000068
:004F3B8B 51 push ecx
:004F3B8C E80FA3F1FF call 0040DEA0
:004F3B91 25FF000000 and eax, 000000FF
:004F3B96 85C0 test eax, eax
:004F3B98 7413 je 004F3BAD
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F3B7E(C)
|
:004F3B9A 6AFF push FFFFFFFF
:004F3B9C 6A30 push 00000030
* Possible Reference to String Resource ID=51208: "?e???" 这里是“请输入姓名和序列号”
|
:004F3B9E 6808C80000 push 0000C808
:004F3BA3 E8DAB60500 call 0054F282
:004F3BA8 E994000000 jmp 004F3C41
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F3B98(C)
|
:004F3BAD 6A1C push 0000001C
:004F3BAF 8B4DF8 mov ecx, dword ptr [ebp-08]
:004F3BB2 83C168 add ecx, 00000068
:004F3BB5 E815450500 call 005480CF
:004F3BBA 50 push eax
:004F3BBB E8409BFDFF call 004CD700 这里应该是关键
:004F3BC0 83C404 add esp, 00000004
:004F3BC3 85C0 test eax, eax
:004F3BC5 745F je 004F3C26 跳到“无效序列号”
:004F3BC7 8B55F8 mov edx, dword ptr [ebp-08]
:004F3BCA C7425C01000000 mov [edx+5C], 00000001
:004F3BD1 8B4DF8 mov ecx, dword ptr [ebp-08]
:004F3BD4 83C164 add ecx, 00000064
:004F3BD7 E854DAF0FF call 00401630
:004F3BDC 50 push eax
下面应该是保存序列号:
* Possible StringData Ref from Data Obj ->"Name" 保存姓名
|
:004F3BDD 68D4775C00 push 005C77D4
:004F3BE2 E850020000 call 004F3E37
:004F3BE7 83C408 add esp, 00000008
:004F3BEA 8B4DF8 mov ecx, dword ptr [ebp-08]
:004F3BED 83C160 add ecx, 00000060
:004F3BF0 E83BDAF0FF call 00401630
:004F3BF5 50 push eax
* Possible StringData Ref from Data Obj ->"Company" 保存公司
|
:004F3BF6 68DC775C00 push 005C77DC
:004F3BFB E837020000 call 004F3E37
:004F3C00 83C408 add esp, 00000008
:004F3C03 8B4DF8 mov ecx, dword ptr [ebp-08]
:004F3C06 83C168 add ecx, 00000068
:004F3C09 E822DAF0FF call 00401630
:004F3C0E 50 push eax
* Possible StringData Ref from Data Obj ->"Serial" 保存序列号
|
:004F3C0F 68E4775C00 push 005C77E4
:004F3C14 E81E020000 call 004F3E37
:004F3C19 83C408 add esp, 00000008
:004F3C1C 8B4DF8 mov ecx, dword ptr [ebp-08]
:004F3C1F E877010500 call 00543D9B
:004F3C24 EB0E jmp 004F3C34
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F3BC5(C) 跳转来自004F3BC5
|
:004F3C26 6AFF push FFFFFFFF
:004F3C28 6A30 push 00000030
* Possible Reference to String Resource ID=51209: "嗳??" 这里是“无效序列号.”
|
:004F3C2A 6809C80000 push 0000C809
:004F3C2F E84EB60500 call 0054F282
3、用ollydbg载入主程序,在004F3BBB下断,运行后出现输入姓名、公司、序列号的窗口,随便输入姓名、公司,序列号填:1234567890。点确定后,在004F3BBB断下,按F7进入:
004CD700 /$ 55 push ebp
004CD701 |. 8BEC mov ebp,esp
004CD703 |. 83EC 50 sub esp,50
004CD706 |. 6A 03 push 3 这里引导下面取前三位
004CD708 |. 8B45 08 mov eax,dword ptr ss:[ebp+8]
004CD70B |. 50 push eax
004CD70C |. 8D4D C8 lea ecx,dword ptr ss:[ebp-38]
004CD70F |. 51 push ecx
004CD710 |. E8 BB220600 call FinalDat.0052F9D0
004CD715 |. 83C4 0C add esp,0C
004CD718 |. C645 CB 00 mov byte ptr ss:[ebp-35],0
004CD71C |. 68 F8675C00 push FinalDat.005C67F8 ; ASCII "UND" 固定字符串
004CD721 |. 8D55 C8 lea edx,dword ptr ss:[ebp-38]
004CD724 |. 52 push edx
004CD725 |. E8 869C0600 call FinalDat.005373B0 二者比较,前三位必须是UND
004CD72A |. 83C4 08 add esp,8
004CD72D |. 85C0 test eax,eax 是不是呢?
004CD72F 74 07 je short FinalDat.004CD738 不是就玩完
004CD731 |. 33C0 xor eax,eax
004CD733 |. E9 D7020000 jmp FinalDat.004CDA0F
004CD738 |> 8B45 08 mov eax,dword ptr ss:[ebp+8]
004CD73B |. 0FBE48 08 movsx ecx,byte ptr ds:[eax+8]
004CD73F |. 83F9 2D cmp ecx,2D 比较第9位是不是“-”
004CD742 |. 75 1B jnz short FinalDat.004CD75F 不是就玩完
004CD744 |. 8B55 08 mov edx,dword ptr ss:[ebp+8]
004CD747 |. 0FBE42 0D movsx eax,byte ptr ds:[edx+D]
004CD74B |. 83F8 2D cmp eax,2D 比较第14位是不是“-”
004CD74E |. 75 0F jnz short FinalDat.004CD75F 不是就玩完
004CD750 |. 8B4D 08 mov ecx,dword ptr ss:[ebp+8]
004CD753 |. 51 push ecx ; /String
004CD754 |. FF15 10745700 call dword ptr ds:[<&KERNEL32.l>; \lstrlenA 字符串长度函数
004CD75A |. 83F8 1A cmp eax,1A 序列号位数应为1A,10进制是26
004CD75D |. 74 07 je short FinalDat.004CD766 不是26位就玩完
004CD75F |> 33C0 xor eax,eax
004CD761 |. E9 A9020000 jmp FinalDat.004CDA0F
004CD766 |> C745 E8 03000>mov dword ptr ss:[ebp-18],3 前3位不用了,从第4位开始。
004CD76D |. EB 09 jmp short FinalDat.004CD778
004CD76F |> 8B55 E8 /mov edx,dword ptr ss:[ebp-18]
004CD772 |. 83C2 01 |add edx,1
004CD775 |. 8955 E8 |mov dword ptr ss:[ebp-18],edx
004CD778 |> 837D E8 08 cmp dword ptr ss:[ebp-18],8 取到第8位
004CD77C |. 7D 1F |jge short FinalDat.004CD79D
004CD77E |. 8B45 08 |mov eax,dword ptr ss:[ebp+8]
004CD781 |. 0345 E8 |add eax,dword ptr ss:[ebp-18]
004CD784 |. 0FBE08 |movsx ecx,byte ptr ds:[eax] 逐位取4-8位
004CD787 |. 51 |push ecx
004CD788 |. E8 7B3A0600 |call FinalDat.00531208 序列号运算
004CD78D |. 83C4 04 |add esp,4
004CD790 |. 85C0 |test eax,eax
004CD792 |. 75 07 |jnz short FinalDat.004CD79B
004CD794 |. 33C0 |xor eax,eax
004CD796 |. E9 74020000 |jmp FinalDat.004CDA0F 这里必须跳
004CD79B |>^ EB D2 \jmp short FinalDat.004CD76F
004CD79D |> C745 E8 09000>mov dword ptr ss:[ebp-18],9 前9位不用了
004CD7A4 |. EB 09 jmp short FinalDat.004CD7AF
004CD7A6 |> 8B55 E8 /mov edx,dword ptr ss:[ebp-18]
004CD7A9 |. 83C2 01 |add edx,1
004CD7AC |. 8955 E8 |mov dword ptr ss:[ebp-18],edx
004CD7AF |> 837D E8 0D cmp dword ptr ss:[ebp-18],0D 取到第13位
004CD7B3 |. 7D 1F |jge short FinalDat.004CD7D4
004CD7B5 |. 8B45 08 |mov eax,dword ptr ss:[ebp+8]
004CD7B8 |. 0345 E8 |add eax,dword ptr ss:[ebp-18]
004CD7BB |. 0FBE08 |movsx ecx,byte ptr ds:[eax] 逐位取10-13位
004CD7BE |. 51 |push ecx
004CD7BF |. E8 443A0600 |call FinalDat.00531208 序列号运算
004CD7C4 |. 83C4 04 |add esp,4
004CD7C7 |. 85C0 |test eax,eax
004CD7C9 |. 75 07 |jnz short FinalDat.004CD7D2 这里必须跳
004CD7CB |. 33C0 |xor eax,eax
004CD7CD |. E9 3D020000 |jmp FinalDat.004CDA0F
004CD7D2 |>^ EB D2 \jmp short FinalDat.004CD7A6
004CD7D4 |> C745 E8 0E000>mov dword ptr ss:[ebp-18],0E 前14位不用了
004CD7DB |. EB 09 jmp short FinalDat.004CD7E6
004CD7DD |> 8B55 E8 /mov edx,dword ptr ss:[ebp-18]
004CD7E0 |. 83C2 01 |add edx,1
004CD7E3 |. 8955 E8 |mov dword ptr ss:[ebp-18],edx
004CD7E6 |> 837D E8 1A cmp dword ptr ss:[ebp-18],1A 取到第26位
004CD7EA |. 7D 1F |jge short FinalDat.004CD80B
004CD7EC |. 8B45 08 |mov eax,dword ptr ss:[ebp+8]
004CD7EF |. 0345 E8 |add eax,dword ptr ss:[ebp-18]
004CD7F2 |. 0FBE08 |movsx ecx,byte ptr ds:[eax] 逐位取14-26位
004CD7F5 |. 51 |push ecx
004CD7F6 |. E8 0D3A0600 |call FinalDat.00531208 序列号运算
004CD7FB |. 83C4 04 |add esp,4
004CD7FE |. 85C0 |test eax,eax
004CD800 |. 75 07 |jnz short FinalDat.004CD809 这里必须跳
004CD802 |. 33C0 |xor eax,eax
004CD804 |. E9 06020000 |jmp FinalDat.004CDA0F
004CD809 |>^ EB D2 \jmp short FinalDat.004CD7DD
可以看出,call FinalDat.00531208会把每一位序列号变换。
进入call FinalDat.00531208
00531208 /$ 833D A40D5F00>cmp dword ptr ds:[5F0DA4],1 比较dword ptr ds:[5F0DA4],1
0053120F |. 7E 0E jle short FinalDat.0053121F 不大于就跳
00531211 |. 6A 04 push 4
00531213 |. FF7424 08 push dword ptr ss:[esp+8]
00531217 |. E8 95310000 call FinalDat.005343B1
0053121C |. 59 pop ecx
0053121D |. 59 pop ecx
0053121E |. C3 retn
0053121F |> 8B4424 04 mov eax,dword ptr ss:[esp+4] 序列号16进制入EAX
00531223 |. 8B0D 980B5F00 mov ecx,dword ptr ds:[5F0B98] ; FinalDat.005F0BA2 地址入ECX
00531229 |. 8A0441 mov al,byte ptr ds:[ecx+eax*2] (005F0BA2+每位序列号*2)地址处数据入EAX低位AL。
0053122C |. 83E0 04 and eax,4 EAX=EAX和4与运算
0053122F \. C3 retn 子程序结束
上面验证每位序列号必须符合如下条件:(005F0BA2+每位序列号的16进制码*2)获得一个地址,再根据获得地址处的数据和4做与运算的值不等于零,具体对应结果:0到9均为84,A到F均为81,G到Z均为1,a到f均为82,g到z均为2。 看起来复杂,实际上验证序列号除UND和-以外是否全是数字。
下面是验证序列号的算法:
004CD80B |> 6A 02 push 2 此处表示取2位
004CD80D |. 8B55 08 mov edx,dword ptr ss:[ebp+8] 字符串长度
004CD810 |. 83C2 05 add edx,5 前5位不用了
004CD813 |. 52 push edx
004CD814 |. 8D45 C8 lea eax,dword ptr ss:[ebp-38] 取前3位
004CD817 |. 50 push eax
004CD818 |. E8 B3210600 call FinalDat.0052F9D0 此CALL下面反复调用
004CD81D |. 83C4 0C add esp,0C
004CD820 |. C645 CA 00 mov byte ptr ss:[ebp-36],0
004CD824 |. 8D4D C8 lea ecx,dword ptr ss:[ebp-38] 67D变成67
004CD827 |. 51 push ecx
004CD828 |. E8 D81C0600 call FinalDat.0052F505 此CALL下面反复调用
004CD82D |. 83C4 04 add esp,4
004CD830 |. 83F0 03 xor eax,3
004CD833 |. 8845 EC mov byte ptr ss:[ebp-14],al
004CD836 |. 6A 02 push 2 再取2位,第10、11位
004CD838 |. 8B55 08 mov edx,dword ptr ss:[ebp+8]
004CD83B |. 83C2 09 add edx,9 前9位不用了
004CD83E |. 52 push edx
004CD83F |. 8D45 C8 lea eax,dword ptr ss:[ebp-38]
004CD842 |. 50 push eax
004CD843 |. E8 88210600 call FinalDat.0052F9D0
004CD848 |. 83C4 0C add esp,0C
004CD84B |. C645 CA 00 mov byte ptr ss:[ebp-36],0
004CD84F |. 8D4D C8 lea ecx,dword ptr ss:[ebp-38]
004CD852 |. 51 push ecx
004CD853 |. E8 AD1C0600 call FinalDat.0052F505 第10、11位的运算
004CD858 |. 83C4 04 add esp,4
004CD85B |. 83F0 02 xor eax,2
004CD85E |. 8845 C0 mov byte ptr ss:[ebp-40],al
004CD861 |. 6A 0A push 0A 取10位
004CD863 |. 8B55 08 mov edx,dword ptr ss:[ebp+8]
004CD866 |. 83C2 0E add edx,0E 前14位不用了
004CD869 |. 52 push edx
004CD86A |. 8D45 C8 lea eax,dword ptr ss:[ebp-38]
004CD86D |. 50 push eax
004CD86E |. E8 5D210600 call FinalDat.0052F9D0
004CD873 |. 83C4 0C add esp,0C
004CD876 |. C645 D2 00 mov byte ptr ss:[ebp-2E],0
004CD87A |. 8D4D C8 lea ecx,dword ptr ss:[ebp-38]
004CD87D |. 51 push ecx
004CD87E |. E8 F71B0600 call FinalDat.0052F47A 第15到25位的运算
004CD883 |. 83C4 04 add esp,4
004CD886 |. 35 87915713 xor eax,13579187 EAX=EAX和13579187异或运算
004CD88B |. 8945 F0 mov dword ptr ss:[ebp-10],eax
004CD88E |. 6A 02 push 2 再取2位(第4、5位)
004CD890 |. 8B55 08 mov edx,dword ptr ss:[ebp+8]
004CD893 |. 83C2 03 add edx,3
004CD896 |. 52 push edx
004CD897 |. 8D45 C8 lea eax,dword ptr ss:[ebp-38]
004CD89A |. 50 push eax
004CD89B |. E8 30210600 call FinalDat.0052F9D0
004CD8A0 |. 83C4 0C add esp,0C
004CD8A3 |. C645 CA 00 mov byte ptr ss:[ebp-36],0
004CD8A7 |. 8D4D C8 lea ecx,dword ptr ss:[ebp-38]
004CD8AA |. 51 push ecx
004CD8AB |. E8 551C0600 call FinalDat.0052F505 第4、5位的运算
004CD8B0 |. 83C4 04 add esp,4
004CD8B3 |. 8845 FC mov byte ptr ss:[ebp-4],al
004CD8B6 |. 6A 01 push 1 取1位(第8位)
004CD8B8 |. 8B55 08 mov edx,dword ptr ss:[ebp+8]
004CD8BB |. 83C2 07 add edx,7
004CD8BE |. 52 push edx
004CD8BF |. 8D45 C8 lea eax,dword ptr ss:[ebp-38]
004CD8C2 |. 50 push eax
004CD8C3 |. E8 08210600 call FinalDat.0052F9D0
004CD8C8 |. 83C4 0C add esp,0C
004CD8CB |. C645 C9 00 mov byte ptr ss:[ebp-37],0
004CD8CF |. 8D4D C8 lea ecx,dword ptr ss:[ebp-38]
004CD8D2 |. 51 push ecx
004CD8D3 |. E8 2D1C0600 call FinalDat.0052F505 第8位的运算
004CD8D8 |. 83C4 04 add esp,4
004CD8DB |. 8845 BC mov byte ptr ss:[ebp-44],al
004CD8DE |. 6A 02 push 2 再取2位(12、13位)
004CD8E0 |. 8B55 08 mov edx,dword ptr ss:[ebp+8]
004CD8E3 |. 83C2 0B add edx,0B
004CD8E6 |. 52 push edx
004CD8E7 |. 8D45 C8 lea eax,dword ptr ss:[ebp-38]
004CD8EA |. 50 push eax
004CD8EB |. E8 E0200600 call FinalDat.0052F9D0
004CD8F0 |. 83C4 0C add esp,0C
004CD8F3 |. C645 CA 00 mov byte ptr ss:[ebp-36],0
004CD8F7 |. 8D4D C8 lea ecx,dword ptr ss:[ebp-38]
004CD8FA |. 51 push ecx
004CD8FB |. E8 051C0600 call FinalDat.0052F505 12、13位的运算
004CD900 |. 83C4 04 add esp,4
004CD903 |. 8845 B4 mov byte ptr ss:[ebp-4C],al
004CD906 |. 6A 02 push 2 再取2位(25、26位)
004CD908 |. 8B55 08 mov edx,dword ptr ss:[ebp+8]
004CD90B |. 83C2 18 add edx,18
004CD90E |. 52 push edx
004CD90F |. 8D45 C8 lea eax,dword ptr ss:[ebp-38]
004CD912 |. 50 push eax
004CD913 |. E8 B8200600 call FinalDat.0052F9D0
004CD918 |. 83C4 0C add esp,0C
004CD91B |. C645 CA 00 mov byte ptr ss:[ebp-36],0
004CD91F |. 8D4D C8 lea ecx,dword ptr ss:[ebp-38]
004CD922 |. 51 push ecx
004CD923 |. E8 DD1B0600 call FinalDat.0052F505 25、26位的运算
004CD928 |. 83C4 04 add esp,4
004CD92B |. 8845 F8 mov byte ptr ss:[ebp-8],al
004CD92E |. 8B55 EC mov edx,dword ptr ss:[ebp-14]
004CD931 |. 81E2 FF000000 and edx,0FF
004CD937 |. 8B45 F0 mov eax,dword ptr ss:[ebp-10]
004CD93A |. 8D4402 03 lea eax,dword ptr ds:[edx+eax+3>
004CD93E |. 33D2 xor edx,edx
004CD940 |. B9 0A000000 mov ecx,0A
004CD945 |. F7F1 div ecx
004CD947 |. 8855 F4 mov byte ptr ss:[ebp-C],dl
004CD94A |. 8B55 C0 mov edx,dword ptr ss:[ebp-40]
004CD94D |. 81E2 FF000000 and edx,0FF
004CD953 |. 8B45 F0 mov eax,dword ptr ss:[ebp-10]
004CD956 |. 8D4402 03 lea eax,dword ptr ds:[edx+eax+3>
004CD95A |. 33D2 xor edx,edx
004CD95C |. B9 64000000 mov ecx,64
004CD961 |. F7F1 div ecx
004CD963 |. 8855 B8 mov byte ptr ss:[ebp-48],dl
004CD966 |. 8B55 F4 mov edx,dword ptr ss:[ebp-C]
004CD969 |. 81E2 FF000000 and edx,0FF
004CD96F |. 8B45 B8 mov eax,dword ptr ss:[ebp-48]
004CD972 |. 25 FF000000 and eax,0FF
004CD977 |. 8D4402 05 lea eax,dword ptr ds:[edx+eax+5>
004CD97B |. 99 cdq
004CD97C |. B9 64000000 mov ecx,64
004CD981 |. F7F9 idiv ecx
004CD983 |. 8855 B0 mov byte ptr ss:[ebp-50],dl
004CD986 |. 8B55 F4 mov edx,dword ptr ss:[ebp-C]
004CD989 |. 81E2 FF000000 and edx,0FF
004CD98F |. 8B45 B8 mov eax,dword ptr ss:[ebp-48]
004CD992 |. 25 FF000000 and eax,0FF
004CD997 |. 03D0 add edx,eax
004CD999 |. 8B4D B0 mov ecx,dword ptr ss:[ebp-50]
004CD99C |. 81E1 FF000000 and ecx,0FF
004CD9A2 |. 8D440A 07 lea eax,dword ptr ds:[edx+ecx+7>
004CD9A6 |. 99 cdq
004CD9A7 |. B9 64000000 mov ecx,64
004CD9AC |. F7F9 idiv ecx
004CD9AE |. 8855 C4 mov byte ptr ss:[ebp-3C],dl
004CD9B1 |. 8B55 F4 mov edx,dword ptr ss:[ebp-C]
上面不断变换EAX、EDX、EDI、ECX的值,下面就是比较了
004CD9B4 |. 81E2 FF000000 and edx,0FF EDX=EDX AND FF
004CD9BA |. 8B45 BC mov eax,dword ptr ss:[ebp-44]
004CD9BD |. 25 FF000000 and eax,0FF EAX=EAX AND FF
004CD9C2 |. 3BD0 cmp edx,eax
004CD9C4 |. 75 40 jnz short FinalDat.004CDA06 这里不能跳
004CD9C6 |. 8B4D B8 mov ecx,dword ptr ss:[ebp-48]
004CD9C9 |. 81E1 FF000000 and ecx,0FF
004CD9CF |. 8B55 B4 mov edx,dword ptr ss:[ebp-4C]
004CD9D2 |. 81E2 FF000000 and edx,0FF
004CD9D8 |. 3BCA cmp ecx,edx
004CD9DA |. 75 2A jnz short FinalDat.004CDA06 这里不能跳
004CD9DC |. 8B45 B0 mov eax,dword ptr ss:[ebp-50]
004CD9DF |. 25 FF000000 and eax,0FF
004CD9E4 |. 8B4D FC mov ecx,dword ptr ss:[ebp-4]
004CD9E7 |. 81E1 FF000000 and ecx,0FF
004CD9ED |. 3BC1 cmp eax,ecx
004CD9EF |. 75 15 jnz short FinalDat.004CDA06 这里不能跳
004CD9F1 |. 8B55 C4 mov edx,dword ptr ss:[ebp-3C]
004CD9F4 |. 81E2 FF000000 and edx,0FF
004CD9FA |. 8B45 F8 mov eax,dword ptr ss:[ebp-8]
004CD9FD |. 25 FF000000 and eax,0FF
004CDA02 |. 3BD0 cmp edx,eax
004CDA04 |. 74 04 je short FinalDat.004CDA0A 这里跳
004CDA06 |> 33C0 xor eax,eax
004CDA08 |. EB 05 jmp short FinalDat.004CDA0F
004CDA0A |> B8 01000000 mov eax,1 正确序列号会跳到这里,EAX=1,注册标志位。
004CDA0F |> 8BE5 mov esp,ebp 错误序列号会跳到这里,改成mov eax,1,即可爆破。
004CDA11 |. 5D pop ebp
004CDA12 \. C3 retn
可以看出,关键地方是call FinalDat.0052F9D0和call FinalDat.0052F505。输入序列号UND45678-0123-567890123456。
第一次进入call FinalDat.0052F9D0,
0052F9D0 $ 55 push ebp
0052F9D1 . 8BEC mov ebp,esp
0052F9D3 . 57 push edi
0052F9D4 . 56 push esi
0052F9D5 . 8B75 0C mov esi,dword ptr ss:[ebp+C] 把前5位去掉,序列号变成678-0123-567890123456,入ESI
0052F9D8 . 8B4D 10 mov ecx,dword ptr ss:[ebp+10] 取前2位:67 位数=2
0052F9DB . 8B7D 08 mov edi,dword ptr ss:[ebp+8] 取前3位:UND
0052F9DE . 8BC1 mov eax,ecx
0052F9E0 . 8BD1 mov edx,ecx
0052F9E2 . 03C6 add eax,esi
0052F9E4 . 3BFE cmp edi,esi 比较678-0123-567890123456和UND
0052F9E6 . 76 08 jbe short FinalDat.0052F9F0 不大于就跳
0052F9E8 . 3BF8 cmp edi,eax
0052F9EA . 0F82 78010000 jb FinalDat.0052FB68
0052F9F0 > F7C7 03000000 test edi,3 比较UND是否3位
0052F9F6 . 75 14 jnz short FinalDat.0052FA0C 不是就跳
0052F9F8 . C1E9 02 shr ecx,2 ECX右移2,变成0了
0052F9FB . 83E2 03 and edx,3
0052F9FE . 83F9 08 cmp ecx,8 ECX和8比较
0052FA01 . 72 29 jb short FinalDat.0052FA2C 不高于或等于就跳,这里跳。
0052FA03 . F3:A5 rep movs dword ptr es:[edi],dword ptr ds:[esi]
0052FA05 . FF2495 18FB52>jmp dword ptr ds:[edx*4+52FB18]
0052FA0C > 8BC7 mov eax,edi
0052FA0E . BA 03000000 mov edx,3
0052FA13 . 83E9 04 sub ecx,4
0052FA16 . 72 0C jb short FinalDat.0052FA24
0052FA18 . 83E0 03 and eax,3
0052FA1B . 03C8 add ecx,eax
0052FA1D . FF2485 30FA52>jmp dword ptr ds:[eax*4+52FA30]
0052FA24 > FF248D 28FB52>jmp dword ptr ds:[ecx*4+52FB28]
0052FA2B 90 nop
0052FA2C > FF248D ACFA52>jmp dword ptr ds:[ecx*4+52FAAC] 跳到这里,再跳到dword ptr ds:[ecx*4+52FAAC]=0052FB0F
0052FA33 90 nop
0052FA34 . 40FA5200 dd FinalDat.0052FA40 ; Switch table (1-based) used at 0052FA1D
0052FA38 . 6CFA5200 dd FinalDat.0052FA6C
0052FA3C . 90FA5200 dd FinalDat.0052FA90
0052FA40 > 23D1 and edx,ecx
0052FA42 . 8A06 mov al,byte ptr ds:[esi]
0052FA44 . 8807 mov byte ptr ds:[edi],al
0052FA46 . 8A46 01 mov al,byte ptr ds:[esi+1]
0052FA49 . 8847 01 mov byte ptr ds:[edi+1],al
0052FA4C . 8A46 02 mov al,byte ptr ds:[esi+2]
0052FA4F . C1E9 02 shr ecx,2
0052FA52 . 8847 02 mov byte ptr ds:[edi+2],al
0052FA55 . 83C6 03 add esi,3
0052FA58 . 83C7 03 add edi,3
0052FA5B . 83F9 08 cmp ecx,8
0052FA5E .^ 72 CC jb short FinalDat.0052FA2C
0052FA60 . F3:A5 rep movs dword ptr es:[edi],dwo>
0052FA62 . FF2495 18FB52>jmp dword ptr ds:[edx*4+52FB18]
0052FA69 8D49 00 lea ecx,dword ptr ds:[ecx]
0052FA6C > 23D1 and edx,ecx
0052FA6E . 8A06 mov al,byte ptr ds:[esi]
0052FA70 . 8807 mov byte ptr ds:[edi],al
0052FA72 . 8A46 01 mov al,byte ptr ds:[esi+1]
0052FA75 . C1E9 02 shr ecx,2
0052FA78 . 8847 01 mov byte ptr ds:[edi+1],al
0052FA7B . 83C6 02 add esi,2
0052FA7E . 83C7 02 add edi,2
0052FA81 . 83F9 08 cmp ecx,8
0052FA84 .^ 72 A6 jb short FinalDat.0052FA2C
0052FA86 . F3:A5 rep movs dword ptr es:[edi],dwo>
0052FA88 . FF2495 18FB52>jmp dword ptr ds:[edx*4+52FB18]
0052FA8F 90 nop
0052FA90 > 23D1 and edx,ecx
0052FA92 . 8A06 mov al,byte ptr ds:[esi]
0052FA94 . 8807 mov byte ptr ds:[edi],al
0052FA96 . 46 inc esi
0052FA97 . C1E9 02 shr ecx,2
0052FA9A . 47 inc edi
0052FA9B . 83F9 08 cmp ecx,8
0052FA9E .^ 72 8C jb short FinalDat.0052FA2C
0052FAA0 . F3:A5 rep movs dword ptr es:[edi],dwo>
0052FAA2 . FF2495 18FB52>jmp dword ptr ds:[edx*4+52FB18]
0052FAA9 8D49 00 lea ecx,dword ptr ds:[ecx]
0052FAAC . 0FFB5200 dd FinalDat.0052FB0F ; Switch table used at 0052FA2C
0052FAB0 . FCFA5200 dd FinalDat.0052FAFC
0052FAB4 . F4FA5200 dd FinalDat.0052FAF4
0052FAB8 . ECFA5200 dd FinalDat.0052FAEC
0052FABC . E4FA5200 dd FinalDat.0052FAE4
0052FAC0 . DCFA5200 dd FinalDat.0052FADC
0052FAC4 . D4FA5200 dd FinalDat.0052FAD4
0052FAC8 . CCFA5200 dd FinalDat.0052FACC
0052FACC > 8B448E E4 mov eax,dword ptr ds:[esi+ecx*4>
0052FAD0 . 89448F E4 mov dword ptr ds:[edi+ecx*4-1C]>
0052FAD4 > 8B448E E8 mov eax,dword ptr ds:[esi+ecx*4>
0052FAD8 . 89448F E8 mov dword ptr ds:[edi+ecx*4-18]>
0052FADC > 8B448E EC mov eax,dword ptr ds:[esi+ecx*4>
0052FAE0 . 89448F EC mov dword ptr ds:[edi+ecx*4-14]>
0052FAE4 > 8B448E F0 mov eax,dword ptr ds:[esi+ecx*4>
0052FAE8 . 89448F F0 mov dword ptr ds:[edi+ecx*4-10]>
0052FAEC > 8B448E F4 mov eax,dword ptr ds:[esi+ecx*4>
0052FAF0 . 89448F F4 mov dword ptr ds:[edi+ecx*4-C],>
0052FAF4 > 8B448E F8 mov eax,dword ptr ds:[esi+ecx*4>
0052FAF8 . 89448F F8 mov dword ptr ds:[edi+ecx*4-8],>
0052FAFC > 8B448E FC mov eax,dword ptr ds:[esi+ecx*4>
0052FB00 . 89448F FC mov dword ptr ds:[edi+ecx*4-4],>
0052FB04 . 8D048D 000000>lea eax,dword ptr ds:[ecx*4]
0052FB0B . 03F0 add esi,eax
0052FB0D . 03F8 add edi,eax
0052FB0F > FF2495 18FB52>jmp dword ptr ds:[edx*4+52FB18] 继续跳dword ptr ds:[edx*4+52FB18]=0052FB3C
0052FB16 8BFF mov edi,edi
0052FB18 . 28FB5200 dd FinalDat.0052FB28 ; Switch table used at 0052FA62
0052FB1C . 30FB5200 dd FinalDat.0052FB30
0052FB20 . 3CFB5200 dd FinalDat.0052FB3C
0052FB24 . 50FB5200 dd FinalDat.0052FB50
0052FB28 > 8B45 08 mov eax,dword ptr ss:[ebp+8]
0052FB2B . 5E pop esi
0052FB2C . 5F pop edi
0052FB2D . C9 leave
0052FB2E . C3 retn
0052FB2F 90 nop
0052FB30 > 8A06 mov al,byte ptr ds:[esi]
0052FB32 . 8807 mov byte ptr ds:[edi],al
0052FB34 . 8B45 08 mov eax,dword ptr ss:[ebp+8]
0052FB37 . 5E pop esi
0052FB38 . 5F pop edi
0052FB39 . C9 leave
0052FB3A . C3 retn
0052FB3B 90 nop
0052FB3C > \8A06 mov al,byte ptr ds:[esi] 取67的6
0052FB3E . 8807 mov byte ptr ds:[edi],al 存到EDI
0052FB40 . 8A46 01 mov al,byte ptr ds:[esi+1] 取67的7
0052FB43 . 8847 01 mov byte ptr ds:[edi+1],al 存起来
0052FB46 . 8B45 08 mov eax,dword ptr ss:[ebp+8] 把UND和67合并,变成67D
0052FB49 . 5E pop esi
0052FB4A . 5F pop edi
0052FB4B . C9 leave
0052FB4C . C3 retn
第一次进入call FinalDat.0052F505
0052F505 /$ FF7424 04 push dword ptr ss:[esp+4]
0052F509 |. E8 6CFFFFFF call FinalDat.0052F47A 再进入
0052F50E |. 59 pop ecx
0052F50F \. C3 retn
第一次进入call FinalDat.0052F47A
0052F47A /$ 53 push ebx
0052F47B |. 55 push ebp
0052F47C |. 56 push esi
0052F47D |. 57 push edi
0052F47E |. 8B7C24 14 mov edi,dword ptr ss:[esp+14]
0052F482 |> 833D A40D5F00>/cmp dword ptr ds:[5F0DA4],1 比较005F0DA4处是否是1(初始为1)
0052F489 |. 7E 0F |jle short FinalDat.0052F49A 不大于就跳,第1次当然跳了
0052F48B |. 0FB607 |movzx eax,byte ptr ds:[edi]
0052F48E |. 6A 08 |push 8
0052F490 |. 50 |push eax
0052F491 |. E8 1B4F0000 |call FinalDat.005343B1
0052F496 |. 59 |pop ecx
0052F497 |. 59 |pop ecx
0052F498 |. EB 0F |jmp short FinalDat.0052F4A9
0052F49A |> 0FB607 |movzx eax,byte ptr ds:[edi] 跳到这里,取67的6
0052F49D |. 8B0D 980B5F00 |mov ecx,dword ptr ds:[5F0B98] ; FinalDat.005F0BA2 固定值ECX=005F0BA2
0052F4A3 |. 8A0441 |mov al,byte ptr ds:[ecx+eax*2] 取得ecx+eax*2地址处数据
0052F4A6 |. 83E0 08 |and eax,8 和8做与运算
0052F4A9 |> 85C0 |test eax,eax 是否为0
0052F4AB |. 74 03 |je short FinalDat.0052F4B0 是就跳走
0052F4AD |. 47 |inc edi
0052F4AE |.^ EB D2 \jmp short FinalDat.0052F482 不是就进行下一位
0052F4B0 |> 0FB637 movzx esi,byte ptr ds:[edi] 6的16进制代码36入ESI
0052F4B3 |. 47 inc edi EDI计数
0052F4B4 |. 83FE 2D cmp esi,2D 6和-比较
0052F4B7 |. 8BEE mov ebp,esi ebp=esi=36
0052F4B9 |. 74 05 je short FinalDat.0052F4C0 是-就跳
0052F4BB |. 83FE 2B cmp esi,2B 6和+比较
0052F4BE |. 75 04 jnz short FinalDat.0052F4C4 不是+就跳
0052F4C0 |> 0FB637 movzx esi,byte ptr ds:[edi]
0052F4C3 |. 47 inc edi
0052F4C4 |> 33DB xor ebx,ebx EBX变0,为下面做准备
0052F4C6 |> 833D A40D5F00>/cmp dword ptr ds:[5F0DA4],1 跳到这里,下面是一个循环
0052F4CD |. 7E 0C |jle short FinalDat.0052F4DB 这里跳
0052F4CF |. 6A 04 |push 4
0052F4D1 |. 56 |push esi
0052F4D2 |. E8 DA4E0000 |call FinalDat.005343B1
0052F4D7 |. 59 |pop ecx
0052F4D8 |. 59 |pop ecx
0052F4D9 |. EB 0B |jmp short FinalDat.0052F4E6
0052F4DB |> A1 980B5F00 |mov eax,dword ptr ds:[5F0B98] 和上面一样,固定值EAX=005F0BA2
0052F4E0 |. 8A0470 |mov al,byte ptr ds:[eax+esi*2] 取得[eax+esi*2]处数据
0052F4E3 |. 83E0 04 |and eax,4 取得数据和4做与运算
0052F4E6 |> 85C0 |test eax,eax 是0吗?
0052F4E8 |. 74 0D |je short FinalDat.0052F4F7 是就跳,不是就循环直到EAX为0,跳到0052F4F7
0052F4EA |. 8D049B |lea eax,dword ptr ds:[ebx+ebx*4] EAX=ebx+ebx*4=0
0052F4ED |. 8D5C46 D0 |lea ebx,dword ptr ds:[esi+eax*2-30] EBX=esi+eax*2-30=36+0*2-30=6
0052F4F1 |. 0FB637 |movzx esi,byte ptr ds:[edi] ESI=byte ptr ds:[edi]处的数据:从0012FB9A到0012FBA2分别为:0 0 6 7 0 0 0 0 0 0
0052F4F4 |. 47 |inc edi EDI+1
0052F4F5 |.^ EB CF \jmp short FinalDat.0052F4C6 跳回去继续,
0052F4F7 |> 83FD 2D cmp ebp,2D EBP是-吗?
0052F4FA |. 8BC3 mov eax,ebx 重要地方,把EBX结果送到EAX
0052F4FC |. 75 02 jnz short FinalDat.0052F500 不是就跳
0052F4FE |. F7D8 neg eax
0052F500 |> 5F pop edi
0052F501 |. 5E pop esi
0052F502 |. 5D pop ebp
0052F503 |. 5B pop ebx
0052F504 \. C3 retn
每次循环后,EAX、EDX、EDI、ECX、EBX、EBP、ESI的值都会变化,并且应用于以后的运算。
其它调用地方算法相同,不再重复。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)