调试笔记一

最近在看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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值