gpt4 book ai didi

c++ - 使用内联 ASM 获取字符串

转载 作者:行者123 更新时间:2023-11-28 07:56:37 24 4
gpt4 key购买 nike

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

__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. 你错过了“取消引用”:

    mov 版本,dword ptr [0x5F5200]

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

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

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

    printf("检测到的版本号:%s\n", 0x5F5200)

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

    printf("检测到修订 ID:%s\n", revision)

  2. 字符串格式

如果字符串是unicode,你会使用

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

(请注意,对于 wprintf,它是相反的方式:%s 表示宽字符串,%s 表示字符字符串)。

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

关于c++ - 使用内联 ASM 获取字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12568960/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com