简介
一个程序编译出来之后是没有壳的状态。不同编译器编译出的无壳程序是不同的,先认识不同编译器编译出来的无壳程序,再研究加壳程序会很容易。
ollydbg
窗口
- 反汇编窗口
- 寄存器窗口
- 数据窗口
- 堆栈窗口
功能
- l:程序运行和插件加载的日志
- e: 模块加载信息
- m:内存信息
- t:线程信息
- w:窗口
- h:句柄
ExeInfoPE
使用
把软件拖进ExeInfoPE,诊断信息会显示使用的编译器及有没有加壳。
区段
点击EP Section右侧的…会显示区段信息(OD的m也可以看)
无壳程序
程序编译之后是无壳的,没有压缩过,内部是可以修改的,可以进行diy。
VC 6.0
- 入口点代码是固定的
- 入口API也是相同的
- 区段有四个:.text, .data, .rdata, .rsrc
唯一不同的可能是push的地址是不同的
VS 2008/2013
- 特征只有两个:call, jmp
- 区段有五个:.text, .rdata, .data, .rsrc, .reloc(重定位区段)
易语言
非独立编译
- 入口特征和模块特征都有krnln.fnr
独立编译
- 搜索字符串,检查常规的易语言自带的字符串
- 进call里看一下有没有调用一堆核心库jmp
Delphi
- 区段有CODE, DATA, BSS, .idata, tls, .rdata, .reloc, rsrc
BC++
- BC++的入口是一个很大的jmp
- 区段有很多.text, .data, .tls, .rdata, .idata, .didata, .edata, rsrc, reloc
.NET
- .NET程序拖到OD里可能就直接运行了,一方面可能是有tls,默认勾选了break on tls
- .NET程序需要用特定的插件断点分析
- .NET用OD查看模块可以看到调用了.NET的库
PB/QT
- 用OD查看模块就可以看到相应的库
有壳程序
查壳软件
- PEiD已经停止更新了,各种特征库已经不能用了
- ExeinfoPE还在更新
aspack
- 入口是pushad,call,jump
upx
- 点区段信息,一般只有三个区段,区段名可以随便改
Themida
- 区段信息,第一个是空的,.rsrc, .idata,还有两个任意名称的区段
VMP
- 区段信息,保留代码段和数据段,添加了三个段
- 前面一大段跳转,入口pushad,后边跳向oep(程序入口点)
Shielden
- 区段名称有sedata,但名称可以改
- Ctrl+A分析代码,F7单步步入几次,就可以看到字符串ascii“Safengine Shield”