钩函数调用linux mint

时间:2015-03-16 20:37:34

标签: c++ linux hook code-injection mprotect

前几天我通过修补单个调用指令写了一个简单的钩子/绕行。 它适用于Ubuntu 12.xyz(32位),现在我更新到Linux Mint 17.1(32位),我得到了分段错误。

我有两个项目

  • 调用名为goodGuy
  • 的函数的目标项目
  • 由dlopen()加载的库项目,它覆盖了目标应用程序中调用指令的偏移量

在覆盖调用指令偏移量之前,我通过以下方式修改页面保护:

mprotect(pageOf(address),pagesize,PROT_WRITE|PROT_EXEC|PROT_READ)

这很好用(返回0)。

当我调试我的程序时,它在尝试写入调用地址时崩溃:

memcpy((void*)(address + 1),(void*)&callOffset,4);

看起来我不允许覆盖说明,但为什么?

我在ALSR上使用了{+ 1}}并使用了g ++。

您知道如何允许我的应用程序编写指令吗?

谢谢你,Alex

修改

对不起伙计们,这是代码:

目标申请:

-z execstack -fno-stack-protector

和共享的lib代码:

#include <dlfcn.h>
#include <stdio.h>
#include <stdio.h>
#include <iostream>

void goodGuy();
//full lib path !
char libPath[] = "INSER_YOUR_PATH_HERE/lib.so";

int main(){
  dlopen(libPath,RTLD_NOW);
  goodGuy();
  return 0;
}

void goodGuy(){
    printf("good guy :)\n");
}

要查找addressOfCall使用gdb #include <stdio.h> #include <cstring> #include <stdint.h> #include <sys/mman.h> #include <unistd.h> void badGuy(); int pagesize = sysconf(_SC_PAGESIZE); void *pageOf(void* p){ return (void*)((unsigned int)p & ~(pagesize - 1)); } extern "C" void __attribute__ ((constructor)) DllLoad(void){ uint32_t addressOfCall = 0x0804862a; //Address where goodGuy is called in target app uint32_t addressOfNextInstruction = addressOfCall + 5; uint32_t callOffset = (uint32_t)badGuy - addressOfNextInstruction; mprotect(pageOf((void*)(addressOfCall + 1)),pagesize, PROT_WRITE|PROT_EXEC|PROT_READ); memcpy((void*)(addressOfCall + 1),(void*)&callOffset,4); } void badGuy(){ printf("bad guy :(\n"); } 打开目标应用程序并按gdb target显示主要功能,并查看disas main

+29

0 个答案:

没有答案