C++ 注入DLL函数中的访问冲突异常(5)

C++ 注入DLL函数中的访问冲突异常(5),c++,assembly,dll,bitmap,code-injection,C++,Assembly,Dll,Bitmap,Code Injection,我正在使用代码注入扩展Windows组件的功能。我重写一个方法的指令,调用我自己的方法来完成原始方法的工作。假设我们有: void Target(HDC magic123) { ... } 以下是该方法的前几个说明: push rbx // push rbp // stores registers to recover later ... sub rsp, 0x260 // for all 7 pushes ... mov r12, [rsp+0x28] // st

我正在使用代码注入扩展Windows组件的功能。我重写一个方法的指令,调用我自己的方法来完成原始方法的工作。假设我们有:

void Target(HDC magic123)
{ ... }
以下是该方法的前几个说明:

push    rbx //
push    rbp // stores registers to recover later
...
sub     rsp, 0x260 // for all 7 pushes
...
mov     r12, [rsp+0x28] // stores a pointer to 'magic123'
...
...a lot more instructions

在mov r12[rsp+0x28]之后,我立即用以下命令覆盖下一条指令:

mov rcx, r12                // 1st parameter to pass to a called function goes in RCX
add rsp, 0x260              // restore the stack
push 0                      // create shadow space |EDIT: MISALIGNED STACK. WRONG.
mov rax, &DetouredFunction  // function in my injected DLL
call rax                    // call it with the HDC as parameter
我在DLL中的函数:

void DetouredFunction(uintptr_t hdcPointer)
{
uintptr_t hdcAddress = *(uintptr_t*)(hdcPointer); // convert pointer to address
HDC hdc = (HDC)hdcAddress; // create a HDC from the address


HBITMAP hBitmapWallpaper = (HBITMAP)LoadImage(NULL, L"C:\\Users\\<user>\\Desktop\\image.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
SelectObject(hdc, hBitmapWallpaper);
}
void迂回功能(uintptr\t hdcPointer)
{
uintpttr\u t hdcAddress=*(uintpttr\u t*)(hdcPointer);//将指针转换为地址
HDC HDC=(HDC)hdcAddress;//从地址创建HDC
HBITMAP HBITMAP壁纸=(HBITMAP)加载图像(空,L“C:\\Users\\\\Desktop\\image.bmp”,图像\u位图,0,0,LR\u加载文件);
选择对象(hdc、HBITMAP壁纸);
}
一切正常,直到我在注入的DLL函数中调用“LoadImage”。它在尝试读取不存在的地址0xFFFFFFFFFFFFFF时抛出“访问冲突异常(5)”


有什么问题?如果我上面的评论有错误,请更正。谢谢大家!

我的问题是堆栈未对齐。在再次调用LoadImage之前,它没有任何明显的效果。

您还需要从堆栈还原保存的寄存器。另外,为什么要调用
而不是
jmp
?似乎您想要跳转,这还有一个额外的好处,即不会弄乱所需的堆栈对齐,这可能会导致您的错误;)还不清楚您是如何将
HDC
转换为指针的。从这里看来,您应该用
jmp
覆盖函数的第一条指令,就是这样。@Jester我知道这一点,但我的函数甚至没有返回值,所以混乱的寄存器不是问题。
HDC
作为参数传递给原始函数,我想将相同的
HDC
传递给我自己的函数作为替换。但是堆栈对齐和缺少阴影空间可能是错误的。@Jester为什么我的函数会关心以前函数的寄存器或堆栈值?我知道它们将被覆盖,那些原始函数将被破坏,但我不认为这对我的函数来说是个问题,因为调用约定需要特定的堆栈对齐。