C++ 弯路钩住记忆不工作程序停止工作

C++ 弯路钩住记忆不工作程序停止工作,c++,crash,hook,memcpy,detours,C++,Crash,Hook,Memcpy,Detours,当我将这个dll注入程序时,程序在遇到函数memcpy时崩溃 我想绕道把函数memcpy挂起来。 请帮忙 #include <windows.h> #include<iostream> #include "detours\detours.h" #pragma comment( lib, "msvcrt.lib" ) #pragma comment( lib, "detours.lib" ) void * (__cdecl *memcpy_o)(void *dest, c

当我将这个dll注入程序时,程序在遇到函数memcpy时崩溃

我想绕道把函数memcpy挂起来。 请帮忙

#include <windows.h>
#include<iostream>
#include "detours\detours.h"

#pragma comment( lib, "msvcrt.lib" )
#pragma comment( lib, "detours.lib" )
void * (__cdecl *memcpy_o)(void *dest, const void *src, size_t count);


void* __cdecl Mine_Memcpy(void *dest, const void *src, size_t count) {
    char cislo[24]; // just big enough
    void* asd = &memcpy;
    sprintf(cislo,"0x%08x", &asd);

    MessageBoxA(0, cislo, cislo, 0);

    return memcpy_o(dest, src, count);

}


BOOL WINAPI DllMain(HINSTANCE, DWORD dwReason, LPVOID) {

    HANDLE memcpy_get = GetProcAddress(GetModuleHandleA("msvcrt"), "memcpy");
    switch (dwReason) {
    case DLL_PROCESS_ATTACH:
        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());
        memcpy_o = (void * (__cdecl *)(void *dest, const void *src, size_t count))DetourAttach(&(PVOID&)memcpy_get, Mine_Memcpy);
        DetourTransactionCommit();
        break;

    case DLL_PROCESS_DETACH:
        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());
        DetourDetach(&(PVOID &)memcpy_o, Mine_Memcpy);
        DetourTransactionCommit();
        break;
    }

    return TRUE;
}
#包括
#包括
#包括“detours\detours.h”
#pragma注释(lib,“msvcrt.lib”)
#pragma注释(lib,“detours.lib”)
空*(\uu cdecl*memcpy\u o)(空*目的地,常数空*src,大小计数);
无效*\uuuuCDECL矿山成员(无效*dest,const无效*src,大小\u t计数){
char cislo[24];//刚好够大
void*asd=&memcpy;
sprintf(cislo,“0x%08x”和asd);
MessageBoxA(0,cislo,cislo,0);
返回memcpy_o(dest、src、count);
}
布尔WINAPI DllMain(HINSTANCE、DWORD dwReason、LPVOID){
HANDLE memcpy_get=GetProcAddress(GetModuleHandleA(“msvcrt”),“memcpy”);
开关(原因){
案例DLL\u进程\u附加:
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
memcpy_o=(void*(u cdecl*)(void*dest,const void*src,size\u t count))迂回附加(&(PVOID&)memcpy_get,Mine\u memcpy);
DetourTransactionCommit();
打破
案例DLL\u进程\u分离:
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
绕道分离(&(PVOID&)memcpy_o,Mine_memcpy);
DetourTransactionCommit();
打破
}
返回TRUE;
}

我将这个dll注入到程序中。当程序停止运行时,请帮助,错误在哪里?

为什么不编辑原始问题,而不是询问新问题<代码>字符cislo[24];//刚好够大为什么它“刚好够大”?如果它关闭了1个字节,而现在您正在覆盖内存,该怎么办?不要站在刀口上,只需使用确保“足够大”的值来确保刀口足够大即可
char cislo[50]。我将其更改为char cislo[100];但当程序转到hooked memcpy函数时,它仍然停止工作。当我将此dll注入程序并调用memcpy函数时。程序停止工作。如果
MessageBoxA
使用
memcpy
,该怎么办?而
sprintf
(这里最好使用
snprintf
)在堆栈上打印
asd
的地址,而不是
memcpy
的地址。通常使用打印指针
%p
。祝你好运