处理ASProtect的Advanced Import Protect的一些想法和过程(3)

目标:找到哪些地址有 call  01ba0000代码,并且进入壳中后又进入哪个API函数。

1、在进入01ba0000开始处写入代码,可以很容易根据ESP中的内容得到call 01ba0000这句代码的地址;

获得CALL 入地址

pushad
pushfd
mov eax,dword ptr [esp+24]//这时EAX中就是想要的
mov ebx,dword ptr [地址1]//地址1中存放的是 ‘地址2’地址2是存放想要东西的开始
mov [ebx],eax
add dword ptr [地址1],4//准备存放下一个
popfd
popad
***
***原来要执行的代码
jmp  跑回原来地方执行
 【部分重要二进制代码:】60 9C 8B 44 24 24 83 E8 05 8B 1D D0 01 BA 01 89 03 83 05 D0 01 BA 01 04 9D 61

2、调用哪个API函数?

在这里,00ACC2E1    F3:A6              REPE CMPS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI],就是比较目标函数字符串名与DLL中遍历的函数名,相同时就离得到API不远了。在此句的下一句设置跳转,去执行我们的代码,在执行我们的代码前要复制壳中的些许代码,因为在离得到API近的代码处会有检查,代码如下:

JE &&                    ; REP后的指令过来
MOV AL,BYTE PTR DS:[ESI-1]
JMP 00ACC2E8                         ; 不同的话就回到和原来一样
NOP
&&:  POP ESI
POP EDI
ADD ESP,4                            ; 这是对RETN指令的同步
NOP
TEST EAX,EAX
MOV EAX,DWORD PTR SS:[EBP+8]
MOV EAX,DWORD PTR DS:[EAX]
PUSH EAX
PUSH ESI
MOV EAX,DWORD PTR SS:[EBP-18]
PUSH EAX
PUSH EBX
PUSH 0AFCB13                         ; call  00afca60
NOP
PUSH EBP
MOV EBP,ESP
PUSH ECX
PUSH EDX
MOV EAX,DWORD PTR SS:[EBP+10]
MOV EDX,DWORD PTR SS:[EBP+C]
SHL EAX,1
ADD EAX,DWORD PTR DS:[EDX+24]
ADD EAX,DWORD PTR SS:[EBP+8]
MOV AX,WORD PTR DS:[EAX]
AND EAX,0FFFF
SHL EAX,2
ADD EAX,DWORD PTR DS:[EDX+1C]
ADD EAX,DWORD PTR SS:[EBP+8]
MOV EAX,DWORD PTR DS:[EAX]
ADD EAX,DWORD PTR SS:[EBP+8]         ; 得到真实地址,保存在EAX中

 下面才是我写的代码:

PUSHAD                               ; 从这里开始自己代码
PUSHFD
MOV EBX,DWORD PTR DS:[地址1]
MOV DWORD PTR DS:[EBX],EAX
ADD DWORD PTR DS:[地址1],4
POPFD
POPAD
JMP 00AFCA89这是跑到壳中接着执行

在上面的复制壳代码的过程中,不是完全复制的,而是有一些处理,很不部分。比如壳中有一处是ret  我写成add  esp,4  JMP **,等。

【一个完整可用的二进制代码:从00b19c00到00b19c74】:
74 09 8A 46 FF E9 DE 26 FB FF 90 5E 5F 83 C4 04 85 C0 8B 45 08 8B 00 50 56 8B 45 E8 50 53 68 13
CB AF 00 55 8B EC 51 52 8B 45 10 8B 55 0C D1 E0 90 03 42 24 03 45 08 66 8B 00 25 FF FF 00 00 C1
E0 02 03 42 1C 03 45 08 8B 00 03 45 08 60 9C 8B 1D 70 9C B1 00 89 03 83 05 70 9C B1 00 04 9D 61
E9 24 2E FE FF 00 00 00 00 00 00 00 00 00 00 00 80 9C B1 00

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

最后得到结果:

1、API:

BD 2F 81 7C F2 1E 80 7C 41 B7 80 7C F6 E8 D2 77 39 7C D2 77 BB 7A DA 77 BB 7A DA 77 E2 9D 68 7D
65 02 D3 77 95 14 82 7C 1E 62 83 7C 5D 63 83 7C E7 EA DA 77 56 BE 80 7C E7 EA DA 77 27 6C DA 77
C1 C1 33 76 56 BE 80 7C 7C B8 80 7C 7C B8 80 7C 56 BE 80 7C 7C B8 80 7C EA 07 D5 77 56 BE 80 7C
56 BE 80 7C 56 BE 80 7C 7C B8 80 7C 5D EE D3 77 F6 E8 D2 77 FE 2F 63 7D 10 7C 33 76 F2 F7 85 7C
D5 65 83 7C 17 8B 83 7C 17 8B 83 7C 77 EE 80 7C 63 25 32 76 94 4E 83 7C 9F 30 32 76 36 54 83 7C
36 54 83 7C FE 53 83 7C 94 4E 83 7C 56 BE 80 7C 5D EE D3 77

2、call  01ba0000

D3 10 40 00 31 11 40 00 4C 11 40 00 8C 31 40 00 C8 31 40 00 B6 24 40 00 04 25 40 00 9D 30 40 00
DA 22 40 00 83 23 40 00 95 4B 40 00 AC 4B 40 00 59 24 40 00 69 24 40 00 7E 24 40 00 B9 26 40 00
C2 4F 40 00 EE 4E 40 00 AB 4C 40 00 08 4D 40 00 C3 39 40 00 BC 23 40 00 3A 24 40 00 60 4F 40 00
5B 4E 40 00 10 4E 40 00 78 4C 40 00 56 13 40 00 05 15 40 00 1D 15 40 00 B0 4F 40 00 1B 32 40 00
34 32 40 00 FC 32 40 00 53 33 40 00 C9 21 40 00 CE 4F 40 00 80 33 40 00 C8 4F 40 00 F5 34 40 00
05 35 40 00 70 35 40 00 7C 35 40 00 A0 35 40 00 79 1E 40 00

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

接着下一步操作:

把得到的两种地址放在某处,我选择01ba0000这个壳的段中,

call  01ba0000  地址放在01ba0180

D3 10 40 00 31 11 40 00 4C 11 40 00 8C 31 40 00 C8 31 40 00 B6 24 40 00 04 25 40 00 9D 30 40 00
DA 22 40 00 83 23 40 00 95 4B 40 00 AC 4B 40 00 59 24 40 00 69 24 40 00 7E 24 40 00 B9 26 40 00
C2 4F 40 00 EE 4E 40 00 AB 4C 40 00 08 4D 40 00 C3 39 40 00 BC 23 40 00 3A 24 40 00 60 4F 40 00
5B 4E 40 00 10 4E 40 00 78 4C 40 00 56 13 40 00 05 15 40 00 1D 15 40 00 B0 4F 40 00 1B 32 40 00
34 32 40 00 FC 32 40 00 53 33 40 00 C9 21 40 00 CE 4F 40 00 80 33 40 00 C8 4F 40 00 F5 34 40 00
05 35 40 00 70 35 40 00 7C 35 40 00 A0 35 40 00 79 1E 40 00 00

 

API地址放在406e50

BD 2F 81 7C F2 1E 80 7C 41 B7 80 7C F6 E8 D2 77 39 7C D2 77 BB 7A DA 77 BB 7A DA 77 E2 9D 68 7D
65 02 D3 77 95 14 82 7C 1E 62 83 7C 5D 63 83 7C E7 EA DA 77 56 BE 80 7C E7 EA DA 77 27 6C DA 77
C1 C1 33 76 56 BE 80 7C 7C B8 80 7C 7C B8 80 7C 56 BE 80 7C 7C B8 80 7C EA 07 D5 77 56 BE 80 7C
56 BE 80 7C 56 BE 80 7C 7C B8 80 7C 5D EE D3 77 F6 E8 D2 77 FE 2F 63 7D 10 7C 33 76 F2 F7 85 7C
D5 65 83 7C 17 8B 83 7C 17 8B 83 7C 77 EE 80 7C 63 25 32 76 94 4E 83 7C 9F 30 32 76 36 54 83 7C
36 54 83 7C FE 53 83 7C 94 4E 83 7C 56 BE 80 7C 5D EE D3 77

 这两个地址是互相对应的,于是再写一处代码来扫描这两个地址,把call  01ba0000这句代码改写成 call  [API](暂且不管是不是应该jmp  [API]),

二进制代码:【01BA0320到  --------01BA0354】

60 9C B8 50 6E 40 00 B9 80 01 BA 01 90 90 90 90 8B 18 83 FB 00 74 14 8B 39 66 C7 07 FF 15 83 C7
02 89 07 83 C1 04 83 C0 04 EB E5 90 9D 61 E9 79 0D 86 FE 90 90

 设置新的EIP,让它执行。。。。。。。。。。。。

01BA0320    60                 PUSHAD
01BA0321    9C                 PUSHFD
01BA0322    B8 506E4000        MOV EAX,406E50
01BA0327    B9 8001BA01        MOV ECX,1BA0180
01BA032C    90                 NOP
01BA032D    90                 NOP
01BA032E    90                 NOP
01BA032F    90                 NOP
01BA0330    8B18               MOV EBX,DWORD PTR DS:[EAX]               ; 循环开始处
01BA0332    83FB 00            CMP EBX,0
01BA0335    74 14              JE SHORT 01BA034B                        ; 等于0是处理完了
01BA0337    8B39               MOV EDI,DWORD PTR DS:[ECX]
01BA0339    66:C707 FF15       MOV WORD PTR DS:[EDI],15FF
01BA033E    83C7 02            ADD EDI,2
01BA0341    8907               MOV DWORD PTR DS:[EDI],EAX
01BA0343    83C1 04            ADD ECX,4
01BA0346    83C0 04            ADD EAX,4
01BA0349  ^ EB E5              JMP SHORT 01BA0330
01BA034B    90                 NOP
01BA034C    9D                 POPFD
01BA034D    61                 POPAD
01BA034E  - E9 790D86FE        JMP Notepad.004010CC                     ; 跳转到入口点
01BA0353    90                 NOP
01BA0354    90                 NOP

 

结果失望了,IMprotRec还是不能修复。。。。。。。

posted @ 2012-12-17 18:16  deeeeeed  阅读(163)  评论(0编辑  收藏  举报

pppppppppppppp