代码特征:
VC6:
首先利用ExeinfoPE查壳
Microsoft Visual C++ ver 5.0/6.0
轻易得到其为VC6编写的代码,再点击区段查看,可以看到如下特征
.text #代码段
.rdata #只读数据段
.data #数据段
.rsrc #资源段
再将程序拖入OD后有如下入口特征
push #若干个压栈
call dword ptr ds:[<&MSVCRT.__set_app_type>]
call dword ptr ds:[<&MSVCRT.__p__fmode>]
call dword ptr ds:[<&MSVCRT.__p__commode>]
先有几个压栈,然后调用了几个API(固定),同时可以点击m,看到区段特征。
VS2008:
VS2013与VS2008相似,但入口代码先为call,后为jmp,敲击enter进入call后会发现调用了如下几个特定的API
call dword ptr ds:[<&KERNEL32.GetSystemTimeAsFileT>]
call dword ptr ds:[<&KERNEL32.GetCurrentProcessId>]
call dword ptr ds:[<&KERNEL32.GetCurrentThreadId>]
call dword ptr ds:[<&KERNEL32.GetTickCount>]
call dword ptr ds:[<&KERNEL32.QueryPerformanceCounter>]
在ExeinfoPE中查看可以查到为VS2008编写,对比VC,VS2008的区段特征多了一个.reloc,用于重定位
易语言:
非独立编译:会带有运行库,在ExeinfoPE中,无法识别非独立编译的易语言。
进入ODL后,有明显的特征
ascii "GetNewSock",0
ascii "Error",0
ascii "krnln.fne",0
ascii "Not found the ke"
ascii "rnel library or "
ascii "the kernel libra"
ascii "ry is invalid!",0
ascii "krnln.fnr",0
ascii "Path",0
ascii "Software\FlySky\"
ascii "E\Install",0
同时会加载运行库
call <jmp.&KERNEL32.lstrcatA>
call <jmp.&KERNEL32.LoadLibraryA>
按F9运行后点e可以看到加载了运行库。
独立编译:在ExeinfoPE中被识别为VC,因其用VC的连接器编译,入口特征、区段特征与VC6一致。区别在于进入一些call后会跳转到核心库中(压栈后)
Delphi:
在ExeinfoPE中能被识别,区段特征如下
CODE
DATA
BSS
.idata
.tls
.rdata
.reloc
.rsrc
在第一个call中会有如下语句调用API
call <jmp.&kernel32.GetModuleHandleA>
BC++:
在ExeinfoPE中能被识别,在ODL中按Ctrl+A分析代码可以看到非常大的跳转,也有
call <jmp.&kernel32.GetModuleHandleA>
区段特征如下:
.text
.data
.tls
.rdata
.edata
.rsrc
.reloc
AMS:
汇编写的文件特别小,也是调用了
call <jmp.&kernel32.GetModuleHandleA>
.Net:
拖进ODL后会自动运行,点击e后会发现一堆.net的运行库
AutoIT v3:
进入ODL后特征搜索会很容易发现AutoIT v3的字样,可以直接被反编译
PB、QT5:
通过模块窗口可以看到库。
加壳:
aspack:入口为pushad、call、jmp,查看区段可以发现对比为加壳的区段特征,多了.aspack(名称可变)、.adata
UPX:开头为pushad,区段信息中可以看到
UPX0
UPX1
.rsrc
名称可变,特征不变
Themida:主要看区段特征,第一个为空白,然后接.rsrc、.idata、随机生成1、随机生成2
VMP:入口特征乱序,通过区段特征区分,
.text
.rdata
.data
.vmp0
.tls
.vmp1
.reloc
.rsrc
其中保留了源区段,但其中插入了vmp0、tls、vmp1
Shielden:ExeinfoPE无法识别,进入ODL后Ctrl+A分析,连续跳转后可以看到Se的加壳,且区段只有四个