1.写个简单的main函数
···
#include<iostream>
using namespace std;
int main() {
int a = 0;
int b = 1;
int c = 2;
double d = 2.2;
printf("hahaha");
return 0;
}
···
下断到return 0
2.运行到断点
3.反汇编运行到ret指令
4.单步走进去 旁边就多了个文件
5.点击文件
发现不管是main还是winmain 都是 invoke_main() 调用的
···
static int __cdecl invoke_main() throw()
{
return main(argc, argv, _get_initial_narrow_environment());
}
static int __cdecl invoke_main() throw()
{
return wWinMain(
reinterpret_cast<HINSTANCE>(&__ImageBase),
nullptr,
_get_wide_winmain_command_line(),
__scrt_get_show_window_mode());
}
···
///////////////////////////通过ida查找///////////////////////////////
左边是win版 6.8 右边mac版7.0 发现7.0直接定位到main 这里从win版找
1.第一步鼠标点到strat-0空格查看
2.点到call 函数 sub_4118d0 空格进入(下面都说成点击进入call)
3.点击call进入
4.这里就有俩个call 要想找到main函数 都是一层层找 找关键点有3个push的
第一个进去看下肯定不是都系统调用 (中间会有个跳转表 后面的都有)
- 只有第二个call进去发现call更多 那没办法一个个找(先只找一层)
6.我找过就直接定位到了:(特征码上面一般是 add esp 4)
7.进去
8.我怎么就知道是三个push呢 先一个个call看 看他有没有参数 没有参数就说明push的参数不是给他的
9.这里进都不要进去就知道call只是一个跳转是一个参数 因些call sub_411276就是main函数
10.进入main函数
11.可以看出就是main他有三个参数
invoke_main()函数调用他 对应函数
12.继续走
13.查看上一层( __scrt_common_main_seh())
对应反汇编
14.继续上一层( __scrt_common_main())
对应汇编 (刚好有俩个call)
15.继续上一层 (mainCRTStartup())
对应反汇编 就是 start
在ida中按x看谁调用我也就是上一层发现报错 也就是没了
16.在vs中怎么那个快就知道上一层是谁呢 查看调用堆栈
转载于:https://blog.51cto.com/haidragon/2116951