程序用Asprotect加密,有人提供了key,于是试了下有key与无key的脱壳,受益菲浅.
经过进一步的功能分析,发现功能部分还有暗桩:一个CRC验证,一个key解码及1处Stolen code.
软件名称: Aston 1.92
下载页面: http://fzjd.hanzify.org/downfiles/Aston_192.zip
软件大小: 3.53 MB
软件语言: 英文
软件类别: 国外软件 / 特别版 / 系统模拟
应用平台: Win2003, WinXp, Win2000, Nt, WinMe, Win9x
推荐等级: *****
软件介绍: Aston 是一个容易使用、执行速度快的Windows外壳,他不需要高速的电脑硬件,执行起来也非常稳定,对于内存及系统资源的需求较少,让电脑系统能够有更好的性能表现。安装完后无需重新启动,只要注销一次即可更换你的桌面。
压缩包内附带 serial 信息。
Version: ASProtect 1.35 build 04.25 Release [Extract]
好几个程序都加了Asp壳,挑其中一个试试:A-Master.exe. A-Master.exe:
1.未注册进行脱壳:
1.1 Volx脚本运行到OEP:
00433154 55 push ebp
00433155 8BEC mov ebp,esp
00433157 83C4 F4 add esp,-0C
0043315A B8 24304300 mov eax,A-Master.00433024
0043315F E8 ACDFFCFF call A-Master.00401110
00433164 E8 27CAFDFF call A-Master.0040FB90
00433169 E8 9EDEFCFF call A-Master.0040100C
0043316E 8BC0 mov eax,eax
00433170 0000 add byte ptr ds:[eax],al
00433172 0000 add byte ptr ds:[eax],al
00433174 0000 add byte ptr ds:[eax],al
对比脚本发现:
Aspr2.XX_IATfixer_v1.02.osc // F9后程序退出
Asprotect 2.xx SKE OEP finder.txt // F9后程序正常启动
1.2 CRC验证
从OEP往下,第二个call进去后不久
00432D34 56 push esi
00432D35 53 push ebx
00432D36 E8 72000000 call A-Master.00432DAD
00432D3B BE A64E4200 mov esi,A-Master.00424EA6
00432D40 037424 38 add esi,dword ptr ss:[esp+38]
00432D44 8D7424 04 lea esi,dword ptr ss:[esp+4]
00432D48 8D7426 F8 lea esi,dword ptr ds:[esi-8]
00432D4C 8B36 mov esi,dword ptr ds:[esi]
00432D4E 8DB40E 55E4FCFF lea esi,dword ptr ds:[esi+ecx+FFFCE455]
00432D55 2BF1 sub esi,ecx
00432D57 8D5C11 17 lea ebx,dword ptr ds:[ecx+edx+17]
00432D5B 2BDA sub ebx,edx
00432D5D 8B1E mov ebx,dword ptr ds:[esi]
00432D5F 81E3 FF000000 and ebx,0FF
00432D65 BE 46504300 mov esi,A-Master.00435046
00432D6A 037424 38 add esi,dword ptr ss:[esp+38]
00432D6E 68 F2402834 push 342840F2
00432D73 8D7447 29 lea esi,dword ptr ds:[edi+eax*2+29]
00432D77 8D740E D7 lea esi,dword ptr ds:[esi+ecx-29]
00432D7B 2BF1 sub esi,ecx
00432D7D 5E pop esi
00432D7E 8D9C0B 26BED7CB lea ebx,dword ptr ds:[ebx+ecx+CBD7BE26]
00432D85 2BD9 sub ebx,ecx
00432D87 03DE add ebx,esi
00432D89 0BDB or ebx,ebx
00432D8B /0F84 24000000 je A-Master.00432DB5 ; CRC,jmp 00432DB5
00432D91 8D6C75 F3 lea ebp,dword ptr ss:[ebp+esi*2-D]
00432D95 8D740B 5A lea esi,dword ptr ds:[ebx+ecx+5A]
00432D99 2BF1 sub esi,ecx
00432D9B C1CF B7 ror edi,0B7
00432D9E C1CF D3 ror edi,0D3
00432DA1 64:FF35 00000000 push dword ptr fs:[0]
00432DA8 E9 08000000 jmp A-Master.00432DB5
00432DAD 337424 08 xor esi,dword ptr ss:[esp+8]
00432DB1 C1D6 6D rcl esi,6D
00432DB4 C3 retn
00432DB5 5B pop ebx
00432DB6 5E pop esi
00432DB7 E9 88000000 jmp A-Master.00432E44
1.3 异常
步过00432E6F call A-Master.004328D8 发生异常,地址00000000不易读取:
跟进后来到:
00432AAB B8 482B4300 mov eax,A-Master.00432B48 ; ASCII "ColorClass"
00432AB0 8946 24 mov dword ptr ds:[esi+24],eax
00432AB3 56 push esi
00432AB4 E8 87EAFCFF call <jmp.&user32.RegisterClassA>
00432AB9 66:85C0 test ax,ax
00432ABC 74 40 je short A-Master.00432AFE
00432ABE E9 10000000 jmp A-Master.00432AD3 ; jmp 00432AFC
00432AC3 ^ 7C 97 jl short A-Master.00432A5C
00432AC5 E4 08 in al,8
00432AC7 33EE xor ebp,esi
00432AC9 2E:0921 or dword ptr cs:[ecx],esp
00432ACC - E9 A1B36FAA jmp AAB2DE72
00432AD1 90 nop
00432AD2 90 nop
00432AD3 A1 68604300 mov eax,dword ptr ds:[436068]
00432AD8 8B00 mov eax,dword ptr ds:[eax]
00432ADA 50 push eax
00432ADB A1 545A4300 mov eax,dword ptr ds:[435A54]
00432AE0 8B00 mov eax,dword ptr ds:[eax]
00432AE2 50 push eax
00432AE3 E8 30E7FCFF call <jmp.&kernel32.GetProcAddress>
00432AE8 FFD0 call eax ; 这里eax=0,异常
00432AEA 8B15 E05F4300 mov edx,dword ptr ds:[435FE0] ; A-Master.004484D0
00432AF0 8902 mov dword ptr ds:[edx],eax
00432AF2 A1 E05F4300 mov eax,dword ptr ds:[435FE0]
00432AF7 8338 00 cmp dword ptr ds:[eax],0
00432AFA 74 02 je short A-Master.00432AFE
00432AFC B3 01 mov bl,1
00432AFE 8BC3 mov eax,ebx
00432B00 5F pop edi
00432B01 5E pop esi
00432B02 5B pop ebx
00432B03 C3 retn
跟踪发现原程序从00432AD3到00432AFA,堆栈没有变化,寄存器只有eax与edx有变化,就是ds:[435FE0]保存的地址=004484D0;整个过程对ds:[004484D0]进行赋值并比较是否为0,原程序在00432AFA跳转未实现.
而eax在00432AFE马上被ebx填充,跟踪edx,发现在下面这行代码处被枪毙:
00432F8B E8 F0A0FEFF call A-Master.0041D080 ; 跟进
0041D08B 33D2 xor edx,edx ; A-Master.004484D0
因此可以说,这一段从00432AD3到00432AFA无用处,于是修改00432ABE为:
00432ABE E9 10000000 jmp A-Master.00432AD3 ; jmp 00432AFC
或者可以修改00432AD3为:
00432AD3 B8 01000000 mov eax,1D ; 原程序为1D,保留
00432AD8 EB 10 jmp short A-Master.00432AEA
1.4 Stolen code 1:
修改了上面2次,F9,异常,0148042B不易读取:
0043009B E8 3014FDFF call <jmp.&user32.InvalidateRect>
004300A0 - E9 86030501 jmp 0148042B
跟踪原程序得到code:
0043009B E8 3014FDFF call <jmp.&user32.InvalidateRect>
004300A0 8BC3 mov eax,ebx
004300A2 5B pop ebx
004300A3 8BE5 mov esp,ebp
004300A5 5D pop ebp
004300A6 C2 1000 retn 10
1.5 程序退出:自校验?
F9,程序退出,从00432E6F往下继续跟踪:
00432F9A A1 105D4300 mov eax,dword ptr ds:[435D10]
00432F9F 8038 00 cmp byte ptr ds:[eax],0
00432FA2 75 16 jnz short A-Master.00432FBA ; 跳转实现,over
对ds:[435D10]下硬件访问断点,重新加载:
第一次写入0:
00432C75 A1 105D4300 mov eax,dword ptr ds:[435D10]
00432C7A C600 00 mov byte ptr ds:[eax],0
第二次写入1:
00432E44 E8 BFF9FCFF call A-Master.00402808 ; 需要修改赋值
00432E49 84C0 test al,al
00432E4B 74 07 je short A-Master.00432E54 ; 或者修改这里
00432E4D E8 F645FDFF call A-Master.00407448
00432E52 EB 11 jmp short A-Master.00432E65 ; 要在这里跳转
00432E54 833E 00 cmp dword ptr ds:[esi],0
00432E57 74 04 je short A-Master.00432E5D
00432E59 33C0 xor eax,eax
00432E5B 8906 mov dword ptr ds:[esi],eax
00432E5D A1 105D4300 mov eax,dword ptr ds:[435D10]
00432E62 C600 01 mov byte ptr ds:[eax],1
00432E65 E8 1A3BFDFF call A-Master.00406984
00432E6A E8 919FFEFF call A-Master.0041CE00
00432E6F E8 64FAFFFF call A-Master.004328D8
00432E74 84C0 test al,al
00432E76 0F84 48010000 je A-Master.00432FC4
若要避开1的赋值,溯源,需要修改00432E4B的跳转,或者修改00432E44的call里面的值.
跟进:00432E44 E8 BFF9FCFF call A-Master.00402808
...
00402867 /0F85 31000000 jnz A-Master.0040289E ; 这个nop掉
0040286D |035424 38 add edx,dword ptr ss:[esp+38]
00402871 |BA F6CA4800 mov edx,A-Master.0048CAF6
00402876 |33D2 xor edx,edx
00402878 |8D4447 69 lea eax,dword ptr ds:[edi+eax*2+69]
0040287C |8D4408 97 lea eax,dword ptr ds:[eax+ecx-69]
00402880 |2BC1 sub eax,ecx
00402882 |2BC0 sub eax,eax
00402884 |B8 B6C64600 mov eax,A-Master.0046C6B6
00402889 |B8 6E584600 mov eax,A-Master.0046586E
0040288E |8D4422 52 lea eax,dword ptr ds:[edx+52]
00402892 |8D4408 AE lea eax,dword ptr ds:[eax+ecx-52]
00402896 |2BC1 sub eax,ecx
00402898 |40 inc eax ; 赋值的不同
00402899 |E9 15000000 jmp A-Master.004028B3
0040289E \81C8 3A21A872 or eax,72A8213A
004028A4 33C0 xor eax,eax ; 赋值的不同
004028A6 E9 08000000 jmp A-Master.004028B3
004028AB 83C9 43 or ecx,43
004028AE 034C24 38 add ecx,dword ptr ss:[esp+38]
004028B2 C3 retn
004028B3 5A pop edx
004028B4 59 pop ecx
004028B5 EB 61 jmp short A-Master.00402918
1.6 Stolen code 2:
异常,01480000不易读取:
0042FF61 /E9 01000000 jmp A-Master.0042FF67
0042FF66 |90 nop
0042FF67 -\E9 94000501 jmp 01480000
跟踪原程序:
0042FF67 6A 00 push 0
0042FF69 6A 00 push 0
0042FF6B 6A 02 push 2
0042FF6D 6A 00 push 0
0042FF6F 6A 00 push 0
0042FF71 6A 01 push 1
0042FF73 6A 00 push 0
0042FF75 6A 00 push 0
0042FF77 6A 00 push 0
0042FF79 68 BC020000 push 2BC
0042FF7E 6A 00 push 0
0042FF80 6A 00 push 0
0042FF82 6A 06 push 6
0042FF84 6A 0F push 0F
0042FF86 E8 4D13FDFF call <jmp.&gdi32.CreateFontA>
0042FF8B 8B15 585C4300 mov edx,dword ptr ds:[435C58] ; A-Master.00448598
0042FF91 8902 mov dword ptr ds:[edx],eax
0042FF93 8D45 FC lea eax,dword ptr ss:[ebp-4]
0042FF96 50 push eax
0042FF97 6A 04 push 4
0042FF99 6A 00 push 0
0042FF9B 68 E0C14100 push A-Master.0041C1E0
0042FFA0 6A 00 push 0
0042FFA2 6A 00 push 0
0042FFA4 E8 0712FDFF call <jmp.&kernel32.CreateThread>
0042FFA9 8B15 6C5E4300 mov edx,dword ptr ds:[435E6C] ; A-Master.00445A80
0042FFAF 8902 mov dword ptr ds:[edx],eax
0042FFB1 A1 4C5B4300 mov eax,dword ptr ds:[435B4C]
0042FFB6 C600 01 mov byte ptr ds:[eax],1
0042FFB9 68 CA000000 push 0CA
0042FFBE 68 20010000 push 120
0042FFC3 6A 05 push 5
0042FFC5 6A 00 push 0
0042FFC7 8D45 EC lea eax,dword ptr ss:[ebp-14]
0042FFCA 50 push eax
0042FFCB E8 C815FDFF call <jmp.&user32.SetRect>
0042FFD0 8D45 EC lea eax,dword ptr ss:[ebp-14]
0042FFD3 50 push eax
0042FFD4 8B45 08 mov eax,dword ptr ss:[ebp+8]
0042FFD7 50 push eax
0042FFD8 E8 2B15FDFF call <jmp.&user32.MapDialogRect>
0042FFDD 6A 00 push 0
0042FFDF A1 08704300 mov eax,dword ptr ds:[437008]
0042FFE4 50 push eax
0042FFE5 6A 00 push 0
0042FFE7 8B45 08 mov eax,dword ptr ss:[ebp+8]
0042FFEA 50 push eax
0042FFEB 8B45 F8 mov eax,dword ptr ss:[ebp-8]
0042FFEE 50 push eax
0042FFEF 8B45 F4 mov eax,dword ptr ss:[ebp-C]
0042FFF2 50 push eax
0042FFF3 8B45 F0 mov eax,dword ptr ss:[ebp-10]
0042FFF6 50 push eax
0042FFF7 8B45 EC mov eax,dword ptr ss:[ebp-14]
0042FFFA 50 push eax
0042FFFB 68 00000040 push 40000000
00430000 A1 F85E4300 mov eax,dword ptr ds:[435EF8]
00430005 8B00 mov eax,dword ptr ds:[eax]
00430007 50 push eax
00430008 A1 F85E4300 mov eax,dword ptr ds:[435EF8]
0043000D 8B00 mov eax,dword ptr ds:[eax]
0043000F 50 push eax
00430010 68 00020000 push 200
00430015 E8 8613FDFF call <jmp.&user32.CreateWindowExA>
0043001A 8B15 44604300 mov edx,dword ptr ds:[436044] ; A-Master.00448588
00430020 8902 mov dword ptr ds:[edx],eax
00430022 8D45 EC lea eax,dword ptr ss:[ebp-14]
00430025 50 push eax
00430026 A1 44604300 mov eax,dword ptr ds:[436044]
0043002B 8B00 mov eax,dword ptr ds:[eax]
0043002D 50 push eax
0043002E E8 0D14FDFF call <jmp.&user32.GetClientRect>
00430033 8B55 F8 mov edx,dword ptr ss:[ebp-8]
00430036 8B45 F4 mov eax,dword ptr ss:[ebp-C]
00430039 E8 9ECBFEFF call A-Master.0041CBDC
0043003E A1 6C5E4300 mov eax,dword ptr ds:[435E6C]
00430043 8B00 mov eax,dword ptr ds:[eax]
00430045 50 push eax
00430046 E8 0512FDFF call <jmp.&kernel32.ResumeThread>
0043004B 6A 05 push 5
0043004D A1 44604300 mov eax,dword ptr ds:[436044]
00430052 8B00 mov eax,dword ptr ds:[eax]
00430054 50 push eax
00430055 E8 9615FDFF call <jmp.&user32.ShowWindow>
0043005A A1 44604300 mov eax,dword ptr ds:[436044]
0043005F 8B00 mov eax,dword ptr ds:[eax]
00430061 50 push eax
00430062 E8 B915FDFF call <jmp.&user32.UpdateWindow>
00430067 EB 37 jmp short A-Master.004300A0
6A 00 6A 00 6A 02 6A 00 6A 00 6A 01 6A 00 6A 00 6A 00 68 BC 02 00 00 6A 00 6A 00 6A 06 6A 0F E8
4D 13 FD FF 8B 15 58 5C 43 00 89 02 8D 45 FC 50 6A 04 6A 00 68 E0 C1 41 00 6A 00 6A 00 E8 07 12
FD FF 8B 15 6C 5E 43 00 89 02 A1 4C 5B 43 00 C6 00 01 68 CA 00 00 00 68 20 01 00 00 6A 05 6A 00
8D 45 EC 50 E8 C8 15 FD FF 8D 45 EC 50 8B 45 08 50 E8 2B 15 FD FF 6A 00 A1 08 70 43 00 50 6A 00
8B 45 08 50 8B 45 F8 50 8B 45 F4 50 8B 45 F0 50 8B 45 EC 50 68 00 00 00 40 A1 F8 5E 43 00 8B 00
50 A1 F8 5E 43 00 8B 00 50 68 00 02 00 00 E8 86 13 FD FF 8B 15 44 60 43 00 89 02 8D 45 EC 50 A1
44 60 43 00 8B 00 50 E8 0D 14 FD FF 8B 55 F8 8B 45 F4 E8 9E CB FE FF A1 6C 5E 43 00 8B 00 50 E8
05 12 FD FF 6A 05 A1 44 60 43 00 8B 00 50 E8 96 15 FD FF A1 44 60 43 00 8B 00 50 E8 B9 15 FD FF
EB 37
Ctrl+B搜索E9 ?? ?? 05 01,只搜索到2处:
004300A0 - E9 86030501 jmp 0148042B
0042FF67 -\E9 94000501 jmp 01480000
因此应该没有Stolen code了.
然后程序可以启动进入了.
1.7 About注册标志:
Alt+M搜索:UNREGISTERED:
对0041CB9C下硬件访问断点.
77E7DF8D F2:AE repne scas byte ptr es:[edi]
返回:
0041CA17 E8 6C48FEFF call <jmp.&kernel32.lstrcat>
0041CA1C A1 E05F4300 mov eax,dword ptr ds:[435FE0]
往上找:
0041C8A3 BD 9CCB4100 mov ebp,A-Master.0041CB9C ; ASCII "UNREGISTERED You have "
0041C8A8 B8 B4CB4100 mov eax,A-Master.0041CBB4 ; ASCII " day(s) left"
0041C8AD 890424 mov dword ptr ss:[esp],eax
0041C8B0 B8 C4CB4100 mov eax,A-Master.0041CBC4 ; ASCII "Registered to:"
重新加载,F4到0041C8A3,F8步进跟踪:
0041C9E9 A1 785C4300 mov eax,dword ptr ds:[435C78] ; ds:[435C78]=004343B0
004343B0 00402DB0 ASCII "A S T O N 1.9.2 Shell &... // About的提示信息
0041CA1C A1 E05F4300 mov eax,dword ptr ds:[435FE0] ; ds:[00435FE0]=004484D0
004484D0 00000000 // 剩余的试用时间
然后来到:
0041CA41 E8 4248FEFF call <jmp.&kernel32.lstrcat>
0041CA46 /E9 A1000000 jmp A-Master.0041CAEC ; 这里跳过一大段代码,估计需要key解密
0041CA4B |EE out dx,al
0041CA4C |97 xchg eax,edi
0041CA4D |E4 08 in al,8
0041CA4F |33EE xor ebp,esi
0041CA51 |100CD4 adc byte ptr ss:[esp+edx*8],cl
0041CA54 |53 push ebx
0041CA55 |1E push ds
0041CA56 |93 xchg eax,ebx
0041CA57 |CA 8162 retf 6281
0041CA5A |6D ins dword ptr es:[edi],dx
0041CA5B |2F das
0041CA5C -|E9 2BC81274 jmp 7454928C
0041CA61 |14 10 adc al,10
0041CA63 |58 pop eax
0041CA64 |44 inc esp
0041CA65 |46 inc esi
0041CA66 |55 push ebp
0041CA67 |5D pop ebp
0041CA68 |3940 BE cmp dword ptr ds:[eax-42],eax
0041CA6B |1F pop ds
0041CA6C |E5 88 in eax,88
0041CA6E |AA stos byte ptr es:[edi]
0041CA6F |3012 xor byte ptr ds:[edx],dl
0041CA71 |71 0F jno short A-Master.0041CA82
0041CA73 |0A97 90D1251B or dl,byte ptr ds:[edi+1B25D190]
0041CA79 |9D popfd
0041CA7A |05 DEC742E0 add eax,E042C7DE
0041CA7F |D7 xlat byte ptr ds:[ebx+al]
0041CA80 |6F outs dx,dword ptr es:[edi]
0041CA81 |EF out dx,eax
0041CA82 ^|76 F6 jbe short A-Master.0041CA7A
0041CA84 |B5 16 mov ch,16
0041CA86 |ED in eax,dx
0041CA87 |53 push ebx
0041CA88 |E6 50 out 50,al
0041CA8A |07 pop es
0041CA8B |84B8 F123B239 test byte ptr ds:[eax+39B223F1],bh
0041CA91 |06 push es
0041CA92 |8B8F E25A4F7D mov ecx,dword ptr ds:[edi+7D4F5AE2]
0041CA98 |4B dec ebx
0041CA99 |C6 ??? ; 未知命令
0041CA9A |F2: prefix repne:
0041CA9B |B0 C2 mov al,0C2
0041CA9D |E5 7F in eax,7F
0041CA9F |34 40 xor al,40
0041CAA1 |E5 D3 in eax,0D3
0041CAA3 |286D 3C sub byte ptr ss:[ebp+3C],ch
0041CAA6 |DAB4F4 EC536C4A fidiv dword ptr ss:[esp+esi*8+4A6C53EC]
0041CAAD |F4 hlt
0041CAAE |A9 C470889A test eax,9A8870C4
0041CAB3 |F5 cmc
0041CAB4 |56 push esi
0041CAB5 |2E:D6 salc
0041CAB7 |04 19 add al,19
0041CAB9 |24 2F and al,2F
0041CABB |3D EECAEDAD cmp eax,ADEDCAEE
0041CAC0 |5C pop esp
0041CAC1 |43 inc ebx
0041CAC2 |45 inc ebp
0041CAC3 |21EE and esi,ebp
0041CAC5 |84DE test dh,bl
0041CAC7 |DACA fcmove st,st(2)
0041CAC9 |30CD xor ch,cl
0041CACB |41 inc ecx
0041CACC |A4 movs byte ptr es:[edi],byte ptr ds:[esi]
0041CACD |8F ??? ; 未知命令
0041CACE |BA BD759301 mov edx,19375BD
0041CAD3 |8DCF lea ecx,edi ; 非法使用寄存器
0041CAD5 |63DF arpl di,bx
0041CAD7 |BA 0E62AC0A mov edx,0AAC620E
0041CADC |0010 add byte ptr ds:[eax],dl
0041CADE |75 6A jnz short A-Master.0041CB4A
0041CAE0 |5C pop esp
0041CAE1 |1E push ds
0041CAE2 |B5 68 mov ch,68
0041CAE4 |CB retf
0041CAE5 |A6 cmps byte ptr ds:[esi],byte ptr es:[edi]
0041CAE6 |6B4D 38 52 imul ecx,dword ptr ss:[ebp+38],52
0041CAEA |8832 mov byte ptr ds:[edx],dh
0041CAEC \68 110C0000 push 0C11
0041CAF1 8D4424 18 lea eax,dword ptr ss:[esp+18]
2.注册后再进行脱壳.
注册软件,OD重新加载,IAT修复脚本运行到OEP,dump&refix.
2.1 修复CRC验证:
00432D8B /0F84 24000000 je A-Master.00432DB5 ; 改jmp
2.2 Ctrl+G:00432ABE
发现注册后就是不一样,这里变了,不用修复:
00432ABE /E9 01000000 jmp A-Master.00432AC4 ; 变了
00432AC3 |58 pop eax
00432AC4 \E9 00000000 jmp A-Master.00432AC9
00432AC9 B3 01 mov bl,1
00432ACB EB 31 jmp short A-Master.00432AFE ; 目的地一样
2.3 恢复2处Stolen code:
0043009B E8 3014FDFF call <jmp.&user32.InvalidateRect>
004300A0 - E9 86030501 jmp 0148042B
0042FF61 /E9 01000000 jmp A-Master.0042FF67
0042FF66 |90 nop
0042FF67 -\E9 94000501 jmp 01480000
2.4 解决程序退出:自校验?
00402867 /0F85 31000000 jnz A-Master.0040289E ; 这个nop掉
2.5 注册标志:Ctrl+G:0041CA46,呵呵,全部出来了:
0041CA46 /E9 01000000 jmp A-Master.0041CA4C
0041CA4B |90 nop
0041CA4C \E9 00000000 jmp A-Master.0041CA51
0041CA51 8D041E lea eax,dword ptr ds:[esi+ebx]
0041CA54 8B5424 04 mov edx,dword ptr ss:[esp+4]
0041CA58 E8 8F4EFEFF call A-Master.004018EC ; jmp to starter.strcopy
0041CA5D A1 885F4300 mov eax,dword ptr ds:[435F88]
0041CA62 8B00 mov eax,dword ptr ds:[eax]
0041CA64 50 push eax
0041CA65 E8 3E48FEFF call A-Master.004012A8 ; jmp to kernel32.lstrlenA
0041CA6A 83C0 03 add eax,3
0041CA6D 50 push eax
0041CA6E E8 614EFEFF call A-Master.004018D4 ; jmp to starter.Amalloc
0041CA73 8BE8 mov ebp,eax
0041CA75 8B15 885F4300 mov edx,dword ptr ds:[435F88] ; A-Master.00447384
0041CA7B 8B12 mov edx,dword ptr ds:[edx]
0041CA7D 8BC5 mov eax,ebp
0041CA7F E8 684EFEFF call A-Master.004018EC ; jmp to starter.strcopy
0041CA84 B3 01 mov bl,1
0041CA86 A1 885F4300 mov eax,dword ptr ds:[435F88]
0041CA8B 8B00 mov eax,dword ptr ds:[eax]
0041CA8D 50 push eax
0041CA8E E8 1548FEFF call A-Master.004012A8 ; jmp to kernel32.lstrlenA
0041CA93 48 dec eax
0041CA94 83F8 00 cmp eax,0
0041CA97 7C 22 jl short A-Master.0041CABB
0041CA99 8B15 885F4300 mov edx,dword ptr ds:[435F88] ; A-Master.00447384
0041CA9F 8B12 mov edx,dword ptr ds:[edx]
0041CAA1 803C02 2C cmp byte ptr ds:[edx+eax],2C
0041CAA5 75 0E jnz short A-Master.0041CAB5
0041CAA7 8B15 885F4300 mov edx,dword ptr ds:[435F88] ; A-Master.00447384
0041CAAD 8B12 mov edx,dword ptr ds:[edx]
0041CAAF C60402 00 mov byte ptr ds:[edx+eax],0
0041CAB3 33DB xor ebx,ebx
0041CAB5 48 dec eax
0041CAB6 83F8 FF cmp eax,-1
0041CAB9 ^ 75 DE jnz short A-Master.0041CA99
0041CABB 84DB test bl,bl
0041CABD 75 10 jnz short A-Master.0041CACF
0041CABF A1 885F4300 mov eax,dword ptr ds:[435F88]
0041CAC4 8B00 mov eax,dword ptr ds:[eax]
0041CAC6 50 push eax
0041CAC7 56 push esi
0041CAC8 E8 BB47FEFF call A-Master.00401288 ; jmp to kernel32.lstrcatA
0041CACD EB 11 jmp short A-Master.0041CAE0
0041CACF 55 push ebp
0041CAD0 E8 074EFEFF call A-Master.004018DC ; jmp to starter.Afree
0041CAD5 8B4424 04 mov eax,dword ptr ss:[esp+4]
0041CAD9 50 push eax
0041CADA 55 push ebp
0041CADB E8 C047FEFF call A-Master.004012A0 ; jmp to kernel32.lstrcpyA
0041CAE0 55 push ebp
0041CAE1 E8 F64DFEFF call A-Master.004018DC ; jmp to starter.Afree
0041CAE6 EB 04 jmp short A-Master.0041CAEC
0041CAE8 32E2 xor ah,dl
0041CAEA 27 daa
0041CAEB 47 inc edi
0041CAEC 68 110C0000 push 0C11
0041CAF1 8D4424 18 lea eax,dword ptr ss:[esp+18]
注册用户名:
0041CA5D A1 885F4300 mov eax,dword ptr ds:[435F88] // 这里就是
ds:[00435F88]=00447384
写入注册用户名:
00433FD0 63 79 74 6F 00 00 00 00 cyto....
修改:
00447384 00D92DCC // 修改前
00447384 00433FD0 ASCII "cyto" // 修改后
运行发现有问题,从0041CA5D继续跟踪:
原来注册标志需要用2C隔开,即","号
0041CA99 8B15 885F4300 mov edx,dword ptr ds:[435F88] ; A-Master.00447384
0041CA9F 8B12 mov edx,dword ptr ds:[edx]
0041CAA1 803C02 2C cmp byte ptr ds:[edx+eax],2C
0041CAA5 75 0E jnz short A-Master.0041CAB5
0041CAA7 8B15 885F4300 mov edx,dword ptr ds:[435F88] ; A-Master.00447384
0041CAAD 8B12 mov edx,dword ptr ds:[edx]
0041CAAF C60402 00 mov byte ptr ds:[edx+eax],0
0041CAB3 33DB xor ebx,ebx
0041CAB5 48 dec eax
0041CAB6 83F8 FF cmp eax,-1
0041CAB9 ^ 75 DE jnz short A-Master.0041CA99
在00433FD0后面再添几个:
00433FD0 63 79 74 6F 2C 77 77 77 2E 70 65 64 69 79 2E 63 cyto,www.pediy.c
00433FE0 6F 6D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 om..............
Yeah,运行ok,提示:Registered to : cyto
3.善后处理,可能关系到功能的实现
3.1 另一个需要key解码的地方:
载入无key的脱壳文件,搜索 E9 ?? 00 00 00,寻找需要key解码的地方:
只搜索到另一处:
004301D7 /E9 10000000 jmp A-Master.004301EC
004301DC |64:97 xchg eax,edi
004301DE |E4 08 in al,8
004301E0 |33EE xor ebp,esi
004301E2 |6244EE DC bound eax,qword ptr ds:[esi+ebp*8-24]
004301E6 |A1 B3AC9548 mov eax,dword ptr ds:[4895ACB3]
004301EB |90 nop
004301EC \6A 60 push 60
004301EE 8D4424 0C lea eax,dword ptr ss:[esp+C]
004301F2 50 push eax
004301F3 E8 DC18FDFF call <jmp.&ntdll.RtlZeroMemory>
有key解码后:
004301D7 /E9 01000000 jmp A-Master.004301DD
004301DC |40 inc eax
004301DD \E9 00000000 jmp A-Master.004301E2
004301E2 FF4C24 04 dec dword ptr ss:[esp+4]
004301E6 /EB 04 jmp short A-Master.004301EC
004301E8 |62FC bound edi,esp ; 非法使用寄存器
004301EA |A5 movs dword ptr es:[edi],dword ptr ds:[>
004301EB |90 nop
004301EC \6A 60 push 60
004301EE 8D4424 0C lea eax,dword ptr ss:[esp+C]
004301F2 50 push eax
004301F3 E8 DC18FDFF call <jmp.&ntdll.RtlZeroMemory>
3.2 第二处CRC验证:
OD载入程序,启动程序后不忽略内存异常,功能菜单Desktop,随便选择桌面的某个项目,点击Properties,异常:
0040C94C 8B06 mov eax,dword ptr ds:[esi] ; 停在此
往上找到CRC验证处:
0040C818 E8 7F000000 call c.0040C89C
0040C81D BE 46BA4500 mov esi,c.0045BA46
0040C822 BE FEFA4000 mov esi,c.0040FAFE
0040C827 8D7424 10 lea esi,dword ptr ss:[esp+10]
0040C82B 8D7426 EC lea esi,dword ptr ds:[esi-14]
0040C82F 8B36 mov esi,dword ptr ds:[esi]
0040C831 8DB40E E348FFFF lea esi,dword ptr ds:[esi+ecx+FFFF48E3>
0040C838 2BF1 sub esi,ecx
0040C83A 2BD9 sub ebx,ecx
0040C83C FF36 push dword ptr ds:[esi]
0040C83E BB BE724700 mov ebx,c.004772BE
0040C843 C1C3 FB rol ebx,0FB
0040C846 5B pop ebx
0040C847 81E3 FF000000 and ebx,0FF
0040C84D 83EE 1D sub esi,1D
0040C850 337424 08 xor esi,dword ptr ss:[esp+8]
0040C854 C1CE 11 ror esi,11
0040C857 BE 1A2F4700 mov esi,c.00472F1A
0040C85C 81EE 5ED466AA sub esi,AA66D45E
0040C862 8DB408 A132535A lea esi,dword ptr ds:[eax+ecx+5A5332A1>
0040C869 2BF1 sub esi,ecx
0040C86B 2BF0 sub esi,eax
0040C86D 8D9C0B 77CCACA5 lea ebx,dword ptr ds:[ebx+ecx+A5ACCC77>
0040C874 2BD9 sub ebx,ecx
0040C876 03DE add ebx,esi
0040C878 0BDB or ebx,ebx
0040C87A 0F84 26000000 je c.0040C8A6 ; 就是这里,jmp
3.3 Stolen Code 3:
Ctlr+B搜索:E9 ?? ?? ?? 01,还有一处:
00422D6A /E9 01000000 jmp A-Master.00422D70
00422D6F |90 nop
00422D70 -\E9 8BD20401 jmp 01470000 // 到壳里
这个在程序启动过程中没能断下,应该是功能上的,点击所有功能,发现点击plug-ins菜单的setup plug-in功能按钮时断下,ok,继续跟踪原程序获得代码:
00422D6A /E9 01000000 jmp c.00422D70
00422D6F |90 nop
00422D70 \54 push esp
00422D71 A1 285F4300 mov eax,dword ptr ds:[435F28]
00422D76 50 push eax
00422D77 E8 10ECFDFF call <jmp.&starter.OpenCFGr>
00422D7C 54 push esp
00422D7D 6A 00 push 0
00422D7F A1 44624300 mov eax,dword ptr ds:[436244]
00422D84 8B00 mov eax,dword ptr ds:[eax]
00422D86 50 push eax
00422D87 E8 10ECFDFF call <jmp.&starter.FindSection>
00422D8C 54 push esp
00422D8D 6A 00 push 0
00422D8F A1 445D4300 mov eax,dword ptr ds:[435D44]
00422D94 8B00 mov eax,dword ptr ds:[eax]
00422D96 50 push eax
00422D97 E8 20ECFDFF call <jmp.&starter.GetCFGBool>
00422D9C 8B15 B45B4300 mov edx,dword ptr ds:[435BB4] ; c.00437574
00422DA2 8942 1C mov dword ptr ds:[edx+1C],eax
00422DA5 54 push esp
00422DA6 E8 E9EBFDFF call <jmp.&starter.CloseCFGr>
00422DAB A1 A8594300 mov eax,dword ptr ds:[4359A8]
00422DB0 33D2 xor edx,edx
00422DB2 8910 mov dword ptr ds:[eax],edx
00422DB4 C605 E4854400 00 mov byte ptr ds:[4485E4],0
00422DBB A1 445A4300 mov eax,dword ptr ds:[435A44]
00422DC0 33D2 xor edx,edx
00422DC2 8910 mov dword ptr ds:[eax],edx
00422DC4 A1 BC5F4300 mov eax,dword ptr ds:[435FBC]
00422DC9 50 push eax
00422DCA A1 845D4300 mov eax,dword ptr ds:[435D84]
00422DCF 50 push eax
00422DD0 E8 A7EBFDFF call <jmp.&starter.OpenCFGw> ; here
00422DD5 A1 BC5F4300 mov eax,dword ptr ds:[435FBC]
00422DDA 8B40 10 mov eax,dword ptr ds:[eax+10]
00422DDD 8B15 00614300 mov edx,dword ptr ds:[436100] ; c.00445E04
00422DE3 8902 mov dword ptr ds:[edx],eax
00422DE5 A1 00614300 mov eax,dword ptr ds:[436100]
00422DEA 8B00 mov eax,dword ptr ds:[eax]
00422DEC 50 push eax
00422DED E8 E2EAFDFF call <jmp.&starter.Amalloc>
00422DF2 8B15 105F4300 mov edx,dword ptr ds:[435F10] ; c.00445DFC
00422DF8 8902 mov dword ptr ds:[edx],eax
00422DFA A1 00614300 mov eax,dword ptr ds:[436100]
00422DFF 8B00 mov eax,dword ptr ds:[eax]
00422E01 50 push eax
00422E02 A1 BC5F4300 mov eax,dword ptr ds:[435FBC]
00422E07 8B40 08 mov eax,dword ptr ds:[eax+8]
00422E0A 50 push eax
00422E0B A1 105F4300 mov eax,dword ptr ds:[435F10]
00422E10 8B00 mov eax,dword ptr ds:[eax]
00422E12 50 push eax
00422E13 E8 CCECFDFF call <jmp.&ntdll.RtlMoveMemory>
00422E18 A1 D85A4300 mov eax,dword ptr ds:[435AD8]
00422E1D C600 00 mov byte ptr ds:[eax],0
00422E20 A1 C85B4300 mov eax,dword ptr ds:[435BC8]
00422E25 C700 5E010000 mov dword ptr ds:[eax],15E
00422E2B A1 A85B4300 mov eax,dword ptr ds:[435BA8]
00422E30 33D2 xor edx,edx
00422E32 8910 mov dword ptr ds:[eax],edx
00422E34 6A 0C push 0C
00422E36 E8 D5E4FDFF call <jmp.&gdi32.GetStockObject>
00422E3B 8B15 A85D4300 mov edx,dword ptr ds:[435DA8] ; c.00445D98
00422E41 8902 mov dword ptr ds:[edx],eax
00422E43 6A 00 push 0
00422E45 6A 00 push 0
00422E47 6A 00 push 0
00422E49 6A 00 push 0
00422E4B 6A 00 push 0
00422E4D 6A 01 push 1
00422E4F 6A 00 push 0
00422E51 6A 00 push 0
00422E53 6A 00 push 0
00422E55 68 BC020000 push 2BC
00422E5A 6A 00 push 0
00422E5C 6A 00 push 0
00422E5E 6A 07 push 7
00422E60 6A 0E push 0E
00422E62 E8 71E4FDFF call <jmp.&gdi32.CreateFontA>
00422E67 8B15 385B4300 mov edx,dword ptr ds:[435B38] ; c.00445D9C
00422E6D 8902 mov dword ptr ds:[edx],eax
00422E6F 53 push ebx
00422E70 68 08274200 push c.00422708
00422E75 A1 D0604300 mov eax,dword ptr ds:[4360D0]
00422E7A 8B00 mov eax,dword ptr ds:[eax]
00422E7C 50 push eax
00422E7D 68 89030000 push 389
00422E82 A1 08704300 mov eax,dword ptr ds:[437008]
00422E87 50 push eax
00422E88 E8 43E5FDFF call <jmp.&user32.DialogBoxParamA>
00422E8D A1 385B4300 mov eax,dword ptr ds:[435B38]
00422E92 8B00 mov eax,dword ptr ds:[eax]
00422E94 50 push eax
00422E95 E8 4EE4FDFF call <jmp.&gdi32.DeleteObject>
00422E9A A1 BC5F4300 mov eax,dword ptr ds:[435FBC]
00422E9F 50 push eax
00422EA0 6A 00 push 0
00422EA2 A1 845D4300 mov eax,dword ptr ds:[435D84]
00422EA7 50 push eax
00422EA8 E8 D7EAFDFF call <jmp.&starter.CloseCFGw>
00422EAD A1 105F4300 mov eax,dword ptr ds:[435F10]
00422EB2 8B00 mov eax,dword ptr ds:[eax]
00422EB4 50 push eax
00422EB5 E8 22EAFDFF call <jmp.&starter.Afree>
00422EBA E8 EDDFFFFF call c.00420EAC
00422EBF 83C4 24 add esp,24
00422EC2 5B pop ebx
00422EC3 C3 retn
E9 01 00 00 00 90 54 A1 28 5F 43 00 50 E8 10 EC FD FF 54 6A 00 A1 44 62 43 00 8B 00 50 E8 10 EC
FD FF 54 6A 00 A1 44 5D 43 00 8B 00 50 E8 20 EC FD FF 8B 15 B4 5B 43 00 89 42 1C 54 E8 E9 EB FD
FF A1 A8 59 43 00 33 D2 89 10 C6 05 E4 85 44 00 00 A1 44 5A 43 00 33 D2 89 10 A1 BC 5F 43 00 50
A1 84 5D 43 00 50 E8 A7 EB FD FF A1 BC 5F 43 00 8B 40 10 8B 15 00 61 43 00 89 02 A1 00 61 43 00
8B 00 50 E8 E2 EA FD FF 8B 15 10 5F 43 00 89 02 A1 00 61 43 00 8B 00 50 A1 BC 5F 43 00 8B 40 08
50 A1 10 5F 43 00 8B 00 50 E8 CC EC FD FF A1 D8 5A 43 00 C6 00 00 A1 C8 5B 43 00 C7 00 5E 01 00
00 A1 A8 5B 43 00 33 D2 89 10 6A 0C E8 D5 E4 FD FF 8B 15 A8 5D 43 00 89 02 6A 00 6A 00 6A 00 6A
00 6A 00 6A 01 6A 00 6A 00 6A 00 68 BC 02 00 00 6A 00 6A 00 6A 07 6A 0E E8 71 E4 FD FF 8B 15 38
5B 43 00 89 02 53 68 08 27 42 00 A1 D0 60 43 00 8B 00 50 68 89 03 00 00 A1 08 70 43 00 50 E8 43
E5 FD FF A1 38 5B 43 00 8B 00 50 E8 4E E4 FD FF A1 BC 5F 43 00 50 6A 00 A1 84 5D 43 00 50 E8 D7
EA FD FF A1 10 5F 43 00 8B 00 50 E8 22 EA FD FF E8 ED DF FF FF 83 C4 24 5B C3
4.补充:恢复code用到的地方:
变形call及变形跳转的分型处:
00D646B2 FFD2 call edx
00D646B4 2C 02 sub al,2
00D646B6 72 0B jb short 00D646C3
00D646B8 74 33 je short 00D646ED
00D646BA FEC8 dec al
00D646BC 74 73 je short 00D64731
00D646BE E9 C2000000 jmp 00D64785
下一行代码指向:
014A00AD FF6424 FC jmp dword ptr ss:[esp-4]
附件是笔记.
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
上传的附件: