首先函数调用的过程,都是先把函数要用的参数压入栈中,然后进行call操作,然后函数执行完后,刚才压入栈中的数据全部出栈,栈顶指针回到调用函数前的状态。可见API函数是根据栈中的数据进行调用的
然后是GetModuleHandle函数,
见https://blog.csdn.net/zhaodaozhang/article/details/32714969
这里的参数正好是0,返回值是00400000,存放在EAX里面,
首先返回值都存放在EAX里面这是可以理解的,但是为什么是00400000,ctrl+G跟随后发现00400000是其他不相干的数据,为什么
这是因为使用该函数获得的是程序的“基址”,从基址到真正代码的部分是文件头
在文件头部分可以在0040003C找到真正的PE signature与基址间的偏移
可以得到真正的PE signature部分,在这一部分中找到AddressOfEntryPoint,即代码开始部分与基址间的偏移原始值位1000,可以通过在内存单元里修改变成1024跳过开始的NAG部分(PE结构)
也可通过将关键修改成jmp nop等
也可以将MessageBox的OwnerHandle参数改变
调用函数前
调用函数后
然后程序主对话框的显示模块是在程序下面的,地址是00401052
跟踪其进入后,更验证了ShowWindow和UpdateWindow的不同
执行到ShowWindow函数时,程序只显示一个白色的对话框,执行到UpdateWindow时才显示文本,这是因为其发送了WM_PAINT消息
但是无法理解ExitProcess函数,它的参数是退出代码,但是调用它之后栈顶指针从0019FF70变成了00E9FE7C 不知道为什么,同时也程序也跑到了77B62C7C、
这个函数的原理是什么?
调用函数前
调用函数后