Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 在ASM中直接调用/跳转而不使用相关性(x86) 我将一个C++ DLL注入游戏中,我想把一个函数挂到我自己的代码中。由于DLL每次都映射到不同的位置,因此直接跳转和调用会更容易。另外,因为这是一个钩子,我不想在返回函数时更改堆栈或寄存器_Assembly_Dll_X86 - Fatal编程技术网

Assembly 在ASM中直接调用/跳转而不使用相关性(x86) 我将一个C++ DLL注入游戏中,我想把一个函数挂到我自己的代码中。由于DLL每次都映射到不同的位置,因此直接跳转和调用会更容易。另外,因为这是一个钩子,我不想在返回函数时更改堆栈或寄存器

Assembly 在ASM中直接调用/跳转而不使用相关性(x86) 我将一个C++ DLL注入游戏中,我想把一个函数挂到我自己的代码中。由于DLL每次都映射到不同的位置,因此直接跳转和调用会更容易。另外,因为这是一个钩子,我不想在返回函数时更改堆栈或寄存器,assembly,dll,x86,Assembly,Dll,X86,我声明一个char*来存储Asm,以便有一个指向它的指针。(char*Asm=“\x00”) 如果你能提供十六进制,那会节省我一些时间 我试着使用FF和EA进行呼叫和跳转,但我想我不明白它们是如何工作的。当我使用它们时,我注意到我现在在手术中有一个结肠 JMP FAR FWORD PTR DS:[00000000] 这不起作用,而且在我尝试使用指向跳转位置的指针后仍然不起作用 以下是我开始尝试不同方法之前使用的程序集: 01270000 50 PUSH EAX

我声明一个char*来存储Asm,以便有一个指向它的指针。(char*Asm=“\x00”) 如果你能提供十六进制,那会节省我一些时间

我试着使用FF和EA进行呼叫和跳转,但我想我不明白它们是如何工作的。当我使用它们时,我注意到我现在在手术中有一个结肠

JMP FAR FWORD PTR DS:[00000000]
这不起作用,而且在我尝试使用指向跳转位置的指针后仍然不起作用

以下是我开始尝试不同方法之前使用的程序集:

01270000    50              PUSH EAX
01270001    57              PUSH EDI
01270002    E8 E9CC1BFF     CALL fwound.0042CCF0
01270007    5F              POP EDI
01270008    58              POP EAX
01270009    50              PUSH EAX                      //replacements
0127000A    8D4C24 7C       LEA ECX,DWORD PTR SS:[ESP+7C] //
0127000E  - E9 36D11BFF     JMP fwound.0042D149
我使用Olly创建了该块,因此它知道当时需要的相关跳转/调用

在Asm进入内存后,我必须在函数中写入两个操作(被替换)以跳转到此位置

那么,如何修复Asm块以使用直接跳转和调用呢?

我从未尝试过这种方法,
但我认为您应该使用游戏已知内存位置的偏移量(使用ollydbg查找),因此每次将此(固定)偏移量添加到(变量)地址时。例如,该地址可以是在
ss:ebp
(因为游戏调用了您的函数)处找到的返回地址,其偏移量是在ollyDBG的帮助下计算的。

您可以这样编码(gcc风格/at&T汇编语法):

对于具有32位内存操作数的绝对jmp,这将汇编为10个字节(在32位x86上)
ff 25
,然后是四个字节,其中包含以下字的地址,然后是内容,这是代码的(绝对)目标地址

编辑:我用一个经过编译和测试的示例更新了下面的部分

您可以从C源代码动态创建这样一个蹦床。示例源代码(需要32位x86,留给读者作为如何将蹦床转换为64位的练习):

请注意,将整个MMU页面放在一边,只使用其中的十个字节,这有点低效。如果您需要多个蹦床,请为蹦床实现您自己的内存管理器

    jmp    *.Ltgtaddr
.Ltgtaddr:  .long absoluteAddrOfFunctionToCall
#include <sys/mman.h>
#include <stdio.h>

void oneWay(char *str, int arg)
{ printf("string is \"%s\", int is %d\n", str, arg); }

void otherWay(char *str, int arg)
{ printf(str, arg); printf("\n"); }

void *trampGen(void *tgtAddr)
{
    char *trampoline = mmap(NULL, 10, PROT_EXEC | PROT_WRITE | PROT_READ,
        MAP_PRIVATE | MAP_ANON, -1, 0);
    trampoline[0] = (char)0xff; trampoline[1] = (char)0x25;
    *(char**)(trampoline+2) = trampoline + 6;
    *(void**)(trampoline+6) = tgtAddr;
    return trampoline;
}

int main(int argc, char **argv)
{
    void * (*funcptr)(char*, int) = trampGen(oneWay);
    *funcptr("Test %d String", 12345);
    *(void **)(((char *)funcptr) + 6) = otherWay;
    *funcptr("Test %d String", 12345);
    munmap(funcptr, 10);
    return 0;
}
$ ./tt
string is "Test %d String", int is 12345
Test 12345 String