逆向学习
2025年5月6日大约 2 分钟
基于吾爱的教程
无壳程序
VC6编译
直接点选运行,停止的位置就是入口点(用户代码)
PEID界面
入口点(Entrypoint)
- 地址:
00001700 - 所属节区:
.text- 意义:程序启动时从
.text节的RVA 00001700处开始执行代码。 - 调试提示:在 OllyDbg 中,入口点通常对应
基址 + 00001700(例如基址00400000→ 入口点00401700)。
- 意义:程序启动时从
文件偏移(File Offset)
- 值:
00001700- 作用:入口点代码在 文件中的物理位置(需与内存偏移区分)。
- 转换公式:
- 内存地址 = 基址(默认
00400000) + RVA(00001700)=00401700。 - 文件地址 = 文件偏移(
00001700),可直接用十六进制编辑器查看。
- 内存地址 = 基址(默认
首字节(First Bytes)
- 值:
55,8B,EC,6A- 对应汇编指令:
55 PUSH EBP ; 保存栈帧基址 8B EC MOV EBP, ESP ; 设置新栈帧 6A ... PUSH ... ; 压入参数(后续字节决定具体值) - 分析:这是典型的函数入口代码(如
WinMain或main),说明程序未加密或已脱壳。
- 对应汇编指令:
链接器信息
- 编译器:
Microsoft Visual C++ 6.0 - 子系统:
Win32 GUI- 意义:程序是使用 VC6 开发的图形界面应用,入口函数为
WinMain(而非控制台的main)。
- 意义:程序是使用 VC6 开发的图形界面应用,入口函数为
VS编译
特征:
call然后接jmp
call中可以看到许多的call系统api调用
间接调用:
系统 API 通过 导入表(IAT) 调用,地址以 dword ptr ds:[<API名称>]
PEid视图
VS特点:入口点只有两行代码,一个CALL后直接JMP,第一个CALL进去后调用的API也是相同的;区段相对于VC6多了一个.reloc重定位区段。
脱壳
压缩壳
- 寻找特征代码
- 寻找程序入口点
- 恢复IAT
- 导出文件