首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编写一个Trampoline函数

编写一个Trampoline函数
EN

Stack Overflow用户
提问于 2011-11-12 04:38:27
回答 1查看 1.9K关注 0票数 4

我已经成功地在内存中覆盖了函数的前几个字节,并将其绕开到我自己的函数。我现在在创建一个trampoline函数以将控制弹回真正的函数时遇到了问题。

这是我问题here的第二部分。

代码语言:javascript
复制
BYTE *buf = (BYTE*)VirtualAlloc(buf, 12, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
void (*ptr)(void) = (void (*)(void))buf;

vm_t* VM_Create( const char *module, intptr_t (*systemCalls)(intptr_t *), vmInterpret_t interpret )
{
    MessageBox(NULL, L"Oh Snap! VM_Create Hooked!", L"Success!", MB_OK);

    ptr();

    return NULL;//control should never get this far
}

void Hook_VM_Create(void)
{
    DWORD dwBackup;
    VirtualProtect((void*)0x00477C3E, 7, PAGE_EXECUTE_READWRITE, &dwBackup);

    //save the original bytes
    memset(buf, 0x90, sizeof(buf));
    memcpy(buf, (void*)0x00477C3E, 7);

    //finish populating the buffer with the jump instructions to the original functions
    BYTE *jmp2 = (BYTE*)malloc(5);
    int32_t offset2 = ((int32_t)0x00477C3E+7) - ((int32_t)&buf+12);
    memset((void*)jmp2, 0xE9, 1);
    memcpy((void*)(jmp2+1), &offset2, sizeof(offset2));
    memcpy((void*)(buf+7), jmp2, 5);

    VirtualProtect((void*)0x00477C3E, 7, PAGE_EXECUTE_READ, &dwBackup);
}

0x00477C3E是已被覆盖的函数的地址。在我覆盖它们之前,原始函数的asm被保存到buf。然后,将我的5字节jmp指令添加到buf中,以返回到原始函数的其余部分。

当调用ptr()时,问题就出现了,程序崩溃。当调试它崩溃的站点时,它看起来不像我的ptr()函数,但是仔细检查我的偏移量计算看起来是正确的。

注意:省略了多余的代码,以便更容易地阅读所有内容

编辑:这是ollydbg中的ptr()函数

代码语言:javascript
复制
0FFB0000   55               PUSH EBP
0FFB0001   57               PUSH EDI
0FFB0002   56               PUSH ESI
0FFB0003   53               PUSH EBX
0FFB0004   83EC 0C          SUB ESP,0C
0FFB0007  -E9 F1484EFD      JMP 0D4948FD

所以看起来好像我的偏移量计算是错误的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-12 05:38:10

所以你的buf[]最终包含2个东西:

原始instruction

  • jmp

  • 7第一个字节

然后你将控制权移交给buf。是否保证前7个字节只包含完整的指令?如果不是,您可能会在执行最后一条以这7个字节开始的不完整指令时或之后崩溃。

是否可以保证这7个字节中的指令不会进行任何EIP相关的计算(这包括主要具有EIP相关寻址的指令,如跳转和呼叫)?如果不是这样,在原函数中继续运行将不能正常工作,并且可能会导致程序崩溃。

原始函数是否带有任何参数?如果是这样,简单地执行ptr();将使原始代码与从寄存器和/或堆栈获取的垃圾一起工作(取决于调用约定),并可能崩溃。

编辑:还有一件事。使用buf+12而不是&buf+12。在你的代码中,buf是一个指针,而不是数组。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8099660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档