C++ 弯路钩住记忆不工作程序停止工作
当我将这个dll注入程序时,程序在遇到函数memcpy时崩溃 我想绕道把函数memcpy挂起来。 请帮忙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
#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
。祝你好运