使用内联ASM获取字符串

时间:2012-09-24 16:16:13

标签: c++ windows assembly hook inline-assembly

我正在做的是将DLL注入正在运行的进程中。然后我继续检查有关该过程的一些信息,例如版本等。我的问题是我似乎无法访问汇编文件中的字符串,其中包含我想要双重检查的修订号。以下是我到目前为止的情况:

__declspec(naked) void CheckBuild()
{
    char* revision;
    __asm {
        sub esp, __LOCAL_SIZE
        pushad
        pushfd

        mov revision, dword ptr 0x5F5200
    }

    printf("Detected revision ID: %u\n", revision);

    __asm {
        popfd
        popad
        add esp, __LOCAL_SIZE
        retn
    }
}

对于这个训练内容,我通过IDA获得的字符串的地址以及我使用CheatEngine和OllyDbg检查的字符串的地址是不变的。

然而,无论我尝试什么,我总是以小数形式返回0x5F5200,这绝对不是我所期望的。我几乎尝试了一切,包括lea和其他,但我仍然没有得到有效的字符串。

有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

  1. 你错过了“解除引用”:

    mov revision, dword ptr [0x5F5200]

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

    mov eax, dword ptr [0x5F5200]
    mov revision, eax
    
    1. 如果值确实是一个字符串,那么还有其他错误:

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

      printf("Detected revision ID: %s\n", 0x5F5200)

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

      printf("Detected revision ID: %s\n", revision)

    2. 字符串格式

    3. 如果字符串是unicode,则使用

      printf("Detected revision ID: %S\n", revision);
      

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

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