如何在C++中在线组装?
How to inline assembly in C++?
我正在尝试将一些程序集注入到应用程序中,但在此行出现错误: 这是完整的代码
#define _TOJUMP 0xCDFA43
BYTE bak_InitDamageBuff[6];
void unHook(BYTE* from, BYTE* backup, size_t size) {
DWORD protect;
VirtualProtect(from, size, PAGE_EXECUTE_READWRITE, &protect);
memcpy(from, backup, size);
VirtualProtect(from, size, protect, &protect);
}
void Hook(BYTE* from, void* to, BYTE* backup, size_t size) {
DWORD protect;
VirtualProtect(from, size, PAGE_EXECUTE_READWRITE, &protect);
memcpy(backup, from, size);
DWORD diff = ((DWORD)to - (DWORD)from) - size;
memset(from, 0x90, size);
*(BYTE*)from = 0xE9;
*(DWORD*)((DWORD)from + 1) = diff;
VirtualProtect(from, size, protect, &protect);
}
DWORD return_address = _TOJUMP + 0x6;
static __declspec(naked) void NewInitDamageBuff() {
_asm {
mov [edx + 0x29D0], 0x0F4240; <-------------
jmp return_address;
}
}
void Main_thread() {
while (1) {
Hook((PBYTE)_TOJUMP, &NewInitDamageBuff, bak_InitDamageBuff, 6);
}
}
这有什么问题?
编译器是Visual Studio
我用葡萄牙语使用它,但尝试翻译错误
-数字后缀不正确
-整数 litalars 必须至少有一个数字
- 不好的令牌
你的0x0F4240
里有一些非ASCII字符;这就是MSVC窒息的地方。
MSVC 内联 asm 确实接受 C 样式十六进制格式的数字文字0xDEADBEEF
(与 MASM 不同(,因此您的 asm 看起来应该编译/汇编。 (它是否有用是另一回事。
错误消息是:
<source>(9): error C2059: syntax error: 'bad suffix on number'
<source>(9): error C2153: integer literals must have at least one digit
<source>(9): error C3872: '0xac': this character is not allowed in an identifier
<source>(9): error C2400: inline assembler syntax error in 'second operand'; found 'bad token'
我把你的函数放在Godbolt编译器资源管理器上,以获得实际的错误消息,DWORD
有一个typedef,因为Godbolt没有Windows.h来定义它。
typedef unsigned long DWORD;
#define _TOJUMP 0xCDFA43
DWORD return_address = _TOJUMP + 0x6;
static __declspec(naked) void NewInitDamageBuff() {
_asm {
mov [edx + 0x29D0], 0x0F4240; // original
mov [edx + 0x29D0], 0x0F4240; // retyped compiles fine if you comment out the original
jmp return_address;
}
}
这些错误消息让我认为那里有一个非 ASCII 字符窒息,并且在我的 Linux 桌面上复制/粘贴到hexdump -C
中证实了这一点:
00000000 6d 6f 76 20 5b 65 64 78 20 2b 20 30 78 32 39 44 |mov [edx + 0x29D|
00000010 30 5d 2c 20 30 78 e2 80 ad 30 46 34 32 34 30 e2 |0], 0x...0F4240.|
00000020 80 ac 3b 0a |..;.|
(输出的 ASCII 端的.
表示不可打印的字节(。
因此,在源操作数mov
的0x
之后,有一个80 ad 30
的3字节UTF-8序列,显然不会打印任何东西。
相关文章:
- 在线编译器中的分段C++没有打印消息
- 在线程之间拆分任务总是值得的吗?
- join() 失败,如果在线程内部调用 io_context.run()
- 如何在C++中在线组装?
- 在线程中读取无符号整数时,c++ 位是否以原子方式切换?
- 在线程函数中处理数据向量时进行线程竞速
- 我应该在线程上调用 processEvents() 吗?
- 如何创建始终在线的过程?
- pthread只有在线程数量较少时才可以正常工作
- boost::asio::io_service 在线程中,不会在应用程序退出时退出
- 如何在线程中初始化对象,然后在其他地方使用它?
- 在线程 A 中创建一个 std::thread 对象,在线程 B 中连接
- C++:我可以在线程仍在运行时为线程提供新值,还是必须先结束它?
- 为什么我的程序无法在GDB在线编译器/调试器或Visual Studio C++ 2019中运行
- 亚马逊在线评估编码问题,以找到第n个几何级数
- C++在线程中将多个对象传递给一个函数
- 在线程C++中创建一个套接字
- 有没有一种方法可以从本地C++程序写入在线CMS中的文件
- 我们如何在线程中使用参数
- 在 "CodePad" 中执行链表操作时转储的核心(这是一个在线C++编译器)