好吧,我想创建一个绕道我的自定义注入函数,所以这样的代码工作
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);
}
Run Code Online (Sandbox Code Playgroud)
但我觉得使用操作码很烦人,所以有没有办法使用__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);
}
Run Code Online (Sandbox Code Playgroud)
要将内联汇编转换为相应的字节,您可以将汇编写入__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;
}
Run Code Online (Sandbox Code Playgroud)
我们使用 declspec 来确保没有函数序言/结尾妨碍我们。输出仅用于此概念证明,内容为:0x50 0xB8 0x1 0x0 0x0 0x0 0x58
使用此技术写入目标进程应该足够简单。
如果您发现自己经常这样做,那么使用Capstone 反汇编器是最终的解决方案,它非常易于使用。
| 归档时间: |
|
| 查看次数: |
1008 次 |
| 最近记录: |