逆向学习
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
- 导出文件