使用内联 ASM 获取字符串

Getting a string using inline ASM

本文关键字:获取 字符串 ASM      更新时间:2023-10-16

我正在做的是将DLL注入正在运行的进程。然后,我继续检查有关该过程的一些信息,例如版本等。我的问题是我似乎无法访问程序集文件中的字符串,其中包含我要仔细检查的修订号。这是我到目前为止所拥有的:

__declspec(naked) void CheckBuild()
{
    char* revision;
    __asm {
        sub esp, __LOCAL_SIZE
        pushad
        pushfd
        mov revision, dword ptr 0x5F5200
    }
    printf("Detected revision ID: %un", revision);
    __asm {
        popfd
        popad
        add esp, __LOCAL_SIZE
        retn
    }
}

对于这个训练的东西,我通过IDA获得的字符串的地址以及我使用CheatEngine和OllyDbg检查的字符串的地址是恒定的。

但是,无论我尝试什么,我总是以十进制返回0x5F5200,这绝对不是我所期望的。我几乎尝试了所有方法,包括 lea 和其他人,但我仍然没有得到有效的字符串。

谁能指出我正确的方向?

  1. 您缺少"取消引用":

    mov revision, dword ptr [0x5F5200]

这不是一个有效的指令,因为它有两个间接,所以

mov eax, dword ptr [0x5F5200]
mov revision, eax
  1. 如果值确实是字符串,则还有其他问题:

    • 如果字符串存储在0x5F5200,则只需使用

    printf("Detected revision ID: %sn", 0x5F5200)

    • 如果字符串的地址存储在 0x5F5200,则应使用

    printf("Detected revision ID: %sn", revision)

  2. 字符串格式

如果字符串是 unicode,则使用

printf("Detected revision ID: %Sn", revision);

(请注意,对于 wprintf,它是另一种方式 'round:%s 表示宽字符串,%s 表示字符字符串)。

最后,如果字符串不能保证以零结尾但具有固定长度,则需要从地址复制到本地缓冲区,并确保在打印前零终止。