基于使用visual studio编译程序进行分析,其他编译环境类似
- 影响入口点位置的因素
- 编译器&编译器版本
- Debug和Release
- x86和x64编译
- 常用方法(存在不确定性)
- 三个参数
push push push call xxxx add ;平栈 ;例外:fastcall ;fastcall rcx,rdx,r8
- 字符串、函数API
- 同一版本的编译器
- 三个参数
- 创建相同环境
- 用此环境写个有符号的demo查找主函数
-
C+VS2003-VS2022 规则
#include <stdio.h> #include <stdlib.h> int main() { printf("Hello,World!"); system("pause"); return 0; }
- 大体结构(x86 Debug)
- jmp _mainCRTStartup 或者 start 或者 entry
- _mainCRTStartup call(mainCRTStartup VS编译的真正入口点)
- 第二个call
- 找符合类似条件的代码 add movzx test jz mov mov push call add call (main函数)
- 倒数第一个call
- jmp _main
- _main
- 大体结构(x86 release)
- _mainCRTStartup
- 第二个call/jmp
- _scrt_common_main*****
- 找符合类似条件的代码
test al, al jz push dword ptr [esi] call __register_thread_local_exe_atexit_callback ; Callback pop ecx call __get_initial_narrow_environment mov edi, eax call ___p___argv mov esi, [eax] call ___p___argc push edi ; envp push esi ; argv push dword ptr [eax] ; argc call _main
- _main
- 大体结构(x64 Debug)
- jmp _mainCRTStartup
- _mainCRTStartup call(mainCRTStartup VS编译的真正入口点)
- 第二个call
- 找符合类似条件的代码 movzx test je mov mov call call (main函数)
- 倒数第一个call
- jmp _main
- _main
- 大体结构(x64 release)
- _mainCRTStartup
- _mainCRTStartup call(mainCRTStartup VS编译的真正入口点)
- 第二个call/jmp
- _scrt_common_main*****
- 找符合类似条件的代码
test al, al jz mov rcx, [rbx] call _register_thread_local_exe_atexit_callback_0 call _get_initial_narrow_environment_0 mov rdi, rax call __p___argv_0 mov rbx, [rax] call __p___argc_0 mov r8, rdi ; envp mov rdx, rbx ; argv mov ecx, [rax] ; argc call main
- main
- 大体结构(x86 Debug)
-