【发布时间】:2019-03-14 20:10:06
【问题描述】:
我正在尝试将一些程序集注入到应用程序中,但在这一行出现错误: 这是完整的代码
#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
我在葡萄牙语中使用它,但我尝试翻译错误
-数字的后缀不正确
-整数 litarals 必须至少有一个数字
- 一些不好的令牌
【问题讨论】:
-
不明确的操作数大小,你需要告诉编译器你想要
dword ptr,word ptr,还是什么。这可能是错误消息告诉您的内容,但您忽略了它,所以这不是minimal reproducible example。 -
对于初学者来说,每个
call都应该遇到ret,并且不知道这个函数是否是这种情况(如果你甚至可以称它为函数),不清楚你是什么正在做,这是勾搭的尝试吗?你甚至知道edx在call生成时的状态吗?您似乎很确定这是一个有效的内存地址,但您是如何得出这个结论的? -
我遇到错误 那为什么它们没有包含在您的帖子中?我们无法从我们所在的位置看到您的屏幕,但您可以。您没有理由不在帖子中包含这些错误。请edit 这样做。当你使用它时,你也可以为你正在使用的编译器添加一个标签。
-
@Havenard:函数可以以
jmp尾调用而不是ret结束。这是完全正常的。但是,是的,它不应该被称为return_address。 -
@MichaelPetch:嘿,有趣的是,我们在编辑几个小时后同时回到这个问题,使其成为非最小的主要 CVE。根据我的复制/粘贴 hexdump,
x是一个普通的 ASCIIx,但后面跟着一些时髦的东西。我没有在 unicode 表中查找它。
标签: c++ visual-studio assembly inline-assembly