FFI中壳的特征码结构
今天心血来潮,想看下FFI是怎么判断一个EXE加的什么壳的,流程到底是怎样的呢?

很明显的一点就是FFI最后是要把结果显示出来的,所以我们可以尝试下段SetWindowText函数,然后看栈中的数据,如果有MD5 ASPack等字符出现的时候那么说明判断壳流程的那个函数就在附近,根据这点就能找到关键代码了。我这里的是00410830。
找到之后略微跟踪了下,不小心把特征码的结构给看出来了,无心插柳啊。跟踪的过程中在内存数据区发现了很多特征码的结构。现在就列出ASPack v2.12的特征码结构。
00D80970 02 00 00 00 8C 09 D8 00 A4 09 D8 00 AC 09 D8 00 ...?????? 00D80980 42 9C 00 00 00 00 00 00 BC 09 D8 00 01 00 00 00 B?.....??... 00D80990 1D 00 13 00 C8 B3 9A 43 43 00 00 00 02 00 13 00 ..瘸欳C..... 00D809A0 46 16 A7 E4 41 53 50 61 63 6B 00 00 41 53 50 61 FтASPack..ASPa 00D809B0 63 6B 20 76 32 2E 31 32 00 00 00 00 ck v2.12....
一步一步跟踪代码,然后看它取得是WORD数据,还是DWORD数据,取得是地址还是数据,然后就把结构给搞出来了。不知道我写的结构有没有错的地方,好长时间没写代码了。
typedef struct tagSigStruct
{
DWORD RVA //特征码偏移地址的变化后的一个值, 这个值经过一定运算才能得到特征码的偏移地址
WORD loopNum //计算特征码是一个循环体,这个变量决定了循环的次数。
WORD sth //这个没看出来,程序中貌似没用到过
DWORD sig //特征码 ,经过某种算法之后得到一个DWORD值,和这个值比较,相等则为某某壳,不等则不是
}SIGSTRUCT;
typedef struct tagPackerSig
{
char StaticString[0x14]={0x02,0x00} //每个壳的特征吗结构开始都是这样的
DWORD SigNum //共有几个特征吗
SIGSTRUCT *p=&a //指向a[SigNum],方便定位数据
char *m=SigString //指向签名串,它就是将来用SetWindowText中的text的来源
SIGSTRUCT a[SigNum];
char SigString[]={"ASPack 2.12-> Alexey Solodovnikov"};
} PackerSig;
其实FFI取特征码取得特征码是在程序入口点的前几个或者前几个字节,只要把入口点改了,它就认不出拉了。搞完这个,真心佩服那些协议分析的人啊。
浙公网安备 33010602011771号