通常我们所说的main或WinMain主函数,其实并不是入口函数,真正的入口函数是mainCRTStartup/wmainCRTStartup/WinMainCRTStartup或wWinMainCRTStartup,具体视编译选项而定。
一、了解VS2022的启动函数
1、新建一个控制台应用程序
2、断下来后查看堆栈信息
3、查看mainCRTStartup函数源代码,右击,选择转到源代码
extern "C" DWORD mainCRTStartup(LPVOID)
{
return __scrt_common_main();
}
4、继续转到__scrt_common_main函数
static __forceinline int __cdecl __scrt_common_main()
{
__security_init_cookie();//初始化焕春区溢出全局变量
return __scrt_common_main_seh();
}
5、继续转到__scrt_common_main_seh函数
static __declspec(noinline) int __cdecl __scrt_common_main_seh()
{
.....
.....
int const main_result = invoke_main();
......
......
}
6、查看invoke_main函数
static int __cdecl invoke_main()
{
return main(__argc, __argv, _get_initial_narrow_environment());
}
二、通过x64dbg找到入口函数
1、将编译好程序拖进x64dbg,停在程序入口处,但不是停在main函数
2、运行一下程序, 点击F9,来到了关键函数处
3、点击F7,进入mainCRTStartup函数
4、点击F7,进入__scrt_common_main函数
5、点击F8跳过第一个call,F7进入__scrt_common_main_seh函数
6、一直F8找到,这个invoke_main函数,F7进入
7、找到连续三个参数,这就是main函数
欢迎关注公众号:逆向有你
原文始发于微信公众号(web安全工具库):读书笔记 -- 查找程序正真的入口
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论