Armboy2010 发表于 2015-2-27 10:02:05

下断后,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:}





Nisy 发表于 2015-2-27 13:14:16

栈顶是ESP 不是EBP ...

Armboy2010 发表于 2015-2-27 15:05:44

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:}








echo 发表于 2015-2-28 00:07:32

按理说EBP是栈底,应该不变才对
栈底应该是参数,然后是返回地址,然后才是原ebp
没看懂你想干什么

Armboy2010 发表于 2015-2-28 09:01:42

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]
查看完整版本: 下断后,API参数相对于EBP偏移,不同程序为何不同?