处理ASProtect的Advanced Import Protect的一些想法和过程(3)
2012-12-17 18:16
274 查看
目标:找到哪些地址有 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还是不能修复。。。。。。。
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还是不能修复。。。。。。。
相关文章推荐
- 处理ASProtect的Advanced Import Protect的一些想法和过程(2)
- 处理ASProtect的Advanced Import Protect的一些想法和过程(2)
- 处理ASProtect的Advanced Import Protect的一些想法和过程(3)
- 处理ASProtect的Advanced Import Protect的一些想法和过程(1)
- 处理ASProtect的Advanced Import Protect的一些想法和过程(1)
- libsvm 安装过程中的一些错误和处理方式
- ES6 import 引用文件夹/目录及其处理过程
- 用LiveUSB制作U盘系统的过程及一些想法
- 对Advanced Import Protection的一些想法
- 错误处理的一些想法
- 对开发过程中文档的一些想法
- MySQL存储过程中一些基本的异常处理教程
- setupdll在CAB安装过程中的一些处理方法
- Ubuntu12.04编译openwrt过程中遇到的一些问题及处理方法
- 关于大批量数据处理的一些简单想法
- 对Advanced Import Protection的一些想法
- setupdll在CAB安装过程中的一些处理方法
- PyCharm使用过程中import一些库的问题
- 关于在Mysql服务启动的一些现象及问题和处理过程
- 软件过程改进的一些想法