飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 2751|回复: 4

[C/C++] 下断后,API参数相对于EBP偏移,不同程序为何不同?

[复制链接]
  • TA的每日心情
    擦汗
    2016-2-28 18:22
  • 签到天数: 38 天

    [LV.5]常住居民I

    发表于 2015-2-27 10:02:05 | 显示全部楼层 |阅读模式
    我分别用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:}





    PYG19周年生日快乐!

    该用户从未签到

    发表于 2015-2-27 13:14:16 | 显示全部楼层
    栈顶是ESP 不是EBP ...
    PYG19周年生日快乐!
  • TA的每日心情
    擦汗
    2016-2-28 18:22
  • 签到天数: 38 天

    [LV.5]常住居民I

     楼主| 发表于 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 [ESP+0x18]
            push [ESP+0x14]
            push [ESP+0x10]
            push [ESP+0xC]
            push [ESP+0x8]
            push [ESP+0x4]
            call Mysendto         //  测试发现在我的Mysendto没有接收到真正的sendto参数 {:soso_e193:}








    PYG19周年生日快乐!
  • TA的每日心情
    开心
    4 小时前
  • 签到天数: 1071 天

    [LV.10]以坛为家III

    发表于 2015-2-28 00:07:32 | 显示全部楼层
    按理说EBP是栈底,应该不变才对

    栈底应该是参数,然后是返回地址,然后才是原ebp
    没看懂你想干什么
    PYG19周年生日快乐!
  • TA的每日心情
    擦汗
    2016-2-28 18:22
  • 签到天数: 38 天

    [LV.5]常住居民I

     楼主| 发表于 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
            mov  ebp, 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 [ESP+0x18]
            push [ESP+0x14]
            push [ESP+0x10]
            push [ESP+0xC]
            push [ESP+0x8]
            push [ESP+0x4]        // 我之前HOOK某一个API时用EBP来压栈是可以的,现在用ESP压栈,HOOK我的程序成功,
                                           // 注入QQ后老是获取不到传进来的参数,现在就卡在这里了。。。
            call Mysendto


            // 跳到原函数+5处执行
            mov eax, g_iOldsendtoAddr
            add eax, 5
            jmp eax
        }
    }


    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表