下断后,API参数相对于EBP偏移,不同程序为何不同?
我分别用WIN32控制台程序和MFC对话框程序,测试调用sendto,编译后载入OD对其进行下断,
然后在堆栈中选择对应的参数,右键相对于EBP的偏移,
发现我写的这两个程序,sendto断下后,参数相对于EBP的偏移竟然不同{:soso_e194:},
我一开始以为是相同的,验证后竟然不同,百思不得其解,
望知道的盆友能告知一二。。。{:soso_e103:}
// 控制台程序
/* EBP-5C > 00E41012/CALL 到 sendto 来自 LogTest.00E4100C
EBP-58 > 00000001|Socket = 1
EBP-54 > 00000000|Data = NULL
EBP-50 > 0000000A|DataSize = A (10.)
EBP-4C > 0000000B|Flags = MSG_OOB|MSG_PEEK|8
EBP-48 > 00000000|pTo = NULL
EBP-44 > 00000016\ToLength = 16 (22.)*/
// MFC对话框程序
/*EBP-28 > 01291E72/CALL 到 sendto 来自 Client.01291E6C
EBP-24 > 00000001|Socket = 1
EBP-20 > 00000000|Data = NULL
EBP-1C > 0000000B|DataSize = B (11.)
EBP-18 > 00000016|Flags = MSG_PEEK|MSG_DONTROUTE|MSG_INTERRUPT
EBP-14 > 00000000|pTo = NULL
EBP-10 > 00000021\ToLength = 21 (33.)*/
{:soso_e103:}
栈顶是ESP 不是EBP ... Nisy 发表于 2015-2-27 13:14
栈顶是ESP 不是EBP ...
嗯,使用ESP确实是一样了,按理说EBP是栈底,应该不变才对{:soso_e153:}
ESP ==>> 01001012/CALL 到 sendto 来自 LogTest.0100100C
ESP+4 > 00000001|Socket = 0x1
ESP+8 > 00000000|Data = NULL
ESP+C > 0000000A|DataSize = A (10.)
ESP+10 > 0000000B|Flags = MSG_OOB|MSG_PEEK|8
ESP+14 > 00000000|pTo = NULL
ESP+18 > 00000016\ToLength = 16 (22.)
ESP ==>> 00F51E72/CALL 到 sendto 来自 Client.00F51E6C
ESP+4 > 00000001|Socket = 0x1
ESP+8 > 00000000|Data = NULL
ESP+C > 0000000B|DataSize = B (11.)
ESP+10 > 00000016|Flags = MSG_PEEK|MSG_DONTROUTE|MSG_INTERRUPT
ESP+14 > 00000000|pTo = NULL
ESP+18 > 00000021\ToLength = 21 (33.)
我这样做的目的,其实是想实现以下功能{:soso_e103:}
push
push
push
push
push
push
call Mysendto //测试发现在我的Mysendto没有接收到真正的sendto参数 {:soso_e193:}
按理说EBP是栈底,应该不变才对
栈底应该是参数,然后是返回地址,然后才是原ebp
没看懂你想干什么 echo 发表于 2015-2-28 00:07
栈底应该是参数,然后是返回地址,然后才是原ebp
没看懂你想干什么
嗯,我贴下代码吧,容易懂点,其实我就是为了实现稳定的HOOK(不恢复被HOOK的代码){:soso_e103:}
// HOOK sendto跳到这里
__declspec(naked) void MysendtoProxy(void)
{
__asm
{
// 先执行原来的代码
mov edi, edi
push ebp
movebp, esp
// 执行我们的过滤函数
/*ESP ==>> 01291E72/CALL 到 sendto 来自 Client.01291E6C
ESP+4 > 00000001|Socket = 1
ESP+8 > 00000000|Data = NULL
ESP+C > 0000000B|DataSize = B (11.)
ESP+10 > 00000016|Flags = MSG_PEEK|MSG_DONTROUTE|MSG_INTERRUPT
ESP+14 > 00000000|pTo = NULL
ESP+18 > 00000021\ToLength = 21 (33.)*/
push
push
push
push
push
push // 我之前HOOK某一个API时用EBP来压栈是可以的,现在用ESP压栈,HOOK我的程序成功,
// 注入QQ后老是获取不到传进来的参数,现在就卡在这里了。。。
call Mysendto
// 跳到原函数+5处执行
mov eax, g_iOldsendtoAddr
add eax, 5
jmp eax
}
}
页:
[1]