最近在看windows调试,里面讲了一个样例,怎么在windbg中获取CreateProcess参数,我于是照着葫芦画瓢想截取RaiseException的参数,于是我写了一下代码片段
int _tmain(int argc, _TCHAR* argv[])
{
throw 1;
return 0;
}
编译器在编译throw 1语句时会转换为对RaiseException的调用。用windbg是载入程序,设置断点,继续执行
bp kernel32!RaiseException
g
ok,执行的断点处,用命令k查看当前调用栈信息
.....
执行.frame n(RaiseException的栈帧序号) ---不必要,但是要查看有private symbol的模块函数的局部变量还是有用的。
2. 执行dd RaiseException的Child-EBP地址,后面紧挨着返回地址,然后是函数参数。
最近看x64调试,有一些心得
1.虽然函数的前四个参数通过寄存器传递,但是 函数调用者依然会为这四个参数分配栈空间,但是被调用者是否在栈上填充这4个参数不确定,取决于编译器、是否还调用其它函数、优化等。
2. windbg中查看堆栈式显示ChildEBP值为进入函数后RSP为子程序参数分配栈空间后的值。
2.本来想通过栈查看CreateProcess崩溃时(设置启动程序参数为只读字符串),查看一下其参数(启动程序路径),但是很难,程序崩在了函数 kernel32.dll!IsThreadAFiber() ,查看CreateProcess的ChildEBP,而后反汇编CreateProcess函数,发现其前四个参数并未保存在栈中,而依然是寄存器。
http://www.osronline.com/showthread.cfm?link=230224
http://www.osronline.com/showthread.cfm?link=105188