ACPROTECT v1.41 奇幻旅程--未了的情缘(终结篇)
【工 具】:Olydbg1.1(diy版)、LORDPE、ImportREC1.6F
【任 务】:去除Acprotect 用到的SDK保护Embedd Protect,去除Replace Code
【操作平台】:Windows 2003 server
【作 者】:LOVEBOOM[DFCG][FCG][US]
【简要说明】:继上篇分析篇,这次是来终结的了:-),这个旅程比上次的分析可算辛苦很多,一不小心就会飞了的。
不管这么多了,累就累下吧,既然进已经开始了这个旅程,不到最后放弃的话,不是太可惜了。
【详细过程】:
去除Acprotect 用到的SDK保护Embedd Protect:
按照任务的顺序一个一个来,我们先解决最大的拌脚石,ACProtect的Embedd Protect应该这个壳里的最大亮点之一。
加上了对程序的保护加强了不少。下面看看我们就去搬走这块石头。
由上篇的文章里的分析,我写个了脚本方便很快就去关键地方,脚本如下:
/*
Set break point at Embedd protect start address
*/
var bpaddr
start:
bprm 401000,b6000 //在Code section处下断点
esto
bpmc
bp 591079 //断下后,在处理SDK的那个关键地方下个断
lbl1:
eob lbl2
run
lbl2:
cmp esi ,0
je lbl3
cob
mov bpaddr,esi
add bpaddr,400000 //取出sdk的具体地址,然后在相关地址处下断
mov addrval,[bpaddr]
bp bpaddr
jmp lbl1
lbl3:
cob
bc 591079 //如果处理完了就结束这个脚本,清除上面的关键断点
ret
写好后,设置OD忽略全部异常。运行脚本后最后结束在这里:
00591079 0BF6 OR ESI ,ESI ; 如果没有用SDK或SDK处理部分已经操作完成则跳
0059107B 74 31 JE SHORT <finished>
0059107D 90 NOP
0059107E 90 NOP
0059107F 90 NOP
断下后,alt+B打开断点窗口:把非pushad处设置的断点取消:
Breakpoints
Address Module Active Disassembly Comment
0040CC05 MainCon Always PUSHAD
0040FE71 MainCon Always SUB BYTE PTR DS :[ECX ],2D ;Clear it
004132D7 MainCon Always PUSHAD
004166D1 MainCon Always PUSHAD
00419A9B MainCon Always PUSHAD
0041CCD6 MainCon Always CMP AL ,0A3 ;Clear it
0042089A MainCon Always PUSHAD
00423ADF MainCon Always CMC ;Clear it
00427422 MainCon Always PUSHAD
0042ABD1 MainCon Always PUSHAD
0042DEA1 MainCon Always PUSHAD
004317A2 MainCon Always PUSHAD
00436067 MainCon Always PUSHAD
0043930F MainCon Always JBE SHORT 00439375 ;Clear it
0043C77D MainCon Always PUSHAD
0043FA3D MainCon Always PUSHAD
00442DBD MainCon Always PUSHAD
0044607D MainCon Always PUSHAD
0044933D MainCon Always PUSHAD
0044C600 MainCon Always PUSHAD
0044F8DD MainCon Always PUSHAD
00452C0F MainCon Always PUSHAD
00455EF0 MainCon Always PUSHAD
00459389 MainCon Always PUSHAD
0045C95D MainCon Always PUSHAD
0045FC38 MainCon Always PUSHAD
00462EC8 MainCon Always PUSHAD
0046618B MainCon Always PUSHAD
004696FF MainCon Always PUSHAD
0046C932 MainCon Always INS BYTE PTR ES :[EDI ],DX ;Clear it
004708D9 MainCon Always PUSHAD
00474389 MainCon Always PUSHAD
004775C3 MainCon Always OR DH ,BYTE PTR DS :[EAX +6F] ;Clear it
0047A80F MainCon Always MOV AL ,BYTE PTR DS :[C095E1F] ;Clear it
0047DE02 MainCon Always PUSHAD
00481126 MainCon Always PUSHAD
00484396 MainCon Always INT1 ;Clear it
取消相关的断点后,F9运行后,中断下来:
0042089A 60 PUSHAD ; 运行后中断在这里
0042089B F8 CLC
0042089C 66:2BCD SUB CX ,BP
0042089F 87C1 XCHG ECX ,EAX
......
00420A62 0000 ADD BYTE PTR DS :[EAX ],AL
00420A64 47 INC EDI
00420A65 4F DEC EDI
00420A66 83E8 01 SUB EAX ,1
00420A69 ^ 0F85 81FFFFFF JNZ 004209F0 ; 循环解压代码后面有很多的东西
00420A6F 7A 03 JPE SHORT 00420A74
......
00420D64 /E9 08000000 JMP 00420D71
00420D69 |79 03 JNS SHORT 00420D6E
00420D6B |C1EE 47 SHR ESI ,47 ;解压了几个回合到一个远程jmp处,不要以为这里就差不多到头哦,后面还有很长的路,
00420D6E |66:8BCE MOV CX ,SI
00420D71 \E9 E91D0000 JMP 00422B5F
......
00422B5F E8 8FFDFFFF CALL <sub_Copy code> ; 这里进去复制代码
00422B64 33C2 XOR EAX ,EDX
00422B66 EB 01 JMP SHORT 00422B69
00422B68 73 40 JNB SHORT 00422BAA
......
00422C1F 03FD ADD EDI ,EBP
00422C21 E8 01000000 CALL 00422C27
00422C26 90 NOP
00422C27 83C4 04 ADD ESP ,4
00422C2A E8 37E5FFFF CALL <Check Debugger>
00422C2F 66:C1C6 B1 ROL SI ,0B1 ; Shift constant out of range 1..31
00422C33 46 INC ESI
00422C34 C1CF 1E ROR EDI ,1E
00422C37 7C 03 JL SHORT 00422C3C
00422C39 7D 01 JGE SHORT 00422C3C
00422C3B ^ 73 E9 JNB SHORT 00422C26
......
00422C6C E8 01000000 CALL 00422C72
00422C71 90 NOP
00422C72 83C4 04 ADD ESP ,4
00422C75 E8 3AE8FFFF CALL <Crc File>
00422C7A 66:C1D6 21 RCL SI ,21 ; Shift constant out of range 1..31
00422C7E 81C5 19AA764B ADD EBP ,4B76AA19
......
00422E90 830424 06 ADD DWORD PTR SS :[ESP ],6
00422E94 C3 RETN
00422E95 E8 8DF1FFFF CALL <sub_Anti_Fake_Unpack> ; 检测是否被脱壳了,
00422E9A 8BD5 MOV EDX ,EBP
00422E9C 81EF 6D259939 SUB EDI ,3999256D
00422EA2 50 PUSH EAX
00422EA3 E8 01000000 CALL 00422EA9
00422EA8 EA 83C40458 66C>JMP FAR C166:5804C483 ; Far jump
00422EAF FA CLI
00422EB0 F1 INT1
00422EB1 83C1 04 ADD ECX ,4
00422EB4 E8 01000000 CALL 00422EBA
00422EB9 ^ 7D 83 JGE SHORT 00422E3E
00422EBB C404BA LES EAX ,FWORD PTR DS :[EDX +EDI *4] ; Modification of segment register
00422EBE 41 INC ECX
00422EBF 0D AE870F87 OR EAX ,870F87AE
00422EC4 0100 ADD DWORD PTR DS :[EAX ],EAX
00422EC6 0000 ADD BYTE PTR DS :[EAX ],AL
00422EC8 43 INC EBX
00422EC9 83C5 FF ADD EBP ,-1
00422ECC ^ 0F85 6AFFFFFF JNZ 00422E3C ; 循环解压代码
00422ED2 E8 01000000 CALL 00422ED8
00422ED7 9A 83C40487 D86>CALL FAR 66D8:8704C483 ; Far call
00422EDE 81C0 56FFE800 ADD EAX ,0E8FF56
......
0042327E 83C4 04 ADD ESP ,4 ; 过了一段漫长的路,到这里
00423281 58 POP EAX
00423282 E8 84E4FFFF CALL <sub_INT 1_Check_Debug>
00423287 47 INC EDI
00423288 83C1 04 ADD ECX ,4
0042328B 2B11 SUB EDX ,DWORD PTR DS :[ECX ]
......
004232F5 90 NOP
004232F6 61 POPAD ; 一堆检测过后,解开被保护的代码
004232F7 8B4D F0 MOV ECX ,DWORD PTR SS :[EBP -10] ; 程序代码
004232FA 68 01010100 PUSH 10101
004232FF 68 EBEBEB00 PUSH 0EBEBEB
00423304 90 NOP
00423305 90 NOP
00423306 60 PUSHAD ; 后面还代码,这里继续
00423307 E8 00000000 CALL 0042330C
0042330C 5D POP EBP
......
0042334F /74 03 JE SHORT 00423354
00423351 |75 01 JNZ SHORT 00423354
00423353 |90 NOP
00423354 \E8 12E6FFFF CALL <sub_Fuck_int3> ;这里进去的int3会清除硬件的
00423359 85FD TEST EBP ,EDI
0042335B 0F80 02000000 JO 00423363
......
004235B9 81C5 E47934EE ADD EBP ,EE3479E4
004235BF EB 01 JMP SHORT 004235C2
004235C1 90 NOP
004235C2 E8 CAF0FFFF CALL <Anti_Fake_Unpack_check_Import> ;反脱壳的检测还真不少
004235C7 E9 02000000 JMP 004235CE
004235CC 87CF XCHG EDI ,ECX
......
00423926 830424 06 ADD DWORD PTR SS :[ESP ],6
0042392A C3 RETN
0042392B E9 04000000 JMP 00423934
00423930 8BF8 MOV EDI ,EAX
00423932 03F9 ADD EDI ,ECX
00423934 E9 82010000 JMP 00423ABB ; 跳去执行程序的代码了
00423939 EB 01 JMP SHORT 0042393C
......
00423ABB 61 POPAD
00423ABC 90 NOP
00423ABD 90 NOP
00423ABE 90 NOP
00423ABF 90 NOP
00423AC0 90 NOP
00423AC1 90 NOP
00423AC2 90 NOP
00423AC3 90 NOP
00423AC4 90 NOP
00423AC5 90 NOP
00423AC6 90 NOP
00423AC7 90 NOP
00423AC8 90 NOP ; 这里又是程序代码了
00423AC9 E8 96F10800 CALL 004B2C64 ; JMP to MFC42.#5943
00423ACE 60 PUSHAD
00423ACF 6A 05 PUSH 5
00423AD1 6A 00 PUSH 0
00423AD3 6A 00 PUSH 0
00423AD5 6A FF PUSH -1
00423AD7 FF15 C8784B00 CALL DWORD PTR DS :[4B78C8] ; <MainCon.sub_SDK_Disposal>
这里跟进去可以看到SDK处理的核心部分sub_EmbeddProtect
00423ADD 61 POPAD
00423ADE 90 NOP
......
00423FA9 /E9 08000000 JMP 00423FB6
00423FAE |66:81D3 A6AF ADC BX ,0AFA6
00423FB3 |66:03D9 ADD BX ,CX
00423FB6 \E9 E91D0000 JMP 00425DA4 ; 呵呵又一个远程跳,必有动作
00423FBB 0000 ADD BYTE PTR DS :[EAX ],AL
......
00426066 /79 01 JNS SHORT 00426069
00426068 |90 NOP
00426069 \E8 68F8FFFF CALL <Anti_Fake_Unpack_check_Import>
0042606E 0F83 02000000 JNB 00426076
00426074 D3DE RCR ESI ,CL
00426076 8BCD MOV ECX ,EBP
......
00426242 ^\71 83 JNO SHORT 004261C7
00426244 C40458 LES EAX ,FWORD PTR DS :[EAX +EBX *2] ; Modification of segment register
00426247 E8 5FE1FFFF CALL <sub_Fuck_RING0'Debugger>
0042624C 87C7 XCHG EDI ,EAX ; MainCon.004262F6
0042624E 4F DEC EDI
......
004266AB 830424 06 ADD DWORD PTR SS :[ESP ],6
004266AF C3 RETN
004266B0 E8 3DE7FFFF CALL <sub_check_ring3_debug>
004266B5 E9 10000000 JMP 004266CA
004266BA 0F84 02000000 JE 004266C2
004266C0 87D1 XCHG ECX ,EDX
......
0042670C E8 01000000 CALL 00426712
00426711 - E9 83C40458 JMP 58472B99
00426716 E8 DEDFFFFF CALL <SUB_CRC>
0042671B 0BCF OR ECX ,EDI
0042671D 87D9 XCHG ECX ,EBX
0042671F E8 00000000 CALL 00426724
......
00426B78 4F DEC EDI
00426B79 E9 82010000 JMP 00426D00 ; 跳去执行程序代码了
00426B7E E8 01000000 CALL 00426B84
......
00426D00 61 POPAD ; 又开始程序代码
00426D01 E8 58BF0800 CALL 004B2C5E ; JMP to MFC42.#1168
00426D06 8B40 08 MOV EAX ,DWORD PTR DS :[EAX +8]
00426D09 6A 00 PUSH 0
00426D0B 6A 00 PUSH 0
00426D0D 68 8C164C00 PUSH 004C168C ; ASCII "Demo"
00426D12 50 PUSH EAX
00426D13 E8 940F0600 CALL 00487CAC
00426D18 60 PUSHAD
00426D19 6A 04 PUSH 4 ; 为4时表示加密
00426D1B 6A 00 PUSH 0
00426D1D 6A 00 PUSH 0
00426D1F 6A FF PUSH -1
00426D21 FF15 C8784B00 CALL DWORD PTR DS :[4B78C8] ; <MainCon.sub_SDK_Disposal>
00426D27 EB 1E JMP SHORT 00426D47
00426D29 7D 66 JGE SHORT 00426D91
00426D2B 99 CDQ
00426D2C - E9 6E3956CB JMP CB98A69F
00426D31 67:A8 69 TEST AL ,69 ; Superfluous prefix
00426D34 DF59 E5 FISTP WORD PTR DS :[ECX -1B]
00426D37 0000 ADD BYTE PTR DS :[EAX ],AL
00426D39 0000 ADD BYTE PTR DS :[EAX ],AL
00426D3B 0000 ADD BYTE PTR DS :[EAX ],AL
00426D3D 0000 ADD BYTE PTR DS :[EAX ],AL
00426D3F 0000 ADD BYTE PTR DS :[EAX ],AL
00426D41 0000 ADD BYTE PTR DS :[EAX ],AL
00426D43 0000 ADD BYTE PTR DS :[EAX ],AL
00426D45 0000 ADD BYTE PTR DS :[EAX ],AL
00426D47 61 POPAD ; 下面又是程序代码了,...
00426D48 68 84164C00 PUSH 004C1684 ; ASCII "Skin"
00426D4D 68 7C164C00 PUSH 004C167C ; ASCII "Skin1"
00426D52 6A 00 PUSH 0
00426D54 E8 FE130600 CALL 00488157
00426D59 60 PUSHAD
00426D5A 6A 04 PUSH 4
00426D5C 6A 00 PUSH 0
00426D5E 6A 00 PUSH 0
00426D60 6A FF PUSH -1
00426D62 FF15 C8784B00 CALL DWORD PTR DS :[4B78C8] ; <MainCon.sub_SDK_Disposal>
00426D68 EB 1E JMP SHORT 00426D88 ; 这里跳去就结束这个sdk 的处理、执行了
00426D6A 52 PUSH EDX
00426D6B EE OUT DX ,AL ; I/O command
00426D6C B3 68 MOV BL ,68
00426D6E B9 20AC0B71 MOV ECX ,710BAC20
00426D73 CF IRETD
00426D74 D019 RCR BYTE PTR DS :[ECX ],1
00426D76 8ADD MOV BL ,CH
00426D78 0000 ADD BYTE PTR DS :[EAX ],AL
00426D7A 0000 ADD BYTE PTR DS :[EAX ],AL
00426D7C 0000 ADD BYTE PTR DS :[EAX ],AL
00426D7E 0000 ADD BYTE PTR DS :[EAX ],AL
00426D80 0000 ADD BYTE PTR DS :[EAX ],AL
00426D82 0000 ADD BYTE PTR DS :[EAX ],AL
00426D84 0000 ADD BYTE PTR DS :[EAX ],AL
00426D86 0000 ADD BYTE PTR DS :[EAX ],AL
00426D88 61 POPAD
00426D89 6A 00 PUSH 0 ; 又正常执行程序代码了
00426D8B 8D8D 9497FFFF LEA ECX ,DWORD PTR SS :[EBP +FFFF9794]
00426D91 E8 9AA50000 CALL 00431330
......
ok,关于Embedd Protect的分析就结束了,再分析几个地方就可以得到一定的规律。找回正常的代码也就是件很简单的事了,只需要一定的时间就可以了。
这里的正确代码就应该为:
00420889 8B4D F0 MOV ECX ,DWORD PTR SS :[EBP -10]
0042088C 68 01010100 PUSH 10101
00420891 68 EBEBEB00 PUSH 0EBEBEB
00420896 E8 C9230900 CALL <JMP.&MFC42.#5943>
0042089B E8 BE230900 CALL <JMP.&MFC42.#1168>
004208A0 8B40 08 MOV EAX ,DWORD PTR DS :[EAX +8]
004208A3 6A 00 PUSH 0
004208A5 6A 00 PUSH 0
004208A7 68 8C164C00 PUSH 004C168C ; ASCII "Demo"
004208AC 50 PUSH EAX
004208AD E8 FA730600 CALL 00487CAC
004208B2 68 84164C00 PUSH 004C1684 ; ASCII "Skin"
004208B7 68 7C164C00 PUSH 004C167C ; ASCII "Skin1"
004208BC 6A 00 PUSH 0
004208BE E8 94780600 CALL 00488157
004208C3 E9 C1640000 JMP 00426D89 ; JMP to MFC42.#5943
经过N久的时间把全部的正确代码找回来了之后,dump下code段,第一个任务就算完成了,接下来完成第二个任务。 去除Replace Code:
这个任务也算是ACProtect 的一样法宝吧,替换了很多的代码。每次替换5个字节的代码,方式为3+2或2+3,壳
解压出来时已经加了垃圾代码。
重来,载入目标,先在rdata段下断点,断下后,在text段下断,运行停止在fake oep后,在最后一个段下内存写
入断点。再运行,这样就中断在Replace Code的关键代码处了: sub_Restore_Replace_Code:
0057D02E > 60 PUSHAD ; sub_Restore_Replace_Code
0057D02F 4A DEC EDX
0057D030 FC CLD
......
0057D0EB 8945 1D MOV DWORD PTR SS :[EBP +1D],EAX ; 中断在这里
0057D0EE EB 01 JMP SHORT 0057D0F1
......
0057D1C5 83E9 01 SUB ECX ,1
0057D1C8 ^ 0F85 69FFFFFF JNZ 0057D137 ; 循环解压代码
0057D1CE EB 01 JMP SHORT 0057D1D1
0057D1D0 71 72 JNO SHORT <Decrypt_Replaced_CODE>
0057D1D2 06 PUSH ES
0057D1D3 81E7 B34D2A57 AND EDI ,572A4DB3
0057D1D9 E8 22EF0000 CALL <sub_GetEBP >
0057D1DE 8B4424 20 MOV EAX ,DWORD PTR SS :[ESP +20] ; 取call这个处理模块的地址
0057D1E2 33C9 XOR ECX ,ECX
0057D1E4 8B9C8D 812E4000 MOV EBX ,DWORD PTR SS :[EBP +ECX *4+402E81>; 指向一个表,通过在表里查询来还原代码
0057D1EB 039D 46F84000 ADD EBX ,DWORD PTR SS :[EBP +40F846]
0057D1F1 3BC3 CMP EAX ,EBX
0057D1F3 74 07 JE SHORT 0057D1FC ; 表里查到符合条件的则跳
0057D1F5 90 NOP
0057D1F6 90 NOP
0057D1F7 90 NOP
0057D1F8 90 NOP
0057D1F9 41 INC ECX
0057D1FA ^ EB E8 JMP SHORT 0057D1E4 ; 循环查表
0057D1FC 8DB5 615D4000 LEA ESI ,DWORD PTR SS :[EBP +405D61]
0057D202 B8 0A000000 MOV EAX ,0A
0057D207 F7E1 MUL ECX
0057D209 03F0 ADD ESI ,EAX
0057D20B 8DBD 07184000 LEA EDI ,DWORD PTR SS :[EBP +401807]
0057D211 0FB6840D C92240>MOVZX EAX ,BYTE PTR SS :[EBP +ECX +4022C9]
0057D219 FEC0 INC AL
0057D21B 88840D C9224000 MOV BYTE PTR SS :[EBP +ECX +4022C9],AL
0057D222 3C 20 CMP AL ,20
0057D224 75 13 JNZ SHORT 0057D239
0057D226 90 NOP
0057D227 90 NOP
0057D228 90 NOP
0057D229 90 NOP
0057D22A 8BBD 4AF84000 MOV EDI ,DWORD PTR SS :[EBP +40F84A]
0057D230 B8 0A000000 MOV EAX ,0A
0057D235 F7E1 MUL ECX
0057D237 03F8 ADD EDI ,EAX
0057D239 8A9D 1E204000 MOV BL ,BYTE PTR SS :[EBP +40201E] ; [EBP+40201E]中保存着解密的Key
0057D23F B9 0A000000 MOV ECX ,0A
0057D244 > AC LODS BYTE PTR DS :[ESI ] ; 还原出正确的代码,加了垃圾代码的
0057D245 32C3 XOR AL ,BL
0057D247 AA STOS BYTE PTR ES :[EDI ]
0057D248 ^ E2 FA LOOPD SHORT <Decrypt_Replaced_CODE>
0057D24A 83EF 0A SUB EDI ,0A
0057D24D 57 PUSH EDI
0057D24E 8DB5 07184000 LEA ESI ,DWORD PTR SS :[EBP +401807]
0057D254 33F7 XOR ESI ,EDI
0057D256 74 19 JE SHORT 0057D271
0057D258 90 NOP
0057D259 90 NOP
0057D25A 90 NOP
0057D25B 90 NOP
0057D25C 8B7424 24 MOV ESI ,DWORD PTR SS :[ESP +24]
0057D260 83EE 04 SUB ESI ,4
0057D263 AD LODS DWORD PTR DS :[ESI ]
0057D264 81EF 2E204000 SUB EDI ,0040202E
0057D26A 2BFD SUB EDI ,EBP
0057D26C 03C7 ADD EAX ,EDI
0057D26E 8946 FC MOV DWORD PTR DS :[ESI -4],EAX
0057D271 5F POP EDI
0057D272 57 PUSH EDI
0057D273 33C9 XOR ECX ,ECX
0057D275 83F9 08 CMP ECX ,8
0057D278 74 0E JE SHORT 0057D288
0057D27A 90 NOP
0057D27B 90 NOP
0057D27C 90 NOP
0057D27D 90 NOP
0057D27E 8B448C 04 MOV EAX ,DWORD PTR SS :[ESP +ECX *4+4]
0057D282 89048C MOV DWORD PTR SS :[ESP +ECX *4],EAX
0057D285 41 INC ECX
0057D286 ^ EB ED JMP SHORT 0057D275
0057D288 893C8C MOV DWORD PTR SS :[ESP +ECX *4],EDI
0057D28B 60 PUSHAD ; 加密代码
0057D28C E8 00000000 CALL 0057D291
0057D291 5E POP ESI
0057D292 83EE 06 SUB ESI ,6
0057D295 B9 B2000000 MOV ECX ,0B2
0057D29A 29CE SUB ESI ,ECX
0057D29C BA 41A20ADC MOV EDX ,DC0AA241
0057D2A1 C1E9 02 SHR ECX ,2
0057D2A4 83E9 02 SUB ECX ,2
0057D2A7 83F9 00 CMP ECX ,0
0057D2AA 7C 1A JL SHORT 0057D2C6
0057D2AC 8B048E MOV EAX ,DWORD PTR DS :[ESI +ECX *4]
0057D2AF 8B5C8E 04 MOV EBX ,DWORD PTR DS :[ESI +ECX *4+4]
0057D2B3 33C3 XOR EAX ,EBX
0057D2B5 C1C8 15 ROR EAX ,15
0057D2B8 33C2 XOR EAX ,EDX
0057D2BA 81EA 417BCDED SUB EDX ,EDCD7B41
0057D2C0 89048E MOV DWORD PTR DS :[ESI +ECX *4],EAX
0057D2C3 49 DEC ECX
0057D2C4 ^ EB E1 JMP SHORT 0057D2A7
0057D2C6 61 POPAD
0057D2C7 61 POPAD
0057D2C8 C3 RETN ; 返回到要执行的代码处
分析出这些代码后,写了个修复代码,这个修复代码是我上次看到股林精怪写的,既然这的这么好,我就直接
搬来过借用下:-),修复代码如下:.386 .model flat ,stdcall ;------------------------------------------------------------- ; ; ACProtect v1.41 Replace Code Fix Application ; ;------------------------------------------------------------- .code
start:
PUSHAD
XOR EAX ,EAX
MOV EDI ,580d61h ;LEA ESI,DWORD PTR SS:[EBP+405D61] EBP+405D61=525d61
L003:
CMP DWORD PTR DS :[EAX +EDI ],0
JE L008
XOR BYTE PTR DS :[EAX +EDI ],0D7h ;MOV BL,BYTE PTR SS:[EBP+40201E] [0052201e]=22
INC EAX
JMP L003
L008:
XOR ECX ,ECX
L009:
MOV ESI ,DWORD PTR DS :[ECX *4+57de81h] ;MOV EBX,DWORD PTR SS:[EBP+ECX*4+402E81] EBP+402E81=522e81
CMP ESI ,0
JNZ L015
POPAD
SUB DWORD PTR SS :[ESP ],5h
RETN
L015:
MOV EDI ,580d61h ;LEA ESI,DWORD PTR SS:[EBP+405D61] EBP+405D61=525d61
ADD ESI ,3FFFFBh
MOV EAX ,0Ah
MUL ECX
ADD EDI ,EAX
XOR EAX ,EAX
L021:
CMP BYTE PTR DS :[EAX +EDI ],3h
JE L074
CMP BYTE PTR DS :[EAX +EDI ],33h
JE L114
CMP BYTE PTR DS :[EAX +EDI ],40h
JB L029
CMP BYTE PTR DS :[EAX +EDI ],58h
JB L031
L029:
INC EAX
JMP L021
L031:
MOV DL ,BYTE PTR DS :[EAX +EDI ]
ADD DL ,8
MOV EBX ,EAX
L034:
INC EBX
CMP DL ,BYTE PTR DS :[EBX +EDI ]
JE L040
CMP EBX ,8
JB L034
JMP L029
L040:
SUB EBX ,EAX
CMP EAX ,0
JNZ L058
CMP EBX ,2
JB L029
DEC EBX
INC EDI
XOR EBP ,EBP
L048:
MOV DL ,BYTE PTR DS :[EDI +EBP ]
MOV BYTE PTR DS :[ESI +EBP ],DL
CMP EBP ,4
JE L153
INC EBP
CMP EBX ,EBP
JNZ L048
INC EDI
XOR EBX ,EBX
JMP L048
L058:
CMP EBX ,2
JE L029
XOR EBP ,EBP
L061:
MOV DL ,BYTE PTR DS :[EDI +EBP ]
MOV BYTE PTR DS :[ESI +EBP ],DL
CMP EBP ,4
JE L153
INC EBP
CMP EAX ,EBP
JNZ L061
INC EDI
XOR EAX ,EAX
CMP EBX ,1
JNZ L061
INC EDI
JMP L061
L074:
MOV DX ,WORD PTR DS :[EAX +EDI ]
ADD DX ,28h
MOV EBX ,EAX
INC EBX
L078:
INC EBX
CMP WORD PTR DS :[EBX +EDI ],DX
JE L084
CMP EBX ,8
JB L078
JMP L029
L084:
CMP EAX ,0
JNZ L099
LEA EAX ,DWORD PTR DS :[EBX -2]
ADD EDI ,2
XOR EBP ,EBP
L089:
MOV DL ,BYTE PTR DS :[EDI +EBP ]
MOV BYTE PTR DS :[ESI +EBP ],DL
CMP EBP ,4
JE L153
INC EBP
CMP EAX ,EBP
JNZ L089
ADD EDI ,2
XOR EAX ,EAX
JMP L089
L099:
SUB EBX ,EAX
XOR EBP ,EBP
L101:
MOV DL ,BYTE PTR DS :[EDI +EBP ]
MOV BYTE PTR DS :[ESI +EBP ],DL
CMP EBP ,4
JE L153
INC EBP
CMP EAX ,EBP
JNZ L101
ADD EDI ,2
XOR EAX ,EAX
CMP EBX ,2
JNZ L101
ADD EDI ,2
JMP L101
L114:
MOV DX ,WORD PTR DS :[EAX +EDI ]
MOV EBX ,EAX
INC EBX
L117:
INC EBX
CMP WORD PTR DS :[EBX +EDI ],DX
JE L123
CMP EBX ,8
JB L117
JMP L029
L123:
CMP EAX ,0
JNZ L138
LEA EAX ,DWORD PTR DS :[EBX -2]
ADD EDI ,2
XOR EBP ,EBP
L128:
MOV DL ,BYTE PTR DS :[EDI +EBP ]
MOV BYTE PTR DS :[ESI +EBP ],DL
CMP EBP ,4
JE L153
INC EBP
CMP EAX ,EBP
JNZ L128
ADD EDI ,2
XOR EAX ,EAX
JMP L128
L138:
SUB EBX ,EAX
XOR EBP ,EBP
L140:
MOV DL ,BYTE PTR DS :[EDI +EBP ]
MOV BYTE PTR DS :[ESI +EBP ],DL
CMP EBP ,4
JE L153
INC EBP
CMP EAX ,EBP
JNZ L140
ADD EDI ,2
XOR EAX ,EAX
CMP EBX ,2
JNZ L140
ADD EDI ,2
JMP L140
L153:
INC ECX
JMP L009end start
写好代码后,重新加载目标文件,忽略全部异常,直接在rdata处下断,运行中断后
005906B7 33C0 XOR EAX ,EAX ;直接运行到这里
005906B9 B9 00010000 MOV ECX ,100
运行后断在5906b7处后,把eip改为sub_Restore_Replace_Code(先选择57d02e,然后CTRL+*),
然后贴上修复代码,贴上后执行到结束处:
0057D02E > 60 PUSHAD ; sub_Restore_Replace_Code
0057D02F 33C0 XOR EAX ,EAX
0057D031 BF 610D5800 MOV EDI ,00580D61
0057D036 833C07 00 CMP DWORD PTR DS :[EDI +EAX ],0
0057D03A 74 07 JE SHORT 0057D043
0057D03C 803407 D7 XOR BYTE PTR DS :[EDI +EAX ],0D7
0057D040 40 INC EAX
0057D041 ^ EB F3 JMP SHORT 0057D036
0057D043 33C9 XOR ECX ,ECX
0057D045 8B348D 81DE5700 MOV ESI ,DWORD PTR DS :[ECX *4+57DE81]
0057D04C 83FE 00 CMP ESI ,0
0057D04F 75 06 JNZ SHORT 0057D057
0057D051 61 POPAD
0057D052 832C24 05 SUB DWORD PTR SS :[ESP ],5 ; f4直接执行到这里
0057D056 C3 RETN
执行完毕后把eip改回原处修复好replace code和embedd protect code之后,修复一下iat和oep信息就可以运行了。
总结一下,为了方便自己操作,我写了一段脚本。
/*
ACPROTCT 1.4 Unpack script v0.1
*/
var addr
var mbase //module base
var rmaddr
var rmsize
var IATVA
var tmpval
start:
gmi eip ,MODULEBASE
mov mbase,$RESULT
gpa "GetModuleHandleA" ,"kernel32.dll"
mov addr ,$RESULT
bprm addr ,0A
esto
lbl1:
bpmc
findop eip ,#F3AA# //Find command 'REP STOSB'
cmp $RESULT,0
je lblabort
go $RESULT
mov addr ,$RESULT
add addr ,2
mov eip ,addr
mov rmaddr,4b7000 //rdata段的开始地址
mov rmsize,a000 //rdata段的大小
bpwm rmaddr,rmsize
esto
lbl2:
bpmc
mov IATVA,esi
mov tmpval,esi
sub IATVA,mbase //计算iat的地始地址VA
findop eip ,#83660C00# //find command 'AND DWORD PTR DS:[ESI+C],0'
cmp $RESULT,0
je lblabort
fill $RESULT,4,90
repl eip ,#602BC0880343380375F961#,#9090909090909090909090#,500 //把清除名字的代码给nop掉
find $RESULT,#618907#
cmp $RESULT,0
je lblabort
go $RESULT
mov addr ,$RESULT
inc addr
fill addr ,2,90
findop addr ,#33C0#
cmp $RESULT,0
je lblabort
mov addr ,$RESULT
go addr
log IATVA
fill 6909c7,1,eb
ret
lblabort:
msg "Error!"
ret
用od载入目标程序,运行该脚本,然后把前面dump下来修复好的Embedd Protect代码段替换这个现在正在操作的这个目标,然后用修复Replace code
的代码修复Replace code,修复完,被上程序的oep被抽的代码,然后dump下目标程序的整个内存,修改OEP,修改正确的IAT信息,iat信息由分析篇
得之:OEP RVA=000B2D84 IAT RVA=000BEB88 SIZE=00002398,修复好后程序就可以运行了。这样就算是比较完整的脱壳了,最后我自己还有一个问题
哪位会的朋友指点下,谢谢,问题:壳把部分资源放到最后一个节去了,如何修复资源呢?, 对这个我一点都不会:-(。如果资源修复好了,最后一个节
应该可以去掉吧。
在脱其它的acprotect的程序时发现有时还会有调用壳的api的代码,我这里附上修复调用壳api的代码:.386 .model flat ,stdcall .code
FillCode proc cmpaddr:DWORD ,waddr:DWORD ;---------------- ;cmpaddr 表示比较地址 ;waddr 要写入地址 pushad
mov edi ,401000h
mov ecx ,0baf00h
@loop1:
cmp word ptr [edi ],25ffh
jnz jmpn
mov ebx ,[edi +2]
cmp ebx ,401000h
jb jmpn
cmp ebx ,521000h
ja jmpn
mov ebx ,[ebx ]
cmp cmpaddr,ebx
jnz @F
mov ebx ,edi
mov eax ,waddr
sub ebx ,eax
sub ebx ,5
mov dword ptr [eax +1],ebx
jmp @end
@@:
add edi ,4
sub ecx ,4
jmpn:
inc edi
dec ecx
jnz @loop1
@end:
popad
ret 8
FillCode endp
@calld52 proc
pushad
CALL @F ;CALL 531100 Get EBP value
MOV EAX ,DWORD PTR SS :[ESP +24h]
SUB EAX ,DWORD PTR SS :[EBP +40F846h]
MOV ECX ,3E9h
LEA EDI ,DWORD PTR SS :[EBP +40D563h]
REPNE SCAS DWORD PTR ES :[EDI ]
OR ECX ,ECX
JNZ @F
NOP
NOP
NOP
NOP
@@:
SUB ECX ,3E9h
NOT ECX
MOVZX EBX ,BYTE PTR SS :[EBP +ECX +40E503h]
LEA EAX ,DWORD PTR SS :[EBP +EBX *4+40E8EBh]
mov eax ,[eax ]
mov EDX ,DWORD PTR SS :[ESP +24h]
sub edx ,5
cmp eax ,5000000h
ja @F
mov ebx ,[eax +8]
mov eax ,[eax +1]
xor eax ,ebx
@@:
invoke FillCode,eax ,edx
popad
ret 4
@calld52 endp
start:
pushad
mov edi ,401000h
mov ecx ,0baf00h
@loop1:
cmp byte ptr [edi ],0e8h
jnz @F
mov ebx ,[edi +1]
lea ebx ,[ebx +edi +5]
cmp ebx ,52d30bh ;判断是否为call去解码处
jnz @Not52d
lea ebx ,[edi +5]
push ebx
call @calld52
jmp @add4
@Not52d:
cmp ebx ,521000h
jb @F
cmp ebx ,538fd2h
ja @F
cmp word ptr [ebx +1],25ffh
jnz @F
mov ebx ,[ebx +3]
mov ebx ,[ebx ]
invoke FillCode,ebx ,edi
@add4:
add edi ,4
sub ecx ,4
@@:
inc edi
dec ecx
jnz @loop1
popad
end start
漫漫长路,终到尽头。分析了这么多,现在看来又好像什么都没有哦:-),花了很多时间,今天终于把ACPROTECT给吃下来了。如果有兴趣可以试试做
脱壳机的,我自己看了分析后认为做这个的脱壳机应该是可行的(如果不行,不能怪我哦:-P)。有所收获有所失去。牺牲了睡眠换来了近视:-9。收工zzZZZZ。
---------------------------各模块代码------------------------------------
sub_EmbeddProtect:
0058AE31 > 837C24 04 FF CMP DWORD PTR SS :[ESP +4],-1 ; 处理SDK的关键代码
0058AE36 74 13 JE SHORT 0058AE4B
0058AE38 90 NOP
0058AE39 90 NOP
0058AE3A 90 NOP
0058AE3B 90 NOP
0058AE3C 55 PUSH EBP
0058AE3D E8 BE120000 CALL <sub_GetEBP >
0058AE42 8BC5 MOV EAX ,EBP
0058AE44 5D POP EBP
0058AE45 FFA0 C4FD4000 JMP DWORD PTR DS :[EAX +40FDC4]
0058AE4B 90 NOP
......
0058AFF7 55 PUSH EBP
0058AFF8 E8 03110000 CALL <sub_GetEBP > ; 这里是关键代码,用于加密解密代码的
0058AFFD 8BC5 MOV EAX ,EBP
0058AFFF 5D POP EBP
0058B000 837C24 04 FF CMP DWORD PTR SS :[ESP +4],-1
0058B005 74 25 JE SHORT 0058B02C
0058B007 90 NOP
0058B008 90 NOP
0058B009 90 NOP
0058B00A 90 NOP
0058B00B 8B98 2C854100 MOV EBX ,DWORD PTR DS :[EAX +41852C]
0058B011 803B CC CMP BYTE PTR DS :[EBX ],0CC
0058B014 0F84 DE000000 JE <Case else>
0058B01A 807B 01 CC CMP BYTE PTR DS :[EBX +1],0CC
0058B01E 0F84 D4000000 JE <Case else>
0058B024 8BC3 MOV EAX ,EBX
0058B026 60 PUSHAD
0058B027 E9 CC000000 JMP <Case else>
0058B02C 60 PUSHAD
0058B02D E8 CE100000 CALL <sub_GetEBP >
0058B032 8B7C24 28 MOV EDI ,DWORD PTR SS :[ESP +28]
0058B036 8B4424 30 MOV EAX ,DWORD PTR SS :[ESP +30]
0058B03A 0BC0 OR EAX ,EAX ; 当EAX=4的时候加密代码,eax=5的时候解密代码
0058B03C 74 3F JE SHORT <Case EAX ==0>
0058B03E 90 NOP
0058B03F 90 NOP
0058B040 90 NOP
0058B041 90 NOP
0058B042 48 DEC EAX
0058B043 0BC0 OR EAX ,EAX
0058B045 74 65 JE SHORT <Case EAX ==1>
0058B047 90 NOP
0058B048 90 NOP
0058B049 90 NOP
0058B04A 90 NOP
0058B04B 48 DEC EAX
0058B04C 0BC0 OR EAX ,EAX
0058B04E 74 68 JE SHORT <Case EAX ==2>
0058B050 90 NOP
0058B051 90 NOP
0058B052 90 NOP
0058B053 90 NOP
0058B054 48 DEC EAX
0058B055 0BC0 OR EAX ,EAX
0058B057 74 75 JE SHORT <Case EAX ==3>
0058B059 90 NOP
0058B05A 90 NOP
0058B05B 90 NOP
0058B05C 90 NOP
0058B05D 48 DEC EAX
0058B05E 0BC0 OR EAX ,EAX
0058B060 74 76 JE SHORT <Case EAX ==4>
0058B062 90 NOP
0058B063 90 NOP
0058B064 90 NOP
0058B065 90 NOP
0058B066 48 DEC EAX
0058B067 0BC0 OR EAX ,EAX
0058B069 74 77 JE SHORT <Case EAX ==5>
0058B06B 90 NOP
0058B06C 90 NOP
0058B06D 90 NOP
0058B06E 90 NOP
0058B06F 48 DEC EAX
0058B070 0BC0 OR EAX ,EAX
0058B072 74 78 JE SHORT <Case EAX ==6>
0058B074 90 NOP
0058B075 90 NOP
0058B076 90 NOP
0058B077 90 NOP
0058B078 EB 7E JMP SHORT <Case else>
0058B07A 90 NOP
0058B07B 90 NOP
0058B07C 90 NOP
0058B07D > 8DB5 2CF54000 LEA ESI ,DWORD PTR SS :[EBP +40F52C] ; 当EAX=0时的处理
0058B083 B9 08000000 MOV ECX ,8
0058B088 F3:A5 REP MOVS DWORD PTR ES :[EDI ],DWORD PTR DS :>
0058B08A 8DB5 50F54000 LEA ESI ,DWORD PTR SS :[EBP +40F550]
0058B090 B9 07000000 MOV ECX ,7
0058B095 F3:A5 REP MOVS DWORD PTR ES :[EDI ],DWORD PTR DS :>
0058B097 4F DEC EDI
0058B098 803F 20 CMP BYTE PTR DS :[EDI ],20
0058B09B 75 06 JNZ SHORT 0058B0A3
0058B09D 90 NOP
0058B09E 90 NOP
0058B09F 90 NOP
0058B0A0 90 NOP
0058B0A1 ^ EB F4 JMP SHORT 0058B097
0058B0A3 C647 01 00 MOV BYTE PTR DS :[EDI +1],0
0058B0A7 EB 4F JMP SHORT <Case else>
0058B0A9 90 NOP
0058B0AA 90 NOP
0058B0AB 90 NOP
0058B0AC > 8A85 6DF74000 MOV AL ,BYTE PTR SS :[EBP +40F76D] ; 当eax==1时的处理
0058B0B2 AA STOS BYTE PTR ES :[EDI ]
0058B0B3 EB 43 JMP SHORT <Case else>
0058B0B5 90 NOP
0058B0B6 90 NOP
0058B0B7 90 NOP
0058B0B8 > 50 PUSH EAX ; 当EAX==2时的处理
0058B0B9 8B4424 24 MOV EAX ,DWORD PTR SS :[ESP +24]
0058B0BD 8985 28F54000 MOV DWORD PTR SS :[EBP +40F528],EAX
0058B0C3 58 POP EAX
0058B0C4 E8 02380000 CALL <Reg_Info>
0058B0C9 EB 2D JMP SHORT <Case else>
0058B0CB 90 NOP
0058B0CC 90 NOP
0058B0CD 90 NOP
0058B0CE > E8 72000000 CALL 0058B145 ; 当 eax=3时的处理
0058B0D3 EB 23 JMP SHORT <Case else>
0058B0D5 90 NOP
0058B0D6 90 NOP
0058B0D7 90 NOP
0058B0D8 > E8 9C020000 CALL <sub_Restore_Crypted_Code> ; 当 eax==4时的处理
0058B0DD EB 19 JMP SHORT <Case else>
0058B0DF 90 NOP
0058B0E0 90 NOP
0058B0E1 90 NOP
0058B0E2 > E8 CA040000 CALL <sub_Decrypt_Code> ; 当 eax==5时的处理
0058B0E7 EB 0F JMP SHORT <Case else>
0058B0E9 90 NOP
0058B0EA 90 NOP
0058B0EB 90 NOP
0058B0EC > 8B85 5D814100 MOV EAX ,DWORD PTR SS :[EBP +41815D] ; 当EAX==6时的处理
0058B0F2 AB STOS DWORD PTR ES :[EDI ]
0058B0F3 EB 03 JMP SHORT <Case else>
0058B0F5 90 NOP
0058B0F6 90 NOP
0058B0F7 90 NOP
0058B0F8 > 90 NOP ; Case else
0058B0F9 90 NOP
0058B0FA 90 NOP
......
0058B133 90 NOP
0058B134 61 POPAD
0058B135 837C24 04 FF CMP DWORD PTR SS :[ESP +4],-1
0058B13A 74 06 JE SHORT 0058B142
0058B13C 90 NOP
0058B13D 90 NOP
0058B13E 90 NOP
0058B13F 90 NOP
0058B140 FFE0 JMP EAX
0058B142 C2 1000 RETN 10
sub_CRC:
004246F9 > 60 PUSHAD ; sub_CRC
004246FA E8 73FAFFFF CALL <GetEBp>
004246FF C685 1A1C4000 C>MOV BYTE PTR SS :[EBP +401C1A],0C3
00424706 E8 1B0E0000 CALL 00425526 ;这个Call 进去
0042470B 61 POPAD
0042470C C3 RETN
进来后:
004256D1 E8 9CEAFFFF CALL <GetEBp> ;这里和上篇里的是一样的,所以我也不多注释了:-)
004256D6 68 20030000 PUSH 320
004256DB 8DBD 00104000 LEA EDI ,DWORD PTR SS :[EBP +401000]
004256E1 57 PUSH EDI
004256E2 6A 00 PUSH 0
004256E4 FF95 20164000 CALL DWORD PTR SS :[EBP +401620] ;GetModuleFileNameA
004256EA 6A 00 PUSH 0
004256EC 68 80000000 PUSH 80
004256F1 6A 03 PUSH 3
004256F3 6A 00 PUSH 0
004256F5 6A 01 PUSH 1
004256F7 68 00000080 PUSH 80000000
004256FC 57 PUSH EDI
004256FD FF95 D8154000 CALL DWORD PTR SS :[EBP +4015D8]
00425703 40 INC EAX
00425704 0F84 8A000000 JE 00425794
0042570A 48 DEC EAX
0042570B 8BF8 MOV EDI ,EAX
0042570D 6A 00 PUSH 0
0042570F 57 PUSH EDI
00425710 FF95 24164000 CALL DWORD PTR SS :[EBP +401624]
00425716 2B85 2C164000 SUB EAX ,DWORD PTR SS :[EBP +40162C]
0042571C 96 XCHG EAX ,ESI
0042571D 56 PUSH ESI
0042571E 6A 40 PUSH 40
00425720 FF95 AC154000 CALL DWORD PTR SS :[EBP +4015AC]
00425726 85C0 TEST EAX ,EAX
00425728 74 61 JE SHORT 0042578B
0042572A 90 NOP
0042572B 90 NOP
0042572C 90 NOP
0042572D 90 NOP
0042572E 93 XCHG EAX ,EBX
0042572F 6A 00 PUSH 0
00425731 8D85 00104000 LEA EAX ,DWORD PTR SS :[EBP +401000]
00425737 50 PUSH EAX
00425738 56 PUSH ESI
00425739 53 PUSH EBX
0042573A 57 PUSH EDI
0042573B FF95 FC154000 CALL DWORD PTR SS :[EBP +4015FC]
00425741 8BC3 MOV EAX ,EBX
00425743 8BCE MOV ECX ,ESI
00425745 60 PUSHAD
00425746 E8 3E060000 CALL 00425D89
0042574B 3985 30164000 CMP DWORD PTR SS :[EBP +401630],EAX
00425751 74 27 JE SHORT 0042577A
00425753 90 NOP
00425754 90 NOP
00425755 90 NOP
00425756 90 NOP
00425757 60 PUSHAD
00425758 E8 15EAFFFF CALL <GetEBp>
0042575D B8 00010000 MOV EAX ,100
00425762 E8 18EAFFFF CALL 0042417F
00425767 8BC8 MOV ECX ,EAX
00425769 8DBD 9A404000 LEA EDI ,DWORD PTR SS :[EBP +40409A]
0042576F 03F8 ADD EDI ,EAX
00425771 E8 1DEAFFFF CALL 00424193
00425776 AB STOS DWORD PTR ES :[EDI ]
00425777 ^ E2 F8 LOOPD SHORT 00425771
00425779 61 POPAD
0042577A 61 POPAD
0042577B 8D85 A42C4000 LEA EAX ,DWORD PTR SS :[EBP +402CA4]
00425781 50 PUSH EAX
00425782 C3 RETN
00425783 53 PUSH EBX
00425784 FF95 B0154000 CALL DWORD PTR SS :[EBP +4015B0]
0042578A 96 XCHG EAX ,ESI
0042578B 50 PUSH EAX
0042578C 57 PUSH EDI
0042578D FF95 D4154000 CALL DWORD PTR SS :[EBP +4015D4]
00425793 58 POP EAX
00425794 60 PUSHAD
00425795 E8 00000000 CALL 0042579A
0042579A 5E POP ESI
0042579B 83EE 06 SUB ESI ,6
0042579E B9 C3000000 MOV ECX ,0C3
004257A3 29CE SUB ESI ,ECX
004257A5 BA 48A6FC64 MOV EDX ,64FCA648
004257AA C1E9 02 SHR ECX ,2
004257AD 83E9 02 SUB ECX ,2
004257B0 83F9 00 CMP ECX ,0
004257B3 7C 1A JL SHORT 004257CF
004257B5 8B048E MOV EAX ,DWORD PTR DS :[ESI +ECX *4]
004257B8 8B5C8E 04 MOV EBX ,DWORD PTR DS :[ESI +ECX *4+4]
004257BC 2BC3 SUB EAX ,EBX
004257BE C1C0 1D ROL EAX ,1D
004257C1 03C2 ADD EAX ,EDX
004257C3 81C2 5E6AB05C ADD EDX ,5CB06A5E
004257C9 89048E MOV DWORD PTR DS :[ESI +ECX *4],EAX
004257CC 49 DEC ECX
004257CD ^ EB E1 JMP SHORT 004257B0
004257CF 61 POPAD
004257D0 61 POPAD
004257D1 C3 RETN
sub_INT 1_Check_Debug:
0042170B > 60 PUSHAD ; sub_INT 1_Check_Debug
0042170C 4D DEC EBP
0042170D 50 PUSH EAX
0042170E E8 01000000 CALL 00421714
00421713 ^ 71 83 JNO SHORT 00421698
00421715 C40458 LES EAX ,FWORD PTR DS :[EAX +EBX *2] ; Modification of segment register
00421718 66:BD D8B7 MOV BP ,0B7D8
0042171C 7C 03 JL SHORT 00421721
0042171E 7D 01 JGE SHORT 00421721
00421720 - E9 F850E801 JMP 022A681D
00421725 0000 ADD BYTE PTR DS :[EAX ],AL
00421727 00EB ADD BL ,CH
......
004218B6 E8 72F6FFFF CALL <GetEBP>
004218BB C685 711E4000 C>MOV BYTE PTR SS :[EBP +401E71],0C3
004218C2 8CC8 MOV AX ,CS
004218C4 A8 04 TEST AL ,4 ; 如果系统是Winnt的,则通过int 1检测调试器
004218C6 75 5A JNZ SHORT <OS is Win9x>
004218C8 90 NOP
004218C9 90 NOP
004218CA 90 NOP
004218CB 90 NOP
004218CC E8 0E000000 CALL 004218DF
004218D1 8B5C24 0C MOV EBX ,DWORD PTR SS :[ESP +C]
004218D5 8383 B8000000 0>ADD DWORD PTR DS :[EBX +B8],2
004218DC 33C0 XOR EAX ,EAX
004218DE C3 RETN
004218DF 64:67:FF36 0000 PUSH DWORD PTR FS :[0]
004218E5 64:67:8926 0000 MOV DWORD PTR FS :[0],ESP
004218EB 33C0 XOR EAX ,EAX
004218ED CD 01 INT 1
004218EF 40 INC EAX
004218F0 40 INC EAX
004218F1 0BC0 OR EAX ,EAX
004218F3 75 27 JNZ SHORT 0042191C ; 如果没有发现则跳
004218F5 90 NOP
004218F6 90 NOP
004218F7 90 NOP
004218F8 90 NOP
004218F9 60 PUSHAD
004218FA E8 2EF6FFFF CALL <GetEBP>
004218FF B8 00010000 MOV EAX ,100
00421904 E8 31F6FFFF CALL 00420F3A
00421909 8BC8 MOV ECX ,EAX
0042190B 8DBD 9A404000 LEA EDI ,DWORD PTR SS :[EBP +40409A]
00421911 03F8 ADD EDI ,EAX
00421913 E8 36F6FFFF CALL 00420F4E
00421918 AB STOS DWORD PTR ES :[EDI ]
00421919 ^ E2 F8 LOOPD SHORT 00421913
0042191B 61 POPAD
0042191C 33C0 XOR EAX ,EAX
0042191E 64:8F00 POP DWORD PTR FS :[EAX ]
00421921 58 POP EAX
00421922 > 60 PUSHAD ; OS is Win9x
00421923 E8 00000000 CALL 00421928
00421928 5E POP ESI
00421929 83EE 06 SUB ESI ,6
0042192C B9 6C000000 MOV ECX ,6C
00421931 29CE SUB ESI ,ECX
00421933 BA 2B3C3C6D MOV EDX ,6D3C3C2B
00421938 C1E9 02 SHR ECX ,2
0042193B 83E9 02 SUB ECX ,2
0042193E 83F9 00 CMP ECX ,0
00421941 7C 1A JL SHORT 0042195D
00421943 8B048E MOV EAX ,DWORD PTR DS :[ESI +ECX *4]
00421946 8B5C8E 04 MOV EBX ,DWORD PTR DS :[ESI +ECX *4+4]
0042194A 03C3 ADD EAX ,EBX
0042194C C1C8 1B ROR EAX ,1B
0042194F 03C2 ADD EAX ,EDX
00421951 81F2 C6E14F4D XOR EDX ,4D4FE1C6
00421957 89048E MOV DWORD PTR DS :[ESI +ECX *4],EAX
0042195A 49 DEC ECX
0042195B ^ EB E1 JMP SHORT 0042193E
0042195D 61 POPAD
0042195E 61 POPAD
0042195F C3 RETN sub_Anti_Fake_Unpack:
00422027 > 60 PUSHAD ; sub_Anti_Fake_Unpack
00422028 4E DEC ESI
00422029 87EA XCHG EDX ,EBP
0042202B 46 INC ESI
0042202C 50 PUSH EAX
0042202D E8 01000000 CALL 00422033
00422032 ^ 77 83 JA SHORT 00421FB7
00422034 C40458 LES EAX ,FWORD PTR DS :[EAX +EBX *2] ; Modification of segment register
00422037 66:8BD1 MOV DX ,CX
......
004221D2 E8 56EDFFFF CALL <GetEBP>
004221D7 C685 8D274000 C>MOV BYTE PTR SS :[EBP +40278D],0C3
004221DE 8BB5 28164000 MOV ESI ,DWORD PTR SS :[EBP +401628]
004221E4 66:8B16 MOV DX ,WORD PTR DS :[ESI ]
004221E7 66:81FA 4D5A CMP DX ,5A4D
004221EC 0F85 B1000000 JNZ <Good way>
004221F2 0FB756 3C MOVZX EDX ,WORD PTR DS :[ESI +3C]
004221F6 8BFE MOV EDI ,ESI
004221F8 03FA ADD EDI ,EDX
004221FA 8B47 28 MOV EAX ,DWORD PTR DS :[EDI +28]
004221FD 3B85 50164000 CMP EAX ,DWORD PTR SS :[EBP +401650]
00422203 74 7B JE SHORT <over way> ; 如果 发现入口和原程序一样则over
00422205 90 NOP
00422206 90 NOP
00422207 90 NOP
00422208 90 NOP
00422209 3B85 54164000 CMP EAX ,DWORD PTR SS :[EBP +401654] ; 比较如果入口和壳入口不一样则over,感觉有点多余,直接判断不为壳入口不行吗?
0042220F 75 6F JNZ SHORT <over way>
00422211 90 NOP
00422212 90 NOP
00422213 90 NOP
00422214 90 NOP
00422215 0FB747 06 MOVZX EAX ,WORD PTR DS :[EDI +6] ; 判断section是否为5,如果不为5则over
00422219 48 DEC EAX
0042221A 3D 04000000 CMP EAX ,4
0042221F 75 5F JNZ SHORT <over way>
00422221 90 NOP
00422222 90 NOP
00422223 90 NOP
00422224 90 NOP
00422225 BA 28000000 MOV EDX ,28
0042222A F7E2 MUL EDX
0042222C 05 F8000000 ADD EAX ,0F8
00422231 03C7 ADD EAX ,EDI
00422233 50 PUSH EAX
00422234 83C0 0C ADD EAX ,0C
00422237 8B18 MOV EBX ,DWORD PTR DS :[EAX ]
00422239 3B9D 54164000 CMP EBX ,DWORD PTR SS :[EBP +401654] ; 再次判断入口是否为壳的入口,
0042223F 75 3F JNZ SHORT <over way>
00422241 90 NOP
00422242 90 NOP
00422243 90 NOP
00422244 90 NOP
00422245 5E POP ESI
00422246 813E 2E706572 CMP DWORD PTR DS :[ESI ],7265702E ; 比 较最后一个字的名字是否为:.perplex
0042224C 75 32 JNZ SHORT <over way> ; 如果 不是则over
0042224E 90 NOP
0042224F 90 NOP
00422250 90 NOP
00422251 90 NOP
00422252 817E 04 706C657>CMP DWORD PTR DS :[ESI +4],78656C70
00422259 75 25 JNZ SHORT <over way>
0042225B 90 NOP
0042225C 90 NOP
0042225D 90 NOP
0042225E 90 NOP
0042225F 8B85 54164000 MOV EAX ,DWORD PTR SS :[EBP +401654]
00422265 8BBD 28164000 MOV EDI ,DWORD PTR SS :[EBP +401628]
0042226B 0FB61C07 MOVZX EBX ,BYTE PTR DS :[EDI +EAX ] ; 判断壳入口是否为pushad(60)如果不相等则over
0042226F 80EB 30 SUB BL ,30
00422272 80FB 30 CMP BL ,30
00422275 75 09 JNZ SHORT <over way>
00422277 90 NOP
00422278 90 NOP
00422279 90 NOP
0042227A 90 NOP
0042227B EB 26 JMP SHORT <Good way>
0042227D 90 NOP
0042227E 90 NOP
0042227F 90 NOP
00422280 > 60 PUSHAD ; Game over
00422281 E8 A7ECFFFF CALL <GetEBP> ; 如 果发现程序被修改了就写入随机垃圾代码
00422286 B8 00010000 MOV EAX ,100
0042228B E8 AAECFFFF CALL 00420F3A
00422290 8BC8 MOV ECX ,EAX
00422292 8DBD 9A404000 LEA EDI ,DWORD PTR SS :[EBP +40409A]
00422298 03F8 ADD EDI ,EAX
0042229A E8 AFECFFFF CALL 00420F4E
0042229F AB STOS DWORD PTR ES :[EDI ]
004222A0 ^ E2 F8 LOOPD SHORT 0042229A
004222A2 61 POPAD
004222A3 > 60 PUSHAD ; Good way
004222A4 E8 00000000 CALL 004222A9
004222A9 5E POP ESI
004222AA 83EE 06 SUB ESI ,6
004222AD B9 D1000000 MOV ECX ,0D1
004222B2 29CE SUB ESI ,ECX
004222B4 BA 0D4034EF MOV EDX ,EF34400D
004222B9 C1E9 02 SHR ECX ,2
004222BC 83E9 02 SUB ECX ,2
004222BF 83F9 00 CMP ECX ,0
004222C2 7C 1A JL SHORT 004222DE
004222C4 8B048E MOV EAX ,DWORD PTR DS :[ESI +ECX *4]
004222C7 8B5C8E 04 MOV EBX ,DWORD PTR DS :[ESI +ECX *4+4]
004222CB 33C3 XOR EAX ,EBX
004222CD C1C0 14 ROL EAX ,14
004222D0 33C2 XOR EAX ,EDX
004222D2 81EA 85A8D2E1 SUB EDX ,E1D2A885
004222D8 89048E MOV DWORD PTR DS :[ESI +ECX *4],EAX
004222DB 49 DEC ECX
004222DC ^ EB E1 JMP SHORT 004222BF
004222DE 61 POPAD
004222DF 61 POPAD
004222E0 C3 RETN sub_Copy code:
004228F3 > 60 PUSHAD ; sub_Copy code
004228F4 7A 03 JPE SHORT 004228F9
004228F6 7B 01 JPO SHORT 004228F9
004228F8 9A 0F890600 000>CALL FAR 0000:0006890F ; Far call
004228FF 81D0 94B7BD5B ADC EAX ,5BBDB794
00422905 E8 01000000 CALL 0042290B
0042290A ^ 72 83 JB SHORT 0042288F
0042290C C404F9 LES EAX ,FWORD PTR DS :[ECX +EDI *8] ; Modification of segment register
......
00422A9E E8 8AE4FFFF CALL <GetEBP>
00422AA3 C685 59304000 C>MOV BYTE PTR SS :[EBP +403059],0C3 ; 只 执行一次call
00422AAA 8DB5 9A404000 LEA ESI ,DWORD PTR SS :[EBP +40409A]
00422AB0 46 INC ESI
00422AB1 8B06 MOV EAX ,DWORD PTR DS :[ESI ]
00422AB3 3D 52455452 CMP EAX ,52544552
00422AB8 ^ 75 F6 JNZ SHORT 00422AB0 ; 查 找标志
00422ABA 8B46 04 MOV EAX ,DWORD PTR DS :[ESI +4]
00422ABD 3D 49564150 CMP EAX ,50415649
00422AC2 ^ 75 EC JNZ SHORT 00422AB0
00422AC4 8B46 08 MOV EAX ,DWORD PTR DS :[ESI +8]
00422AC7 3D 495A4346 CMP EAX ,46435A49
00422ACC ^ 75 E2 JNZ SHORT 00422AB0
00422ACE 83C6 0E ADD ESI ,0E
00422AD1 8DBD AC154000 LEA EDI ,DWORD PTR SS :[EBP +4015AC]
00422AD7 B9 28000000 MOV ECX ,28
00422ADC F3:A5 REP MOVS DWORD PTR ES :[EDI ],DWORD PTR DS >; 复制代码
00422ADE EB 26 JMP SHORT 00422B06
00422AE0 90 NOP
00422AE1 90 NOP
00422AE2 90 NOP
00422AE3 60 PUSHAD
00422AE4 E8 44E4FFFF CALL <GetEBP>
00422AE9 B8 00010000 MOV EAX ,100
00422AEE E8 47E4FFFF CALL 00420F3A
00422AF3 8BC8 MOV ECX ,EAX
00422AF5 8DBD 9A404000 LEA EDI ,DWORD PTR SS :[EBP +40409A]
00422AFB 03F8 ADD EDI ,EAX
00422AFD E8 4CE4FFFF CALL 00420F4E
00422B02 AB STOS DWORD PTR ES :[EDI ]
00422B03 ^ E2 F8 LOOPD SHORT 00422AFD
00422B05 61 POPAD
00422B06 60 PUSHAD ; 加 密代码
00422B07 E8 00000000 CALL 00422B0C
00422B0C 5E POP ESI
00422B0D 83EE 06 SUB ESI ,6
00422B10 B9 68000000 MOV ECX ,68
00422B15 29CE SUB ESI ,ECX
00422B17 BA 5EC43194 MOV EDX ,9431C45E
00422B1C C1E9 02 SHR ECX ,2
00422B1F 83E9 02 SUB ECX ,2
00422B22 83F9 00 CMP ECX ,0
00422B25 7C 1A JL SHORT 00422B41
00422B27 8B048E MOV EAX ,DWORD PTR DS :[ESI +ECX *4]
00422B2A 8B5C8E 04 MOV EBX ,DWORD PTR DS :[ESI +ECX *4+4]
00422B2E 2BC3 SUB EAX ,EBX
00422B30 C1C0 1D ROL EAX ,1D
00422B33 33C2 XOR EAX ,EDX
00422B35 81F2 6CD4719B XOR EDX ,9B71D46C
00422B3B 89048E MOV DWORD PTR DS :[ESI +ECX *4],EAX
00422B3E 49 DEC ECX
00422B3F ^ EB E1 JMP SHORT 00422B22
00422B41 61 POPAD
00422B42 61 POPAD
00422B43 C3 RETN
sub_Fuck_RING0'Debugger:
004243AB > 60 PUSHAD
004243AC . E8 C1FDFFFF CALL <GetEBp> ; 检测Ring 0给调试器
004243B1 . C685 CC184000>MOV BYTE PTR SS :[EBP +4018CC],0C3
004243B8 . E8 00000000 CALL 004243BD
004243BD $ 5D POP EBP
004243BE . 8BF5 MOV ESI ,EBP
004243C0 . 81ED DE184000 SUB EBP ,004018DE
004243C6 . 8DB5 2C194000 LEA ESI ,DWORD PTR SS :[EBP +40192C]
004243CC > 6A 00 PUSH 0
004243CE . 68 80000000 PUSH 80
004243D3 . 6A 03 PUSH 3
004243D5 . 6A 00 PUSH 0
004243D7 . 6A 03 PUSH 3
004243D9 . 68 000000C0 PUSH C0000000
004243DE . 56 PUSH ESI
004243DF . FF95 D8154000 CALL DWORD PTR SS :[EBP +4015D8] ; CreateFileA
004243E5 . 40 INC EAX
004243E6 . 75 1E JNZ SHORT 00424406
004243E8 . 90 NOP
004243E9 . 90 NOP
004243EA . 90 NOP
004243EB . 90 NOP
004243EC . 48 DEC EAX
004243ED . 50 PUSH EAX
004243EE . FF95 D4154000 CALL DWORD PTR SS :[EBP +4015D4]
004243F4 > 46 INC ESI
004243F5 . 803E 00 CMP BYTE PTR DS :[ESI ],0
004243F8 .^ 75 FA JNZ SHORT 004243F4
004243FA . 46 INC ESI
004243FB . 803E 00 CMP BYTE PTR DS :[ESI ],0
004243FE . 0F84 C2000000 JE 004244C6
00424404 .^ EB C6 JMP SHORT 004243CC
00424406 > E8 BB000000 CALL 004244C6
0042440B . 5C 5C 2E 5C 5>ASCII "\\.\SICE" ,0
00424414 . 5C 5C 2E 5C 4>ASCII "\\.\NTICE" ,0
0042441E . 5C 5C 2E 5C 4>ASCII "\\.\NTICE7871" ,0
0042442C . 5C 5C 2E 5C 4>ASCII "\\.\NTICED052" ,0
0042443A . 5C 5C 2E 5C 5>ASCII "\\.\TRWDEBUG" ,0
00424447 . 5C 5C 2E 5C 5>ASCII "\\.\TRW" ,0
0042444F . 5C 5C 2E 5C 5>ASCII "\\.\TRW2000" ,0
0042445B . 5C 5C 2E 5C 5>ASCII "\\.\SUPERBPM" ,0
00424468 . 5C 5C 2E 5C 4>ASCII "\\.\ICEDUMP" ,0
00424474 . 5C 5C 2E 5C 5>ASCII "\\.\REGMON" ,0
0042447F . 5C 5C 2E 5C 4>ASCII "\\.\FILEMON" ,0
0042448B . 5C 5C 2E 5C 5>ASCII "\\.\REGVXD" ,0
00424496 . 5C 5C 2E 5C 4>ASCII "\\.\FILEVXD" ,0
004244A2 . 5C 5C 2E 5C 5>ASCII "\\.\VKEYPROD" ,0
004244AF . 5C 5C 2E 5C 4>ASCII "\\.\BW2K" ,0
004244B8 . 5C 5C 2E 5C 5>ASCII "\\.\SIWDEBUG" ,0
004244C5 00 DB 00
004244C6 /$ 61 POPAD
004244C7 \. C3 RETN sub_Fuck_int3:
0042196B > 60 PUSHAD ; sub_Fuck_int3
0042196C E8 01000000 CALL 00421972
00421971 ^ 7D 83 JGE SHORT 004218F6
00421973 04 24 ADD AL ,24
......
00421B16 E8 12F4FFFF CALL <GetEBP>
00421B1B C685 D1204000 C>MOV BYTE PTR SS :[EBP +4020D1],0C3
00421B22 E8 2A000000 CALL 00421B51
00421B27 8B4424 04 MOV EAX ,DWORD PTR SS :[ESP +4]
00421B2B 8B4C24 0C MOV ECX ,DWORD PTR SS :[ESP +C]
00421B2F FF81 B8000000 INC DWORD PTR DS :[ECX +B8]
00421B35 8B00 MOV EAX ,DWORD PTR DS :[EAX ]
00421B37 2D 03000080 SUB EAX ,80000003
00421B3C 75 12 JNZ SHORT 00421B50
00421B3E 90 NOP
00421B3F 90 NOP
00421B40 90 NOP
00421B41 90 NOP
00421B42 33C0 XOR EAX ,EAX
00421B44 8941 04 MOV DWORD PTR DS :[ECX +4],EAX ; 清除硬件断点
00421B47 8941 08 MOV DWORD PTR DS :[ECX +8],EAX
00421B4A 8941 0C MOV DWORD PTR DS :[ECX +C],EAX
00421B4D 8941 10 MOV DWORD PTR DS :[ECX +10],EAX
00421B50 C3 RETN
00421B51 33C0 XOR EAX ,EAX
00421B53 64:FF30 PUSH DWORD PTR FS :[EAX ]
00421B56 64:8920 MOV DWORD PTR FS :[EAX ],ESP
00421B59 CC INT3
00421B5A 90 NOP
00421B5B 64:67:8F06 0000 POP DWORD PTR FS :[0]
00421B61 83C4 04 ADD ESP ,4
00421B64 60 PUSHAD
00421B65 E8 00000000 CALL 00421B6A
00421B6A 5E POP ESI
00421B6B 83EE 06 SUB ESI ,6
00421B6E B9 4E000000 MOV ECX ,4E
00421B73 29CE SUB ESI ,ECX
00421B75 BA 8742CECC MOV EDX ,CCCE4287
00421B7A C1E9 02 SHR ECX ,2
00421B7D 83E9 02 SUB ECX ,2
00421B80 83F9 00 CMP ECX ,0
00421B83 7C 1A JL SHORT 00421B9F
00421B85 8B048E MOV EAX ,DWORD PTR DS :[ESI +ECX *4]
00421B88 8B5C8E 04 MOV EBX ,DWORD PTR DS :[ESI +ECX *4+4]
00421B8C 2BC3 SUB EAX ,EBX
00421B8E C1C8 02 ROR EAX ,2
00421B91 33C2 XOR EAX ,EDX
00421B93 81EA FEC97E35 SUB EDX ,357EC9FE
00421B99 89048E MOV DWORD PTR DS :[ESI +ECX *4],EAX
00421B9C 49 DEC ECX
00421B9D ^ EB E1 JMP SHORT 00421B80
00421B9F 61 POPAD
00421BA0 61 POPAD
00421BA1 C3 RETN Anti_Fake_Unpack_check_Import:
00422691 > 60 PUSHAD ; Anti_Fake_Unpack_check_Import
00422692 4F DEC EDI
00422693 66:D3E7 SHL DI ,CL
00422696 03F3 ADD ESI ,EBX
00422698 E8 01000000 CALL 0042269E
0042269D ^ 76 83 JBE SHORT 00422622
......
0042283C E8 ECE6FFFF CALL <GetEBP>
00422841 C685 F72D4000 C>MOV BYTE PTR SS :[EBP +402DF7],0C3
00422848 8BB5 28164000 MOV ESI ,DWORD PTR SS :[EBP +401628] ; 定位pe头
0042284E 0FB756 3C MOVZX EDX ,WORD PTR DS :[ESI +3C]
00422852 8BFE MOV EDI ,ESI
00422854 03FA ADD EDI ,EDX
00422856 83C7 78 ADD EDI ,78
00422859 83C7 08 ADD EDI ,8
0042285C 8B07 MOV EAX ,DWORD PTR DS :[EDI ] ; 定位输入表
0042285E 8B5F 04 MOV EBX ,DWORD PTR DS :[EDI +4] ; 定位输入表大小
00422861 81FB D8000000 CMP EBX ,0D8 ; 如果输入表大小不为D8则over
00422867 75 29 JNZ SHORT <over>
00422869 90 NOP
0042286A 90 NOP
0042286B 90 NOP
0042286C 90 NOP
0042286D 0385 28164000 ADD EAX ,DWORD PTR SS :[EBP +401628]
00422873 05 88000000 ADD EAX ,88
00422878 B9 4D000000 MOV ECX ,4D
0042287D E8 C2020000 CALL 00422B44
00422882 3D 8A180000 CMP EAX ,188A ; 又来检测了
00422887 75 09 JNZ SHORT <over>
00422889 90 NOP
0042288A 90 NOP
0042288B 90 NOP
0042288C 90 NOP
0042288D EB 26 JMP SHORT 004228B5
0042288F 90 NOP
00422890 90 NOP
00422891 90 NOP
00422892 > 60 PUSHAD ; over
00422893 E8 95E6FFFF CALL <GetEBP>
00422898 B8 00010000 MOV EAX ,100
0042289D E8 98E6FFFF CALL 00420F3A
004228A2 8BC8 MOV ECX ,EAX
004228A4 8DBD 9A404000 LEA EDI ,DWORD PTR SS :[EBP +40409A]
004228AA 03F8 ADD EDI ,EAX
004228AC E8 9DE6FFFF CALL 00420F4E
004228B1 AB STOS DWORD PTR ES :[EDI ]
004228B2 ^ E2 F8 LOOPD SHORT 004228AC
004228B4 61 POPAD
004228B5 60 PUSHAD
004228B6 E8 00000000 CALL 004228BB
004228BB 5E POP ESI
004228BC 83EE 06 SUB ESI ,6
004228BF B9 79000000 MOV ECX ,79
004228C4 29CE SUB ESI ,ECX
004228C6 BA B4276A21 MOV EDX ,216A27B4
004228CB C1E9 02 SHR ECX ,2
004228CE 83E9 02 SUB ECX ,2
004228D1 83F9 00 CMP ECX ,0
004228D4 7C 1A JL SHORT 004228F0
004228D6 8B048E MOV EAX ,DWORD PTR DS :[ESI +ECX *4]
004228D9 8B5C8E 04 MOV EBX ,DWORD PTR DS :[ESI +ECX *4+4]
004228DD 03C3 ADD EAX ,EBX
004228DF C1C8 08 ROR EAX ,8
004228E2 03C2 ADD EAX ,EDX
004228E4 81C2 18896C50 ADD EDX ,506C8918
004228EA 89048E MOV DWORD PTR DS :[ESI +ECX *4],EAX
004228ED 49 DEC ECX
004228EE ^ EB E1 JMP SHORT 004228D1
004228F0 61 POPAD
004228F1 61 POPAD
004228F2 C3 RETN sub_Restore_Crypted_Code:
0058B379 > 60 PUSHAD ; sub_Restore_Crypted_Code
......
0058B525 60 PUSHAD
0058B526 8B4424 44 MOV EAX ,DWORD PTR SS :[ESP +44]
0058B52A 2B85 46F84000 SUB EAX ,DWORD PTR SS :[EBP +40F846]
0058B530 8BD8 MOV EBX ,EAX
0058B532 33C9 XOR ECX ,ECX
0058B534 49 DEC ECX
0058B535 41 INC ECX
0058B536 83F9 64 CMP ECX ,64
0058B539 74 19 JE SHORT 0058B554
0058B53B 90 NOP
0058B53C 90 NOP
0058B53D 90 NOP
0058B53E 90 NOP
0058B53F 8B848D 3D1B4000 MOV EAX ,DWORD PTR SS :[EBP +ECX *4+401B3D]
0058B546 03848D CD1C4000 ADD EAX ,DWORD PTR SS :[EBP +ECX *4+401CCD]
0058B54D 83E8 24 SUB EAX ,24
0058B550 3BC3 CMP EAX ,EBX
0058B552 ^ 75 E1 JNZ SHORT 0058B535
0058B554 8BB48D 5D1E4000 MOV ESI ,DWORD PTR SS :[EBP +ECX *4+401E5D]
0058B55B 8BBC8D 3D1B4000 MOV EDI ,DWORD PTR SS :[EBP +ECX *4+401B3D]
0058B562 03BD 46F84000 ADD EDI ,DWORD PTR SS :[EBP +40F846]
0058B568 8B948D CD1C4000 MOV EDX ,DWORD PTR SS :[EBP +ECX *4+401CCD]
0058B56F 87CA XCHG EDX ,ECX
0058B571 F3:A4 REP MOVS BYTE PTR ES :[EDI ],BYTE PTR DS :[E>; 把代码加密回去
0058B573 90 NOP
......
0058B5AF 61 POPAD
0058B5B0 C3 RETN [EBP +401650] ;保存程序的OEP
[EBP +401654] ;保存壳的入口EP Greetz:
Fly.Jingulong,yock,tDasm.David.hexer,hmimys,ahao.UFO(brother).alan(sister).all of my friends and you!
By loveboom[DFCG][FCG][US]
http://blog.csdn.net/bmd2chen
Email:loveboom#163.com
Date:2005-6-11 2:35
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)