C++劫持注入(适用于大部分dll)

    xiaoxiao2021-03-25  136

    导出函数使用depends查看

    新建win32 dll 带导出符号 1.用depends查看原dll中所有的调用函数 #pragma comment(linker,"/EXPORT:导出函数名=自写函数名,@导出序号") 2.获取原函数的地址 DWORD oldCall[x];//原dll中调用了多少函数定义多少 +1 void initCall(void){ HMODULE hdll  = LoadLibraryA("d3d8thk");//加载原dll获取句柄 for(int i = 1;i<x;i++){ //FARPROC GetProcAddress(HMODULE hModule, // DLL模块句柄 LPCSTR lpProcName // 函数名或函数编号); //如果函数调用成功,返回值是DLL中的输出函数地址。如果函数调用失败,返回值是NULL。 oldCall[i] = (DWORD)GetProcAdress(hdll,(char*)i//通过序号获取方法名); } } 3.定义所有函数及原函数 #pragma comment(linker,"/EXPORT:导出函数名=自写函数名,@导出序号") 实例: #pragma comment(linker,"/EXPORT:Direct3DShaderValidatorCreate9=_fun1,@1") DWORD dwRet[x]; //方法目的:找到原有的函数入口开始执行  然后跳转到函数返回地址执行下一句代码  C语言语法 纯汇编 所有参数从右到左依次入栈 extern "C" __declspec(naked) void __cdecl fun1(void){ __asm{ //保存返回地址 //pop DWORD ptr ds:[dwRet] pop dwRet[4*1]; //调用原函数 //call DWORD ptr ds : [dwoldCall] call dwoldCall[4*1] //跳转到原函数的返回地址 //jmp DWORD ptr ds : [dwRet] jmp dwRet[4*1] } //跳转到原有函数执行  并返回结果 } 4.程序被加载时执行 dllmain中找到DLL_PROCESS_ATTACH 添加代码(自己需要添加的内容); break;

    转载请注明原文地址: https://ju.6miu.com/read-23630.html

    最新回复(0)