gpt4 book ai didi

c++ - 如何将内联汇编 __asm 转换为字节

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:50:49 25 4
gpt4 key购买 nike

好吧,我想绕过我的自定义注入(inject)函数,这样代码就可以工作了

void *DetourCreate(BYTE *src, const BYTE *dst)
{
int len = 5;
BYTE* jmp = (BYTE*)malloc(len + 5);
DWORD dwBack;
VirtualProtect(src, len, PAGE_EXECUTE_READWRITE, &dwBack);
memcpy(jmp, src, len);
jmp += len;
jmp[0] = 0xE9;
*(DWORD*)(jmp + 1) = (DWORD)(src + len - jmp) - 5;
src[0] = 0xE9;
*(DWORD*)(src + 1) = (DWORD)(dst - src) - 5;
VirtualProtect(src, len, dwBack, &dwBack);
return(jmp - len);
}

但我发现使用操作码很烦人,所以有没有办法改用 __asm ?比如这个伪代码

void DetourCreate(byte *src, const byte *dst)
{
DWORD dwBack;
VirtualProtect(src, sizeof(*dst), PAGE_EXECUTE_READWRITE, &dwBack);
*src = __asm{
call dst
};
VirtualProtect(src, sizeof(*dst), dwBack, &dwBack);
}

最佳答案

要将内联汇编转换为相应的字节,您可以将汇编写在 __declspec(naked) 中功能与使用WriteProcessMemory将数据写入外部进程,使用内联汇编函数作为源。

这是一个从程序集写入本地缓冲区的示例:

__declspec(naked) int assembly()
{
__asm
{
push eax; // \x50
mov eax, 1; // \xB8 \x01\x00\x00\x00
pop eax; // \x58
}
}

int main()
{
unsigned char buffer[7] = { 0 };

HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, NULL, GetCurrentProcessId());
WriteProcessMemory(hProc, &buffer, &assembly, 7, NULL);

for (auto c : buffer)
{
printf("0x%hhX ", c);
}

std::getchar();

return 0;
}

我们使用 declspec 来确保没有函数序言/结尾妨碍我们。输出仅用于此概念验证,内容为:0x50 0xB8 0x1 0x0 0x0 0x0 0x58

应该足够简单,可以使用此技术写入目标进程。

使用 Capstone disassembler如果您发现自己经常这样做,这是最终的解决方案,它非常易于使用。

关于c++ - 如何将内联汇编 __asm 转换为字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28205616/

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