【文章标题】: [PYG]2007年度认证CrackMe的算法分析(DELPHI版)
【文章作者】: aCaFeeL[DCG][OCN][PYG]
【软件名称】: [PYG]CrackMe2007.EXE
【软件大小】: 241 KB (247,021 字节)
【下载地址】:
【加壳方式】: NsPacK V3.7
【保护方式】: 压缩加壳
【编写语言】: delphi
【使用工具】: OllyDBG v1.10、C32Asm v0.412、DeDe v3.5、W32Dasm v8.93、ImportREC v1.6f、LordPE v1.4、PEid v0.94、Filemon v7.01
【操作平台】: Windows 98 second 或者 Windows XP sp2
【软件介绍】: [PYG]2007年度成员认证CrackMe程序
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
简单说下注册流程:
Form1.OnCreat事件: 检测文件自身的大小、名称,生成机器码,检测key文件,其格式成功、长度相等便成功读入,将读入的注册名运算
后与读入的注册码比较,如数据相等,则Button1按钮也就可用了;
Timer2.Timer 事件: 再次检测文件大小、检测key文件,成功才会启用Button1按钮,否则是Button1_a假注册按钮;
Button1.Click事件: 将Email的字符串运算之后,连接注册名,再次运算后,得到大数运算需要的KEY,大数运算后得到注册码的第一部份
数据,然后将机器码作浮点实数运算,结果转换为字符串后成为注册码的第二部分数据;
Edit4.Change 事件: 重复Button1.Click事件的前面,然后将MD5加密后的真、假注册码比较,相同,再比较尾部是否为字符串"PYG2007",
相等,便启动Timer1.Timer事件;
Timer1.Timer 事件: 将Email的字符串运算后连接注册名,再次运算后,得到大数运算需要的KEY。。。后面雷同,省略了。
具体分析过程,如下:
CrackMe用了NsPacK V3.7压缩,将其脱壳后,在窗口启动时下断点,得到与注册相关的信息如下:
》》》》》》
004747B9 . 64:FF30 push dword ptr fs:[eax] ; 窗口创建时:
004747BC . 64:8920 mov dword ptr fs:[eax], esp
004747BF . E8 3811FEFF call [PYG]Cra.004558FC
004747C4 . 8D45 F4 lea eax, dword ptr [ebp-C]
004747C7 . BA E04C4700 mov edx, [PYG]Cra.00474CE0 ; [PYG]CrackMe2007.EXE
004747CC . E8 93FDF8FF call [PYG]Cra.00404564
004747D1 . 8D95 18FEFFFF lea edx, dword ptr [ebp-1E8]
004747D7 . A1 0C934700 mov eax, dword ptr [47930C]
004747DC . 8B00 mov eax, dword ptr [eax]
004747DE . E8 E9FDFDFF call [PYG]Cra.004545CC
004747E3 . 8B85 18FEFFFF mov eax, dword ptr [ebp-1E8](TApplication):AnsiString
004747E9 . E8 360EFEFF call [PYG]Cra.00455624
004747EE . 8BD8 mov ebx, eax
004747F0 . E8 0711FEFF call [PYG]Cra.004558FC
004747F5 . EB 01 jmp short [PYG]Cra.004747F8
004747F7 0F db 0F
004747F8 > 31F0 xor eax, esi
004747FA . EB 0C jmp short [PYG]Cra.00474808
004747FC > 33C8 xor ecx, eax
004747FE . EB 03 jmp short [PYG]Cra.00474803
00474800 > EB 09 jmp short [PYG]Cra.0047480B
00474802 0F db 0F
00474803 > 59 pop ecx
00474804 . 74 05 je short [PYG]Cra.0047480B
00474806 .^ 75 F8 jnz short [PYG]Cra.00474800
00474808 > 51 push ecx
00474809 .^ EB F1 jmp short [PYG]Cra.004747FC
0047480B > 81FB C0450400 cmp ebx, 445C0 ; 比较文件大小 与 280000
00474811 7F 39 jg short [PYG]Cra.0047484C ; 小于或等于,则不跳,表示没有被脱壳
00474813 . 8D95 14FEFFFF lea edx, dword ptr [ebp-1EC]
00474819 . A1 0C934700 mov eax, dword ptr [47930C]
0047481E . 8B00 mov eax, dword ptr [eax]
00474820 . E8 A7FDFDFF call [PYG]Cra.004545CC ; 得到程序名称
00474825 . 8B85 14FEFFFF mov eax, dword ptr [ebp-1EC]
0047482B . 50 push eax
0047482C . 8D95 10FEFFFF lea edx, dword ptr [ebp-1F0]
00474832 . 8B45 F4 mov eax, dword ptr [ebp-C]
00474835 . E8 8228FEFF call [PYG]Cra.004570BC ; Base64解密
0047483A . 8B95 10FEFFFF mov edx, dword ptr [ebp-1F0] ; 界密结果: "[PYG]CrackMe2007.EXE"
00474840 . 58 pop eax
00474841 . E8 9200F9FF call [PYG]Cra.004048D8 ; 比较文件名称
00474846 0F84 CA000000 je [PYG]Cra.00474916 ; 相等,则跳!
0047484C > 8B45 FC mov eax, dword ptr [ebp-4]
0047484F . 8B80 14030000 mov eax, dword ptr [eax+314] ; TButton1
00474855 . 33D2 xor edx, edx
00474857 . E8 A0FBFBFF call [PYG]Cra.004343FC ;Controls.TControl.SetVisible(TControl;Boolean)
0047485C . 8B45 FC mov eax, dword ptr [ebp-4]
0047485F . 8B80 14030000 mov eax, dword ptr [eax+314] ; TButton1
00474865 . 33D2 xor edx, edx
00474867 . 8B08 mov ecx, dword ptr [eax]
00474869 . FF51 64 call dword ptr [ecx+64]
0047486C . 8B45 FC mov eax, dword ptr [ebp-4]
0047486F . 8B80 30030000 mov eax, dword ptr [eax+330] ; TButton1_a
00474875 . B2 01 mov dl, 1
00474877 . 8B08 mov ecx, dword ptr [eax]
00474879 . FF51 64 call dword ptr [ecx+64]
0047487C . 8B45 FC mov eax, dword ptr [ebp-4]
0047487F . 8B80 30030000 mov eax, dword ptr [eax+330] ; TButton1_a
00474885 . B2 01 mov dl, 1
00474887 . E8 70FBFBFF call [PYG]Cra.004343FC ;Controls.TControl.SetVisible(TControl;Boolean)
0047488C . 8B45 FC mov eax, dword ptr [ebp-4]
0047488F . 8B80 00030000 mov eax, dword ptr [eax+300] ; TEdit2
00474895 . 33D2 xor edx, edx
00474897 . E8 A48AFBFF call [PYG]Cra.0042D340 ; StdCtrls.TCustomEdit.SetReadOnly
0047489C . E8 170FFEFF call [PYG]Cra.004557B8 ; TApplication._PROC_004557B8()
004748A1 . 33C0 xor eax, eax
004748A3 . 55 push ebp
004748A4 . 68 F4484700 push [PYG]Cra.004748F4
004748A9 . 64:FF30 push dword ptr fs:[eax] ; ***** TRY
004748AC . 64:8920 mov dword ptr fs:[eax], esp
004748AF . B8 084D4700 mov eax, [PYG]Cra.00474D08 ; c:\
004748B4 . E8 E30CFEFF call [PYG]Cra.0045559C
004748B9 . 69C0 39300000 imul eax, eax, 3039
004748BF . 05 2770430B add eax, 0B437027
004748C4 . 33D2 xor edx, edx
004748C6 . 52 push edx ; /Arg2 => 00000000
004748C7 . 50 push eax ; |Arg1
004748C8 . 8D85 0CFEFFFF lea eax, dword ptr [ebp-1F4] ; |
004748CE . E8 B93EF9FF call [PYG]Cra.0040878C ; \[PYG]Cra.0040878C
004748D3 . 8B95 0CFEFFFF mov edx, dword ptr [ebp-1F4]
004748D9 . 8B45 FC mov eax, dword ptr [ebp-4]
004748DC . 8B80 FC020000 mov eax, dword ptr [eax+2FC] ; TEdit1
004748E2 . E8 25FCFBFF call [PYG]Cra.0043450C ;Controls.TControl.SetText(TControl;TCaption)
004748E7 . 33C0 xor eax, eax
004748E9 . 5A pop edx
004748EA . 59 pop ecx
004748EB . 59 pop ecx
004748EC . 64:8910 mov dword ptr fs:[eax], edx
004748EF . E9 9E030000 jmp [PYG]Cra.00474C92
004748F4 .^ E9 23F3F8FF jmp [PYG]Cra.00403C1C
004748F9 . 8B45 FC mov eax, dword ptr [ebp-4]
004748FC . 8B80 FC020000 mov eax, dword ptr [eax+2FC] ; TEdit1
00474902 . BA 144D4700 mov edx, [PYG]Cra.00474D14 ; 123456789
00474907 . E8 00FCFBFF call [PYG]Cra.0043450C
0047490C . E8 73F6F8FF call [PYG]Cra.00403F84
00474911 . E9 7C030000 jmp [PYG]Cra.00474C92
00474916 > EB 01 jmp short [PYG]Cra.00474919 ; 检测正确,跳来了这里
00474918 0F db 0F
00474919 > 31F0 xor eax, esi
0047491B . EB 0C jmp short [PYG]Cra.00474929
0047491D > 33C8 xor ecx, eax
0047491F . EB 03 jmp short [PYG]Cra.00474924
00474921 > EB 09 jmp short [PYG]Cra.0047492C
00474923 0F db 0F
00474924 > 59 pop ecx
00474925 . 74 05 je short [PYG]Cra.0047492C
00474927 .^ 75 F8 jnz short [PYG]Cra.00474921
00474929 > 51 push ecx
0047492A .^ EB F1 jmp short [PYG]Cra.0047491D
0047492C > E8 770FFEFF call [PYG]Cra.004558A8 ; CreateFileA -> 打开Key文件
00474931 . E8 820EFEFF call [PYG]Cra.004557B8 ; TApplication._PROC_004557B8()
00474936 . 33C0 xor eax, eax
00474938 . 55 push ebp
00474939 . 68 86494700 push [PYG]Cra.00474986
0047493E . 64:FF30 push dword ptr fs:[eax] ; ***** TRY
00474941 . 64:8920 mov dword ptr fs:[eax], esp
00474944 . B8 084D4700 mov eax, [PYG]Cra.00474D08 ; c:\
00474949 . E8 4E0CFEFF call [PYG]Cra.0045559C ; 得到C:\下的卷标号
0047494E . 69C0 39300000 imul eax, eax, 3039 ; 卷标号与$3039 相乘 -> eax
00474954 . 05 2770430B add eax, 0B437027 ; 其结果 + $0B437027 -> eax
00474959 . 33D2 xor edx, edx
0047495B . 52 push edx ; /Arg2 => 00000000
0047495C . 50 push eax ; |Arg1
0047495D . 8D85 08FEFFFF lea eax, dword ptr [ebp-1F8] ; |
00474963 . E8 243EF9FF call [PYG]Cra.0040878C ; \[将上面的结果转换为无符号数字(即:机器码)
00474968 . 8B95 08FEFFFF mov edx, dword ptr [ebp-1F8] ; 结果 -》 eax
0047496E . 8B45 FC mov eax, dword ptr [ebp-4]
00474971 . 8B80 FC020000 mov eax, dword ptr [eax+2FC] ; TEdit1
00474977 . E8 90FBFBFF call [PYG]Cra.0043450C ;Controls.TControl.SetText(TControl;TCaption)
0047497C . 33C0 xor eax, eax
0047497E . 5A pop edx
0047497F . 59 pop ecx
00474980 . 59 pop ecx
00474981 . 64:8910 mov dword ptr fs:[eax], edx
00474984 . EB 1D jmp short [PYG]Cra.004749A3
00474986 .^ E9 91F2F8FF jmp [PYG]Cra.00403C1C
0047498B . 8B45 FC mov eax, dword ptr [ebp-4]
0047498E . 8B80 FC020000 mov eax, dword ptr [eax+2FC]
00474994 . BA 144D4700 mov edx, [PYG]Cra.00474D14 ; 123456789
00474999 . E8 6EFBFBFF call [PYG]Cra.0043450C
0047499E . E8 E1F5F8FF call [PYG]Cra.00403F84
004749A3 > E8 100EFEFF call [PYG]Cra.004557B8
004749A8 . 8D4D F8 lea ecx, dword ptr [ebp-8]
004749AB . 33D2 xor edx, edx
004749AD . B8 284D4700 mov eax, [PYG]Cra.00474D28 ; tR^A+.-%=tpc*
004749B2 . E8 0D0DFEFF call [PYG]Cra.004556C4 ; 解密后:oJG_4207.dau=
004749B7 . E8 FC0DFEFF call [PYG]Cra.004557B8
004749BC . 8D4D F8 lea ecx, dword ptr [ebp-8]
004749BF . 33D2 xor edx, edx
004749C1 . B8 404D4700 mov eax, [PYG]Cra.00474D40 ; thg^%#()_=3WD
004749C6 . E8 F90CFEFF call [PYG]Cra.004556C4 ; 解密后:op~@:?5;L-"AS
004749CB . E8 E80DFEFF call [PYG]Cra.004557B8
004749D0 . 8D4D F8 lea ecx, dword ptr [ebp-8]
004749D3 . 33D2 xor edx, edx
004749D5 . B8 584D4700 mov eax, [PYG]Cra.00474D58 ; FDS_^&$#@@~~_
004749DA . E8 E50CFEFF call [PYG]Cra.004556C4 ; 解密后:]\JAA:91SPohH
004749DF . E8 D40DFEFF call [PYG]Cra.004557B8
004749E4 . 8D4D F8 lea ecx, dword ptr [ebp-8]
004749E7 . 33D2 xor edx, edx
004749E9 . B8 704D4700 mov eax, [PYG]Cra.00474D70 ; TV%B^&()_+#$%
004749EE . E8 D10CFEFF call [PYG]Cra.004556C4 ; 解密后:ON<\A:5;L;222
004749F3 . E8 C00DFEFF call [PYG]Cra.004557B8 ; (最初的 CPU 选择)
004749F8 . 8D4D F8 lea ecx, dword ptr [ebp-8]
004749FB . 33D2 xor edx, edx
004749FD . B8 884D4700 mov eax, [PYG]Cra.00474D88 ; 2-atr^%hGIj-%
00474A02 . E8 BD0CFEFF call [PYG]Cra.004556C4 ; 解密后:)5xjmB8zTY{;2
00474A07 . E8 AC0DFEFF call [PYG]Cra.004557B8
00474A0C . EB 01 jmp short [PYG]Cra.00474A0F
00474A0E 0F db 0F
00474A0F > 31F0 xor eax, esi
00474A11 . EB 0C jmp short [PYG]Cra.00474A1F
00474A13 > 33C8 xor ecx, eax
00474A15 . EB 03 jmp short [PYG]Cra.00474A1A
00474A17 > EB 09 jmp short [PYG]Cra.00474A22
00474A19 0F db 0F
00474A1A > 59 pop ecx
00474A1B . 74 05 je short [PYG]Cra.00474A22
00474A1D .^ 75 F8 jnz short [PYG]Cra.00474A17
00474A1F > 51 push ecx
00474A20 .^ EB F1 jmp short [PYG]Cra.00474A13
00474A22 > 8D4D F8 lea ecx, dword ptr [ebp-8]
00474A25 . BA 01000000 mov edx, 1
00474A2A . B8 A04D4700 mov eax, [PYG]Cra.00474DA0 ; KA^A-,-%=tpb-
00474A2F . E8 900CFEFF call [PYG]Cra.004556C4 ; 解密后:PYG_2007.dat:
00474A34 . E8 7F0DFEFF call [PYG]Cra.004557B8
00474A39 . 8D95 00FEFFFF lea edx, dword ptr [ebp-200]
00474A3F . 33C0 xor eax, eax
00474A41 . E8 DEDFF8FF call [PYG]Cra.00402A24
00474A46 . 8B85 00FEFFFF mov eax, dword ptr [ebp-200]
00474A4C . 8D95 04FEFFFF lea edx, dword ptr [ebp-1FC]
00474A52 . E8 9142F9FF call [PYG]Cra.00408CE8
00474A57 . 8D85 04FEFFFF lea eax, dword ptr [ebp-1FC]
00474A5D . 8B55 F8 mov edx, dword ptr [ebp-8] ; KEy文件名称 -》 edx
00474A60 . E8 2FFDF8FF call [PYG]Cra.00404794
00474A65 . 8B85 04FEFFFF mov eax, dword ptr [ebp-1FC]
00474A6B . E8 B40BFEFF call [PYG]Cra.00455624
00474A70 . 8BD8 mov ebx, eax
00474A72 . E8 410DFEFF call [PYG]Cra.004557B8
00474A77 . 83FB FF cmp ebx, -1
00474A7A . 0F84 A2010000 je [PYG]Cra.00474C22 ; 如为空,则跳走
00474A80 . 83FB 20 cmp ebx, 20 ; 长度是否为: 32
00474A83 . 0F85 99010000 jnz [PYG]Cra.00474C22 ; 不相等,也跳走
00474A89 . 8D95 F8FDFFFF lea edx, dword ptr [ebp-208]
00474A8F . 33C0 xor eax, eax
00474A91 . E8 8EDFF8FF call [PYG]Cra.00402A24
00474A96 . 8B85 F8FDFFFF mov eax, dword ptr [ebp-208]
00474A9C . 8D95 FCFDFFFF lea edx, dword ptr [ebp-204]
00474AA2 . E8 4142F9FF call [PYG]Cra.00408CE8
00474AA7 . 8D85 FCFDFFFF lea eax, dword ptr [ebp-204]
00474AAD . 8B55 F8 mov edx, dword ptr [ebp-8]
00474AB0 . E8 DFFCF8FF call [PYG]Cra.00404794
00474AB5 . 8B95 FCFDFFFF mov edx, dword ptr [ebp-204]
00474ABB . 8D85 1CFEFFFF lea eax, dword ptr [ebp-1E4]
00474AC1 . E8 DEE2F8FF call [PYG]Cra.00402DA4
00474AC6 . 8D85 1CFEFFFF lea eax, dword ptr [ebp-1E4]
00474ACC . E8 6FE0F8FF call [PYG]Cra.00402B40
00474AD1 . E8 8EDDF8FF call [PYG]Cra.00402864
00474AD6 . 8D55 F0 lea edx, dword ptr [ebp-10]
00474AD9 . 8D85 1CFEFFFF lea eax, dword ptr [ebp-1E4]
00474ADF . E8 38E6F8FF call [PYG]Cra.0040311C
00474AE4 . 8D85 1CFEFFFF lea eax, dword ptr [ebp-1E4]
00474AEA . E8 99E6F8FF call [PYG]Cra.00403188
00474AEF . E8 70DDF8FF call [PYG]Cra.00402864
00474AF4 . 8D85 1CFEFFFF lea eax, dword ptr [ebp-1E4]
00474AFA . E8 61E3F8FF call [PYG]Cra.00402E60
00474AFF . E8 60DDF8FF call [PYG]Cra.00402864
00474B04 . 8D4D E8 lea ecx, dword ptr [ebp-18]
00474B07 . BA 10000000 mov edx, 10
00474B0C . 8B45 F0 mov eax, dword ptr [ebp-10]
00474B0F . E8 3453FBFF call [PYG]Cra.00429E48
00474B14 . 33DB xor ebx, ebx
00474B16 . B8 01000000 mov eax, 1 ; 循环初时计算KEY文件中的前16位
00474B1B > 8B55 F0 mov edx, dword ptr [ebp-10]
00474B1E . 0FB65402 FF movzx edx, byte ptr [edx+eax-1]
00474B23 . 83EA 0F sub edx, 0F ; 减去F
00474B26 . 83F2 20 xor edx, 20 ; xor 20
00474B29 . 03DA add ebx, edx ; ebx := ebx + edx;
00474B2B . 40 inc eax
00474B2C . 83F8 11 cmp eax, 11 ; 十进制:17
00474B2F .^ 75 EA jnz short [PYG]Cra.00474B1B ; 小于17
00474B31 . 66:9C pushfw
00474B33 . 6A 0A push 0A
00474B35 > E8 02000000 call [PYG]Cra.00474B3C
00474B3A .^ 73 F9 jnb short [PYG]Cra.00474B35
00474B3C $ 83C4 04 add esp, 4
00474B3F . FF0C24 dec dword ptr [esp]
00474B42 .^ 79 F1 jns short [PYG]Cra.00474B35
00474B44 . 83C4 04 add esp, 4
00474B47 . 66:9D popfw
00474B49 . 69C3 697A0000 imul eax, ebx, 7A69 ; 整数乘法 x $7A69
00474B4F . 8BD8 mov ebx, eax
00474B51 . 8D85 F4FDFFFF lea eax, dword ptr [ebp-20C]
00474B57 . 50 push eax ; /Arg1
00474B58 . 899D ECFDFFFF mov dword ptr [ebp-214], ebx ; |
00474B5E . C685 F0FDFFFF 00 mov byte ptr [ebp-210], 0 ; |
00474B65 . 8D95 ECFDFFFF lea edx, dword ptr [ebp-214] ; |
00474B6B . 33C9 xor ecx, ecx ; |
00474B6D . B8 B84D4700 mov eax, [PYG]Cra.00474DB8 ; |%0x
00474B72 . E8 B149F9FF call [PYG]Cra.00409528 ; \[将上面的结果转换成字符串
00474B77 . 8B85 F4FDFFFF mov eax, dword ptr [ebp-20C] ; 字符串 -> eax 中
00474B7D . 8D55 EC lea edx, dword ptr [ebp-14]
00474B80 . E8 CB37F9FF call [PYG]Cra.00408350
00474B85 . 66:9C pushfw
00474B87 . 6A 0A push 0A
00474B89 > E8 02000000 call [PYG]Cra.00474B90
00474B8E .^ 73 F9 jnb short [PYG]Cra.00474B89
00474B90 $ 83C4 04 add esp, 4
00474B93 . FF0C24 dec dword ptr [esp]
00474B96 .^ 79 F1 jns short [PYG]Cra.00474B89
00474B98 . 83C4 04 add esp, 4
00474B9B . 66:9D popfw
00474B9D . 8D95 E8FDFFFF lea edx, dword ptr [ebp-218]
00474BA3 . 8B45 E8 mov eax, dword ptr [ebp-18] ; 取后面的16个字符串
00474BA6 . E8 F539F9FF call [PYG]Cra.004085A0 ; 返回一个删除了空制字符和空格的结果字符串
00474BAB . 8B85 E8FDFFFF mov eax, dword ptr [ebp-218] ; -》 eax
00474BB1 . 8B55 EC mov edx, dword ptr [ebp-14] ; 前16位数的运算结果
00474BB4 . E8 1FFDF8FF call [PYG]Cra.004048D8 ; 比较两字符串 是否 相等?
00474BB9 . 0F85 D3000000 jnz [PYG]Cra.00474C92 ; 不相等,便跳走!
00474BBF . 8B45 FC mov eax, dword ptr [ebp-4]
》》》》》》
通过对上面的的分析,知道了机器码为:得到C:盘的卷标序列号,然后乘以12345,再加上188968999的结果的无符号数;
而KEY文件的名称为:PYG_2007.dat,其长度必须是32字节,前16位保存注册名,后16位保存注册码,其算法表述为:
var
pos, ebx, edx : integer;
ResultName : string;
handle : Thandle;
const
name : array[1..16] of byte =
($00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00);
code : array[1..16] of char = //默认为16个空格符号
(' ',' ',' ',' ',' ',' ',' ',' ',
' ',' ',' ',' ',' ',' ',' ',' ');
begin
for pos := 1 to length(Form1.EditName.Text) do
name[pos] := ord(Form1.EditName.Text[pos]);
EBX := 0;
for pos := 1 to length(name) do
begin
EDX := ord(name[pos]) - $0F;
EDX := EDX xor $20;
EBX := EBX + EDX;
end;
EBX := EBX * $7A69;
ResultName := int2hex(EBX,0);
for pos := 1 to length(ResultName) do
code[pos] := ResultName[pos];
end;
然后,将name和code的缓冲区中的数据写入到PYG_2007.dat文件中,即可!
前面的条件符合之后,再看Timer2.Timer事件中的代码,如下:
》》》》》》
0047672E . 64:FF30 push dword ptr fs:[eax] ; Timer2.Timer事件:
00476731 . 64:8920 mov dword ptr fs:[eax], esp
00476734 . E8 C3F1FDFF call [PYG]Cra.004558FC
00476739 . 8D95 1CFEFFFF lea edx, dword ptr [ebp-1E4]
0047673F . A1 0C934700 mov eax, dword ptr [47930C]
00476744 . 8B00 mov eax, dword ptr [eax]
00476746 . E8 81DEFDFF call [PYG]Cra.004545CC ; 得到程序名称
0047674B . 8B85 1CFEFFFF mov eax, dword ptr [ebp-1E4]
00476751 . E8 CEEEFDFF call [PYG]Cra.00455624
00476756 . 3D C0450400 cmp eax, 445C0 ; 十进制:280000
0047675B 0F8E CA000000 jle [PYG]Cra.0047682B ; 小于,便跳!(表示:加了壳)
00476761 . 8B45 FC mov eax, dword ptr [ebp-4]
(省略)
0047682B > E8 78F0FDFF call [PYG]Cra.004558A8 ; CreateFileA
00476830 . E8 83EFFDFF call [PYG]Cra.004557B8
00476835 . 33C0 xor eax, eax
00476837 . 55 push ebp
00476838 . 68 85684700 push [PYG]Cra.00476885
0047683D . 64:FF30 push dword ptr fs:[eax] ; ***** TRY
00476840 . 64:8920 mov dword ptr fs:[eax], esp
00476843 . B8 886B4700 mov eax, [PYG]Cra.00476B88 ; c:\
00476848 . E8 4FEDFDFF call [PYG]Cra.0045559C ; 得到C:\的序列号
0047684D . 69C0 39300000 imul eax, eax, 3039
00476853 . 05 2770430B add eax, 0B437027 ; eax 的10进制结果为机器码
00476858 . 33D2 xor edx, edx
0047685A . 52 push edx ; /Arg2 => 00000000
0047685B . 50 push eax ; |Arg1
0047685C . 8D85 14FEFFFF lea eax, dword ptr [ebp-1EC] ; |
00476862 . E8 251FF9FF call [PYG]Cra.0040878C ; \[PYG]Cra.0040878C
00476867 . 8B95 14FEFFFF mov edx, dword ptr [ebp-1EC] ; //机器码,上面结果的无符号数字
0047686D . 8B45 FC mov eax, dword ptr [ebp-4]
(省略)
0047694E . 8B85 10FEFFFF mov eax, dword ptr [ebp-1F0]
00476954 . E8 CBECFDFF call [PYG]Cra.00455624
00476959 . 8BD8 mov ebx, eax
0047695B . E8 58EEFDFF call [PYG]Cra.004557B8
00476960 . 83FB FF cmp ebx, -1 ; 为空
00476963 . 0F84 72010000 je [PYG]Cra.00476ADB ; 不能跳!
00476969 . 83FB 20 cmp ebx, 20 ; 十进制:32
0047696C . 0F85 69010000 jnz [PYG]Cra.00476ADB ; 不能跳!
00476972 . 8D95 04FEFFFF lea edx, dword ptr [ebp-1FC]
(省略)
004769FD . 33DB xor ebx, ebx
004769FF . B8 01000000 mov eax, 1
00476A04 > 8B55 F4 mov edx, dword ptr [ebp-C] ; 取前16位数字
00476A07 . 0FB65402 FF movzx edx, byte ptr [edx+eax-1]
00476A0C . 83EA 0F sub edx, 0F
00476A0F . 83F2 20 xor edx, 20
00476A12 . 03DA add ebx, edx
00476A14 . 40 inc eax
00476A15 . 83F8 11 cmp eax, 11 ; 十进制:17
00476A18 .^ 75 EA jnz short [PYG]Cra.00476A04 ; 小于17
00476A1A . 69C3 697A0000 imul eax, ebx, 7A69 ; 整乘法
00476A20 . 8BD8 mov ebx, eax
00476A22 . 8D85 00FEFFFF lea eax, dword ptr [ebp-200]
00476A28 . 50 push eax ; /Arg1
00476A29 . 899D F8FDFFFF mov dword ptr [ebp-208], ebx ; |
00476A2F . C685 FCFDFFFF 00 mov byte ptr [ebp-204], 0 ; |
00476A36 . 8D95 F8FDFFFF lea edx, dword ptr [ebp-208] ; |
00476A3C . 33C9 xor ecx, ecx ; |
00476A3E . B8 386C4700 mov eax, [PYG]Cra.00476C38 ; |%0x
00476A43 . E8 E02AF9FF call [PYG]Cra.00409528 ; \[PYG]Cra.00409528
00476A48 . 8B85 00FEFFFF mov eax, dword ptr [ebp-200] ; //结果
00476A4E . 8D55 F0 lea edx, dword ptr [ebp-10]
00476A51 . E8 FA18F9FF call [PYG]Cra.00408350 ; SysUtils.UpperCase(AnsiString):AnsiString;
00476A56 . 8D95 F4FDFFFF lea edx, dword ptr [ebp-20C]
00476A5C . 8B45 EC mov eax, dword ptr [ebp-14] ; 取后16位数字
00476A5F . E8 3C1BF9FF call [PYG]Cra.004085A0 ;SysUtils.Trim(AnsiString):AnsiString;overload;
00476A64 . 8B85 F4FDFFFF mov eax, dword ptr [ebp-20C]
00476A6A . 8B55 F0 mov edx, dword ptr [ebp-10]
00476A6D . E8 66DEF8FF call [PYG]Cra.004048D8 ; System.@LStrCmp;
00476A72 . 0F85 C3000000 jnz [PYG]Cra.00476B3B ; 不能跳!要相等
00476A78 . 8B45 FC mov eax, dword ptr [ebp-4]
(省略)
》》》》》》
通过对上面的分析,发现其检测的代码和窗口创建时候的几乎雷同,故跳过,不用分析了;
但是必须注意:
要将 0047675B /0F8E CA000000 jle [PYG]Cra.0047682B 这行改为jmp强制跳转哟!
不然到不了Button1按钮中的代码,呵呵;谁让我不是带壳调试呐 ;)
将上面修改之后,这时点击『注册』按钮,便来到了Button1按钮点击后的事件中(不是Button1_a按钮哟),其代码如下:
[注意]看雪招聘,专注安全领域的专业人才平台!