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

从1中知道,ASProtect把CALL  [***]和JMP  [***]变成CALL   &&&&&,在内存中调用API后加到CODE段中CALL  &&&&的下一句还是其他地方呢?

在call入12000000内后会两次调用VirtualAlloc得到两个内存,第一个记为00dd0000,第二个为00cc0000;大小都为1000.

考虑以下情况:

00401000   call  402008

.........

00402008   call 01200000这是进入到内存中了,在内存中会把这句修改为call   00cc0004,再回到本句执行call   00cc0004,再从00cc0004进入到00DD0000,也就是从00dd0000中进入系统API,那从系统API加到后是到0040200d呢还是401005呢?一定是401005啊!!!那系统怎么会知道回到401005而不是40200d呢?其实系统只知道根据堆栈顶的那个值返回,堆栈顶指向哪,它就回到哪。。。

在进入00cc0000时栈顶有两个值,[esp]=40200d    [esp+4]=401005,正如我所想,在00cc0000中有一个进入系统前的预处理,有这一句 LEA    ESP,[ESP+4] ,机器码是

8D 64 24 04      ,当然也有可能在其它程序中是add  esp,4  (机器码是83 C4 04) 还有可能是其它形式,总之效果是一样的,在进入系统时[esp]=401005就行了。

再看一种情况:

原来的call  [***]直接变成 call  01200000

call  [***]占据6个字节,但是call  01200000只占据5个字节,从系统返回到CODE段时要返回到没有加壳前返回的地方,也要有个预处理,执行行这样一句:INC    [esp]

或者等效的表达,机器吗是FF 04 24

 

为什么会在00cc0000中写入这个指令呢?现在就是找某个判定,判定成立,就写,不成立就不写;或者本来壳程序已经记录好了,call  12000000在CODE中的位置越靠后,在内存中填充第二个内存的数据越在后,或者是其他位置关系。。。。

下面是我找的思路:

1、从call 01200000进入1200000中,找到API地址后会两次调用VirtualAlloc,第 一次得到00DD0000,在里面写入抽取的系统API部分代码;第二次调用VirtualAlloc得到00CC0000,在里面写入预处理代码;

2、对VirtualAlloc下断点  bp,得到内存后00DD0000和00CC0000,在内存下写入断点,就会找到在

00AC2685    F3:A5           REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]这句向00CC0000中写入了8D 64 24 04 ,根据ESI的值找到机器码在内存中B425F6处,

 

 

 

 

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

pppppppppppppp