我想创建一个绕道我的自定义注入函数,所以像这样的代码工作
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);
}
答案 0 :(得分:0)
要将内联汇编转换为相应的字节,您可以在__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是最终的解决方案,如果你经常这样做,它很容易使用。