编译语言特点定位 OEP
各类语言编译的文件入口点都有自己的特点;
使用同一种编译器编译的程序,其入口代码都很类似,都有一段启动代码,编译器在编译程序时会自动与程序连接;
在完成必需的初始化工作后,调用 WinMain 函数,该函数执行完毕,启动代码将再次获得控制权,进行初始化清除工作;
使用工具
- OllyDbg 1.10原版,简称
OD
; OD
汉化
和插件
均来自互联网;- UnPackMe来自互联网,仅供学习使用;
- 加壳工具为UPX,感谢 🙏 开源;
- 文中特殊数字均是
HEX
,为了书写方便采用DEC
;
分析思路
将 CM 导入 OD,此时未加壳,EP 即是 OEP:
可以看到, 第 1 个调用的函数是
GetModuleHandleA
;使用 UPX 加密 CM,然后导入 OD:
在 EP 处使用
Ctrl + G
跳转至 GetModuleHandleA 函数的行首,然后设置 F2 断点;运行程序后,程序中断在断点位置,goto 到栈顶指针指向的位置,就到达了 OEP:
如果对常见语言的入口代码比较熟悉,就可以很容易的完成脱壳修复或定位 OEP 等工作,这就需要大量积累了;
由于采用默认的启动代码对软件进行加壳保护不是很有利,一些开发人员会对启动源代码进行修改,这时程序的入口点与默认的就完全不同了;