编译语言特点定位 OEP

各类语言编译的文件入口点都有自己的特点;

使用同一种编译器编译的程序,其入口代码都很类似,都有一段启动代码,编译器在编译程序时会自动与程序连接;

在完成必需的初始化工作后,调用 WinMain 函数,该函数执行完毕,启动代码将再次获得控制权,进行初始化清除工作;

使用工具

  • OllyDbg 1.10原版,简称OD
  • OD 汉化插件均来自互联网;
  • UnPackMe来自互联网,仅供学习使用;
  • 加壳工具为UPX,感谢 🙏 开源;
  • 文中特殊数字均是HEX,为了书写方便采用DEC

分析思路

  1. 将 CM 导入 OD,此时未加壳,EP 即是 OEP:

    EP 即是 OEP

    可以看到, 第 1 个调用的函数是GetModuleHandleA

  2. 使用 UPX 加密 CM,然后导入 OD:

    使用 UPX 加密 CM

    在 EP 处使用Ctrl + G跳转至 GetModuleHandleA 函数的行首,然后设置 F2 断点;

  3. 运行程序后,程序中断在断点位置,goto 到栈顶指针指向的位置,就到达了 OEP:

    到达了 OEP

  4. 如果对常见语言的入口代码比较熟悉,就可以很容易的完成脱壳修复或定位 OEP 等工作,这就需要大量积累了;

  5. 由于采用默认的启动代码对软件进行加壳保护不是很有利,一些开发人员会对启动源代码进行修改,这时程序的入口点与默认的就完全不同了;