所以我有一个函数我想改变程序中的参数。我已经反汇编它,看看这个函数采用了什么参数,并且我已成功写入该参数(其中有一个指针)。我写入内存的指针会覆盖已存在的指针,它应该指向一个预先初始化的字符数组,但是当我更仔细地检查内存时,它实际指向一些随机的NOP。
这是我的C ++ LD_PRELOAD补丁:
#include <unistd.h>
#include <stdio.h>
#include "hook.h"
char kick_patch[] = "Kicked";
const char* pkick_patch = kick_patch;
void new_SV_trigger()
{
unsigned long kick_patch_p = 0x084632A9;
printf("Kick patch string address: %X\n", &kick_patch);
memcpy( (void*) kick_patch_p, &pkick_patch, 4);
}
void __attribute__((constructor)) init (void)
{
Hook h_SV_trigger( (void*) 0x081641D1, 5, (void*) new_SV_trigger );
}
正如您所看到的那样,当kick_patch
被触发时,我正在编写0x084632A9
的指针以解决new_SV_trigger
的问题,但效果很好(还不清楚为什么memcpy不会让我通过{{1}在第二个参数中,它总是将char数组的内容复制到内存中,而不是指向索引0的实际指针,无论如何)。
这里的问题是,当我检查内存地址&kick_patch_p
一切正常时,它已经写了0x084632A9
的第一个索引的指针,这是我需要的但当我检查内存地址时kick_patch
它都是NOP / 0x00。
我不知道那里发生了什么。