基于使用visual studio编译程序进行分析,其他编译环境类似

  • 影响入口点位置的因素
    • 编译器&编译器版本
    • Debug和Release
    • x86和x64编译
  • 常用方法(存在不确定性)
    1. 三个参数
      push
      push
      push
      call xxxx
      add ;平栈
      
      ;例外:fastcall
      ;fastcall rcx,rdx,r8
      
    2. 字符串、函数API
    3. 同一版本的编译器

  1. 创建相同环境
  2. 用此环境写个有符号的demo查找主函数
    • C+VS2003-VS2022 规则

      #include <stdio.h>
      #include <stdlib.h>
      
      int main()
      {
      	printf("Hello,World!");
      	system("pause");
      	return 0;
      }
      
      • 大体结构(x86 Debug)
        1. jmp _mainCRTStartup 或者 start 或者 entry
        2. _mainCRTStartup call(mainCRTStartup VS编译的真正入口点)
        3. 第二个call
        4. 找符合类似条件的代码 add movzx test jz mov mov push call add call (main函数)
        5. 倒数第一个call
        6. jmp _main
        7. _main
      • 大体结构(x86 release)
        1. _mainCRTStartup
        2. 第二个call/jmp
          1. _scrt_common_main*****
        3. 找符合类似条件的代码
          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
          
        4. _main
      • 大体结构(x64 Debug)
        1. jmp _mainCRTStartup
        2. _mainCRTStartup call(mainCRTStartup VS编译的真正入口点)
        3. 第二个call
        4. 找符合类似条件的代码 movzx test je mov mov call call (main函数)
        5. 倒数第一个call
        6. jmp _main
        7. _main
      • 大体结构(x64 release)
        1. _mainCRTStartup
        2. _mainCRTStartup call(mainCRTStartup VS编译的真正入口点)
        3. 第二个call/jmp
          1. _scrt_common_main*****
        4. 找符合类似条件的代码
          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
          
        5. main