使用内联 ASM 获取字符串
Getting a string using inline ASM
我正在做的是将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 和其他人,但我仍然没有得到有效的字符串。
谁能指出我正确的方向?
-
您缺少"取消引用":
mov revision, dword ptr [0x5F5200]
这不是一个有效的指令,因为它有两个间接,所以
mov eax, dword ptr [0x5F5200]
mov revision, eax
如果值确实是字符串,则还有其他问题:
- 如果字符串存储在0x5F5200,则只需使用
printf("Detected revision ID: %sn", 0x5F5200)
- 如果字符串的地址存储在 0x5F5200,则应使用
printf("Detected revision ID: %sn", revision)
字符串格式
如果字符串是 unicode,则使用
printf("Detected revision ID: %Sn", revision);
(请注意,对于 wprintf,它是另一种方式 'round:%s 表示宽字符串,%s 表示字符字符串)。
最后,如果字符串不能保证以零结尾但具有固定长度,则需要从地址复制到本地缓冲区,并确保在打印前零终止。
相关文章:
- 获取字符串的长度并将其分配给数组
- 调用CreateProcess()并获取字符串的返回值
- 你如何从 Boost Spirit X3 词法解析器中获取字符串?
- 使用 ReadProcessMemory 获取字符串值的访问冲突
- 如何从输入中获取字符串向量?
- 如何获取字符串输入n次?
- property_tree获取字符串形式的数组值
- 使用 ctypes 和 wchar_t 时如何从 C++ 获取字符串到 python?
- 获取字符串大小的各种方法之间的比较
- 方法获取字符串
- 在getline()之后获取字符串
- 为什么我的拆卸C 代码使用指令指针和偏移来获取字符串文字
- 无法使用 Poco 获取字符串的路径
- 如何在qtablewidget中获取字符串的行号
- 如何获取字符串和字节进行比较
- 恒定字符阵列的获取字符串长度函数(strlen)不是恒定表达式
- 我需要创建一个函数来获取字符串中的这些数字
- 如何从地址获取字符串?
- 为什么即使尚未初始化,获取字符串[0]也是有效的?
- 获取C++字符串的位