-
2021-03-13 09:12:49
基本概念
Windows的应用程序在加载进程所需的动态库时,会根据导入表一一加载。但是,我们的导入表中只保存有动态库的名称,系统如何知道这个动态库的完整路径并将其加载呢?
其实,在加载动态库时,系统会按照一定的顺序搜索各个目录来寻找指定的Dll文件。一般搜索顺序为:应用程序所在目录-->系统目录-->16位系统目录-->Windows目录-->运行程序的当前目录-->PATH环境变量。
这还与注册表项HKLM\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode有关,如果键值为1,则执行上述的搜索顺序。如果键值为0,则执行如下的搜索顺序:
应用程序所在目录-->运行程序的当前目录-->系统目录-->16位系统目录->Windows目录-->PATH环境变量。
注入原理
上面说到,系统在加载所需的动态库时,第一个搜索的目录总是我们应用程序所在的目录,而应用程序常用的动态库Kernel32.dll、User32.dll等动态库是保存在Windows系统目录下的,搜索顺序都是比较靠后的,那么我们是否可以在当前目录下伪造一个User32.dll,提供同样的导出表,将每个导出函数转发到真正的User32.dll动态库里,同时可以实现我们自定义的操作,让系统误以为自己实际上已经加载了真正的User32.dll呢?
这确实是行得通的。因为我们在系统加载真正的动态库之前阻止了他,就好像我们将Dll劫持了一样,所以这种注入方式又被称为Dll劫持注入。函数转发
在劫持了真正的Dll文件后,系统就会使用我们自定义Dll文件的导出表,这是如果不做调整,我们的Dll就会"露馅"。所以,在劫持了真正的Dll文件后,我们同时要保证Dll文件内的功能也要"劫持"到,这里我们使用的是函数转发机制。
#pragma comment(linker,"/EXPORT:MyMessageBox=User32.MessageBoxA")
这段代码告诉编译器,系统在调用我们的Dll中的MyMessageBox时,会自动转发到User32.Dll中的MessageBoxA函数去执行。这就好比我们绑架了User32,然后我们假装告诉操作系统我们就是User32,这时候系统告诉我实现一下MessageBoxA函数,我们就可以把这个活甩给真正的User32,让它来完成,然后我们把完成的结果再返回给系统。以上就是函数转发机制的实现原理。
函数调用
除了函数转发外,还有一种比较常用的方法,那就是函数调用。
VOID _declspec(naked) MyMessageBox() { LPVOID MessageBoxAddress = NULL; HMODULE ModuleHandle = NULL; //加载真正的动态库 ModuleHandle = LoadLibrary(_T("User32.dll")); if (ModuleHandle != NULL) { //获得导出函数的地址 MessageBoxAddress = GetProcAddress(ModuleHandle, "MessageBoxA"); if (MessageBoxAddress) { __asm { //跳转到真正的函数地址处 jmp MessageBoxAddress } } //释放动态库 FreeLibrary(ModuleHandle); } }
函数调用主要是在我们的函数内部,又手动加载了真正的动态库,获得了动态库的导出函数,一旦我们的函数被系统调用,我们再在函数内调用真正的函数,在实现了我们自定义操作的同时,同时保证了功能的完整性。
如果说函数转发是"胁迫"真正的Dll帮我们实现功能,那么函数调用就是让Dll告诉我们实现的方法,我们自己自己来实现。局限性
(1)Windows7以上,系统没有了SafeDllSearchMode 这一选项,而是采用新的注册表项\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs,凡是此项下的DLL文件就会被禁止从应用程序自身所在的目录下调用,而只能从系统目录即SYSTEM32目录下调用。
(2)有些Dll文件在加载时需要检查签名等选项,如果是我们伪造的Dll,检查时就会出错,这也就导致了Dll劫持的失败。
更多相关内容 -
注入方式,劫持dll注入的实现
2020-12-09 21:31:40把我们特定的DLL伪装成系统DLL,然后放在执行文件目录下,就能实现DLL劫持。劫持来干嘛?肯定是要在被干程序体内有一席之地,然后想干什么就干什么。比如劫持ws2_32.dll可以实现抓包,改包,转向等。如何伪造?当然...基础的东西不想多讲,简单的提一句,具体请问度娘。
Windows的PE加载器会从执行文件目录下寻找DLL,如果找不到再去其他地方找。
把我们特定的DLL伪装成系统DLL,然后放在执行文件目录下,就能实现DLL劫持。
劫持来干嘛?
肯定是要在被干程序体内有一席之地,然后想干什么就干什么。比如劫持ws2_32.dll可以实现抓包,改包,转向等。
如何伪造?
当然是伪造导出表啦,导出表是一个DLL最总要的部分。
LPK.dll。
#pragma comment(linker, "/EXPORT:LpkInitialize=_gamehacker_LpkInitialize,@1")
#pragma comment(linker, "/EXPORT:LpkTabbedTextOut=_gamehacker_LpkTabbedTextOut,@2")
#pragma comment(linker, "/EXPORT:LpkDllInitialize=_gamehacker_LpkDllInitialize,@3")
#pragma comment(linker, "/EXPORT:LpkDrawTextEx=_gamehacker_LpkDrawTextEx,@4")
#pragma comment(linker, "/EXPORT:LpkExtTextOut=_gamehacker_LpkExtTextOut,@6")
#pragma comment(linker, "/EXPORT:LpkGetCharacterPlacement=_gamehacker_LpkGetCharacterPlacement,@7")
#pragma comment(linker, "/EXPORT:LpkGetTextExtentExPoint=_gamehacker_LpkGetTextExtentExPoint,@8")
#pragma comment(linker, "/EXPORT:LpkPSMTextOut=_gamehacker_LpkPSMTextOut,@9")
#pragma comment(linker, "/EXPORT:LpkUseGDIWidthCache=_gamehacker_LpkUseGDIWidthCache,@10")
#pragma comment(linker, "/EXPORT:ftsWordBreak=_gamehacker_ftsWordBreak,@11")
复制代码
是的,纯手写伪造很麻烦,一会儿还得写转发代码~~~。 如果某DLL的导出函数比较多,那真是一个累人的活儿。
在这里我介绍一款比较好用的自动生成工具:
aheadlib
功能:根据输入DLL的导出表生成劫持源码。
把生成的源码载入vc编译器是可以正常编译的。
选项很简单,自己摸索,一般默认即可。
在生成的代码中,你能找到:
AheadLib_ + 原始DLL导出函数名 ()
这样的函数
比如:
ALCDECL AheadLib_gethostbyname(void)
{
GetAddress("gethostbyname");
__asm JMP EAX;
}
你可以在这个函数中添加你自己的响应代码。 拦截就直接retn +参数长度。孩子,知道抓包工具该怎么写了吧?
下面介绍一个好玩的拦截例子。可以注入到大部分的企鹅网络游戏客户端。
在system32目录下有一个 rasadhlp.dll。
企鹅游戏在启动的时候会加载rasadhlp.dll,而且还是在保护机制开启之前。
所以劫持rasadhlp.dll就能过保护轻松注入腾讯游戏。【今天的LOL至少还能注入 2015.7.12】
使用工具,生成一份rasadhlp.dll的劫持代码。
然后在DllMain中添加一些代码。
添加的代码:
注意Load() 函数时工具生成的。这个函数用来加载原始DLL。
HMODULE hLoad;char *v;
hLoad=LoadLibrary("zr.dll");if (hLoad==NULL)
{
MessageBoxA(NULL,"无法载入 zr.dll",NULL,MB_OK);gotoloading;
}
v=(char *)GetProcAddress(hModule,"TxEntry");if(!v)
{
MessageBoxA(NULL,"无法找到 TXEntry 函数",NULL,MB_OK);gotoloading;
}
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)v,0,0,NULL);
loading:return Load();
这段代码的目的是加载zr.dll然后调用TxEntry函数。
注入进去后就可以随心所欲的干一些不和谐的事情。 比如搜索内存/修改内存。
到了现在,就可以去易语言论坛找一些最新的 无限视距DLL 注入进去试试啦。
当按下确认按钮后 TP保护才开始加载。
相关工具已经打包。
-
Dll注入技术之劫持注入
2018-06-28 17:45:23Dll注入技术之劫持注入测试环境系统:Windows 7 32bit工具:FileCleaner2.0 和 lpk.dll主要思路利用Window可以先加载当前目录下的dll特性,仿造系统的LPK.DLL,让应用程序先加载我们的伪LPK.DLL,然后在我们的dll中去调用...Dll注入技术之劫持注入
测试环境
系统:Windows 7 32bit
工具:FileCleaner2.0 和 lpk.dll
主要思路
利用Window可以先加载当前目录下的dll特性,仿造系统的LPK.DLL,让应用程序先加载我们的伪LPK.DLL,然后在我们的dll中去调用原来系统的原函数.
引用网络中的原理讲解
●背景知识●
首先我们要了解Windows为什么可以DLL劫持呢?主要是因为Windows的资源共享机制。为了尽可能多得安排资源共享,微软建议多个应用程序共享的任何模块应该放在Windows的系统目录中,如kernel32.dll,这样能够方便找到。但是随着时间的推移,安装程序会用旧文件或者未向后兼容的新文件来替换系统目录下的文件,这样会使一些其他的应用程序无法正确执行,因此,微软改变了策略,建议应用程序将所有文件放到自己的目录中去,而不要去碰系统目录下的任何东西。
为了提供这样的功能,在Window2000开始,微软加了一个特性,强制操作系统的加载程序首先从应用程序目录中加载模块,只有当加载程序无法在应用程序目录中找到文件,才搜索其他目录。利用系统的这个特性,就可以使应用程序强制加载我们指定的DLL做一些特殊的工作。
举个例子来说吧,Windows的系统目录下有一个名为LPK.DLL的系统文件,程序运行时会在c:\Windows\system32文件夹下找到这个DLL文件并加载它。如打开记事本程序,用360的进程管理工具可以显示记事本进程加载的所有模块,如图1所示。
图1 记事本加载的所有模块
可以看到记事本加载了c:\Windows\system32\LPK.DLL。
●什么是DLL劫持●
根据前面说的Windows资源共享机制,操作系统加载程序首先从应用程序目录中加载模块。这一特性在注册表中也有体现:HKLM\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode,如果为1,搜索的顺序为:应用程序所在目录->系统目录(用GetSystemDirectory获取)->16位系统目录->Windows目录(用GetWindowsDirectory获取)->运行程序的当前目录->PATH环境变量,如果为0,搜索顺序为:应用程序所在目录->运行程序的当前目录->系统目录(用GetSystemDirectory获取)->16位系统目录->Windows目录(用GetWindowsDirectory获取)->PATH环境变量。Windows Server 2003默认值为1,Windows XP/2000默认值为0或者没有这个键值。但是不管是哪种情况,第一个搜索的肯定是应用程序的所在目录,这样就有机会让应用程序去加载我们的DLL。如果这个DLL和系统目录下的某个DLL同名,导出表也相同,功能就是加载系统目录下的那个DLL,并且将导出表转发到那个真实的DLL。这时DLL劫持就发生了。可以看出,构造一个符合上面要求的DLL,再将其放在可执行文件的目录即可轻松实现DLL劫持了。
●DLL劫持的实现●
这一步我们的工作就是通过编程来实现一个LPK.DLL文件,它与系统目录下的LPK.DLL导出表相同,并能加载系统目录下的LPK.DLL,并且能将导出表转发到真实的LPK.DLL。可以看出我们要实现的这个DLL需求如下:
1、构造一个与系统目录下LPK.DLL一样的导出表;
2、加载系统目录下的LPK.DLL;
3、将导出函数转发到系统目录下的LPK.DLL上;4、在初始化函数中加入我们要执行的代码。
主要代码
实现伪造的LPK.DLL
// // LPK.DLL劫持注入源码 // // 头文件 #include "stdafx.h" #include <Windows.h> #include <process.h> // 导出函数 #pragma comment(linker, "/EXPORT:LpkInitialize=_AheadLib_LpkInitialize,@1") #pragma comment(linker, "/EXPORT:LpkTabbedTextOut=_AheadLib_LpkTabbedTextOut,@2") #pragma comment(linker, "/EXPORT:LpkDllInitialize=_AheadLib_LpkDllInitialize,@3") #pragma comment(linker, "/EXPORT:LpkDrawTextEx=_AheadLib_LpkDrawTextEx,@4") //#pragma comment(linker, "/EXPORT:LpkEditControl=_AheadLib_LpkEditControl,@5") #pragma comment(linker, "/EXPORT:LpkExtTextOut=_AheadLib_LpkExtTextOut,@6") #pragma comment(linker, "/EXPORT:LpkGetCharacterPlacement=_AheadLib_LpkGetCharacterPlacement,@7") #pragma comment(linker, "/EXPORT:LpkGetTextExtentExPoint=_AheadLib_LpkGetTextExtentExPoint,@8") #pragma comment(linker, "/EXPORT:LpkPSMTextOut=_AheadLib_LpkPSMTextOut,@9") #pragma comment(linker, "/EXPORT:LpkUseGDIWidthCache=_AheadLib_LpkUseGDIWidthCache,@10") #pragma comment(linker, "/EXPORT:ftsWordBreak=_AheadLib_ftsWordBreak,@11") // 宏定义 #define EXTERNC extern "C" #define NAKED __declspec(naked) #define EXPORT __declspec(dllexport) #define ALCPP EXPORT NAKED #define ALSTD EXTERNC EXPORT NAKED void __stdcall #define ALCFAST EXTERNC EXPORT NAKED void __fastcall #define ALCDECL EXTERNC NAKED void __cdecl //LpkEditControl导出的是数组,不是单一的函数(by Backer) EXTERNC void __cdecl AheadLib_LpkEditControl(void); EXTERNC __declspec(dllexport) void(*LpkEditControl[14])() = { AheadLib_LpkEditControl }; //添加全局变量 // AheadLib 命名空间 namespace AheadLib { HMODULE m_hModule = NULL; // 原始模块句柄 // 加载原始模块 inline BOOL WINAPI Load() { TCHAR tzPath[MAX_PATH]; TCHAR tzTemp[MAX_PATH * 2]; GetSystemDirectory(tzPath, MAX_PATH); lstrcat(tzPath, TEXT("\\lpk.dll")); m_hModule = LoadLibrary(tzPath); if (m_hModule == NULL) { wsprintf(tzTemp, TEXT("无法加载 %s,程序无法正常运行。"), tzPath); MessageBox(NULL, tzTemp, TEXT("AheadLib"), MB_ICONSTOP); }; //MessageBox(NULL, "原始模块加载成功", TEXT("AheadLib"), MB_ICONSTOP); return (m_hModule != NULL); } // 释放原始模块 inline VOID WINAPI Free() { if (m_hModule) { FreeLibrary(m_hModule); } } // 获取原始函数地址 FARPROC WINAPI GetAddress(PCSTR pszProcName) { FARPROC fpAddress; CHAR szProcName[16]; TCHAR tzTemp[MAX_PATH]; fpAddress = GetProcAddress(m_hModule, pszProcName); if (fpAddress == NULL) { if (HIWORD(pszProcName) == 0) { wsprintfA(szProcName, "%d", pszProcName); pszProcName = szProcName; } wsprintf(tzTemp, TEXT("无法找到函数 %hs,程序无法正常运行。"), pszProcName); MessageBox(NULL, tzTemp, TEXT("AheadLib"), MB_ICONSTOP); ExitProcess(-2); } return fpAddress; } } using namespace AheadLib; //函数声明 void WINAPIV InitInject(LPVOID pParam); //自己添加功能的函数 void WINAPIV InitInject(LPVOID pParam) { //在这里可以添加自己的DLL //LoadLibrary(TEXT(".\\MyDll.dll")); MessageBox(NULL, TEXT("LPK劫持成功"), TEXT("警告"),NULL); return; } // 入口函数 BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved) { if (dwReason == DLL_PROCESS_ATTACH) { DisableThreadLibraryCalls(hModule); if (Load()) { //LpkEditControl这个数组有14个成员,必须将其复制过来 memcpy((LPVOID)(LpkEditControl + 1), (LPVOID)((int*)GetAddress("LpkEditControl") + 1), 52); _beginthread(InitInject, NULL, NULL);//创建新线程实现自己的功能 } else { // MessageBox(NULL, "初始化失败", "123 ERROR", MB_ICONSTOP); return FALSE; } } else if (dwReason == DLL_PROCESS_DETACH) { Free(); } return TRUE; } // 导出函数 ALCDECL AheadLib_LpkInitialize(void) { GetAddress("LpkInitialize"); __asm JMP EAX; } // 导出函数 ALCDECL AheadLib_LpkTabbedTextOut(void) { GetAddress("LpkTabbedTextOut"); __asm JMP EAX; } // 导出函数 ALCDECL AheadLib_LpkDllInitialize(void) { GetAddress("LpkDllInitialize"); __asm JMP EAX; } // 导出函数 ALCDECL AheadLib_LpkDrawTextEx(void) { GetAddress("LpkDrawTextEx"); __asm JMP EAX; } // 导出函数 ALCDECL AheadLib_LpkEditControl(void) { GetAddress("LpkEditControl"); __asm jmp DWORD ptr[EAX];//这里的LpkEditControl是数组,eax存的是函数指针 } // 导出函数 ALCDECL AheadLib_LpkExtTextOut(void) { GetAddress("LpkExtTextOut"); __asm JMP EAX; } // 导出函数 ALCDECL AheadLib_LpkGetCharacterPlacement(void) { GetAddress("LpkGetCharacterPlacement"); __asm JMP EAX; } // 导出函数 ALCDECL AheadLib_LpkGetTextExtentExPoint(void) { GetAddress("LpkGetTextExtentExPoint"); __asm JMP EAX; } // 导出函数 ALCDECL AheadLib_LpkPSMTextOut(void) { GetAddress("LpkPSMTextOut"); __asm JMP EAX; } // 导出函数 ALCDECL AheadLib_LpkUseGDIWidthCache(void) { GetAddress("LpkUseGDIWidthCache"); __asm JMP EAX; } // 导出函数 ALCDECL AheadLib_ftsWordBreak(void) { GetAddress("ftsWordBreak"); __asm JMP EAX; }
实现效果
把伪造的LPK.DLL放在程序同目录下(这样会首先加载我们伪造的DLL)
注:可能需要修改注册表,使得程序从执行文件所在目录加载DLL(修改完可能需要重启)
有些高版本系统和程序已经不能劫持lpk.dll了,这里我用了"黑客反病毒论坛"的FileCleaner2.0.exe程序测试成功!
其他可劫持的dll为:
lpk.dll、winmm.dll、ws2_32.dll、ws2help.dll、version.dll、usp10.dll、msimg32.dll、midimap.dll、ksuser.dll、comres.dll、ddraw.dll等
XP:
把HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SessionManager\knowndlls下的lpk项删除掉,重启电脑。
WIN7:
在HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SessionManager添加一个键值ExcludeFromKnownDlls(多字符串类型),把lpk.dll加进去。如果需要其他DLL请自行加入。
如图:
查看我们伪造的LPK.DLL导出表,与系统原来的一样
运行程序后先加载了我们伪造的LPK.DLL,程序被劫持
从模块列表中也可以看到,既加载了我们伪造的LPK.DLL,也加载了系统的lpk.dll
-
c++ DLL注入,win32 api版,win10测试通过
2017-07-21 22:48:59用于远程注入exe,并截取wndproc窗口消息函数,以将两个不同窗口的位置进行绑定。 使用g++编译并测试通过,注意:将生成的inject.exe添加到杀软白名单。 注入进程及窗口在inject.cpp及size.cpp中修改。 编译请参看... -
易语言-易语言DLL劫持
2021-06-25 17:17:54此种方法只对除kernel32.dll、ntdll.dll等核心系统库以外的DLL有效,如网络应用程序的ws2_32.dll、游戏程序中的d3d8.dll,还有大部分应用程序都调用的lpk.dll、sxs.dll,这些DLL都可被劫持。 伪造的dll制作好后,放... -
C/C++劫持技术(函数劫持、dll注入、动态库注入、HOOK)
2022-03-15 10:05:51目录 劫持 detours 实现劫持 ...劫持QQ ...实现劫持system函数。...2. 源文件(注意:需要保存为.c文件,或者加上extern C,因为detours是使用C语言实现的,表示代码...4. 把dll注入到QQ.exe 5. 拦截QQ执行system函数.目录
2. 源文件(注意:需要保存为.c文件,或者加上extern C,因为detours是使用C语言实现的,表示代码使用C的规则进行编译)
劫持
- 劫持的原理就是把目标函数的指针的指向修改为自定义函数的地址。
- 函数是放在内存中的代码区,所以劫持与代码区密切相关。
- 实现劫持需要使用detours。
detours
- detours是微软亚洲研究院出口的信息安全产品,主要用于劫持。这个工具使用C语言实现,所以是跨平台的。
- detours根据函数指针改变函数的行为,可以拦截任何函数,即使操作系统函数。
detours下载地址:
下载地址1: http://research.microsoft.com/en-us/downloads/d36340fb-4d3c-4ddd-bf5b-1db25d03713d/default.aspx
下载地址2: http://pan.baidu.com/s/1eQEijtS实现劫持
开发环境说明:win7、vs2012
步骤:
1. 安装Detours
2. 编译Detours工程
在安装目录C:\Program Files\Microsoft Research\Detours Express 3.0\src目录下的是工程的源文件。
(1) 打开VS2012命令行工具,进入src目录。
(2) 使用nmake(linux下是make)命令编译生成静态库。
(3) 在lib.x86目录下的.lib文件是win32平台下的静态库文件
(4) 在include目录下的是Detours工程的头文件
3. 把静态库和头文件引入工程
// 引入detours头文件 #include "detours.h" // 引入detours.lib静态库 #pragma comment(lib,"detours.lib")
4. 函数指针与函数的定义
(1) 定义一个函数指针指向目标函数,这里目标函数是system
例如:
detour在realse模式生效(因为VS在Debug模式下已经把程序中的函数劫持了)
static int ( *oldsystem)(const char * _Command) = system;//定义一个函数指针指向目标函数
(2) 定义与目标函数原型相同的函数替代目标函数
例如:
//3.定义新的函数替代目标函数,需要与目标函数的原型相同 int newsystem(const char * _Command){ int result = MessageBoxA(0,"是否允许该程序调用system命令","提示",1); //printf("result = %d", result); if (result == 1) { oldsystem(_Command); //调用旧的函数 }else{ MessageBoxA(0,"终止调用system命令","提示",0); } return 0; }
5.拦截
//开始拦截 void Hook() { DetourRestoreAfterWith();//恢复原来状态(重置) DetourTransactionBegin();//拦截开始 DetourUpdateThread(GetCurrentThread());//刷新当前线程(刷新生效) //这里可以连续多次调用DetourAttach,表明HOOK多个函数 DetourAttach((void **)&oldsystem, newsystem);//实现函数拦截 DetourTransactionCommit();//拦截生效 }
//取消拦截 void UnHook() { DetourTransactionBegin();//拦截开始 DetourUpdateThread(GetCurrentThread());//刷新当前线程 //这里可以连续多次调用DetourDetach,表明撤销多个函数HOOK DetourDetach((void **)&oldsystem, newsystem); //撤销拦截函数 DetourTransactionCommit();//拦截生效 }
劫持QQ
实现劫持system函数。
1. 设置项目生成dll
2. 源文件(注意:需要保存为.c文件,或者加上extern C,因为detours是使用C语言实现的,表示代码使用C的规则进行编译)
#include #include #include // 引入detours头文件 #include "detours.h" //1.引入detours.lib静态库 #pragma comment(lib,"detours.lib") //2.定义函数指针 static int ( *oldsystem)(const char * _Command) = system;//定义一个函数指针指向目标函数 //3.定义新的函数替代目标函数,需要与目标函数的原型相同 int newsystem(const char * _Command){ char cmd[100] = {0}; int result = 0; sprintf_s(cmd,100, "是否允许该程序执行%s指令", _Command); result = MessageBoxA(0,cmd,"提示",1); //printf("result = %d", result); if (result == 1) // 允许调用 { oldsystem(_Command); //调用旧的函数 }else{ // 不允许调用 } return 0; } // 4.拦截 //开始拦截 _declspec(dllexport) void Hook() // _declspec(dllexport)表示外部可调用,需要加上该关键字其它进程才能成功调用该函数 { DetourRestoreAfterWith();//恢复原来状态(重置) DetourTransactionBegin();//拦截开始 DetourUpdateThread(GetCurrentThread());//刷新当前线程(刷新生效) //这里可以连续多次调用DetourAttach,表明HOOK多个函数 DetourAttach((void **)&oldsystem, newsystem);//实现函数拦截 DetourTransactionCommit();//拦截生效 } //取消拦截 _declspec(dllexport) void UnHook() { DetourTransactionBegin();//拦截开始 DetourUpdateThread(GetCurrentThread());//刷新当前线程 //这里可以连续多次调用DetourDetach,表明撤销多个函数HOOK DetourDetach((void **)&oldsystem, newsystem); //撤销拦截函数 DetourTransactionCommit();//拦截生效 } // 劫持别人的程序:通过DLL注入,并调用Hook函数实现劫持。 // 劫持系统:通过DLL注入系统程序(如winlogon.exe)实现劫持系统函数。 _declspec(dllexport) void main(){ Hook(); // 拦截 system("tasklist"); //弹出提示框 UnHook(); // 解除拦截 system("ipconfig"); //成功执行 system("pause"); // 成功执行 }
3. 生成"劫持1.dll"文件
4. 把dll注入到QQ.exe
DLL注入工具下载: https://coding.net/u/linchaolong/p/DllInjector/git/raw/master/Xenos.exe
(1) 打开dll注入工具,点击add,选择"劫持1.dll"(2) 在Process中选择QQ.exe,点击Inject进行注入。
(3) 点击菜单栏Tools,选择Eject modules显示当前QQ.exe进程中加载的所有模块,如果有"劫持1.dll"表示注入成功。
5. 拦截QQ执行system函数
(1) 点击Advanced,在Init routine中填写动态库(dll)中的函数的名称,如Hook,然后点击Inject进行调用。此时,我们已经把system函数劫持了。
(2) 点击Advanced,在Init routine中填写main,执行动态库中的main函数。此时,弹出一个对话框,问是否允许执行tasklist指令,表示成功把system函数拦截下来了。
参考
DLL注入工具源码地址: https://coding.net/u/linchaolong/p/DllInjector/git
说明:
该工具来自以下两个项目
Xenos: https://github.com/DarthTon/Xenos.git
Blackbone: https://github.com/DarthTon/Blackbone -
Python——dll注入
2020-12-04 08:57:32dll攻击原理分析什么是dll动态链接库,是在微软Windows操作系统中实现共享函数库概念的一种方式。这些库函数的扩展名是 ”.dll"、".ocx"(包含ActiveX控制的库)或者 ".drv"(旧式的系统驱动程序)。为何有dll由于进程的... -
DLL劫持源码-易语言
2021-06-12 19:41:09此种方法只对除kernel32.dll、ntdll.dll等核心系统库以外的DLL有效,如网络应用程序的ws2_32.dll、游戏程序中的d3d8.dll,还有大部分应用程序都调用的lpk.dll、sxs.dll,这些DLL都可被劫持。 伪造的dll制作好后,放... -
dll注入&代码注入
2021-09-17 19:24:04dll注入&代码注入 CreateRemoteThread 思路:在目标进程中申请一块内存并向其中写DLL路径,然后调用 CreateRemoteThread ,**(在自己进程中 创建远程线程到到目标进程)在目标进程中创建一个线程。**... -
14种DLL注入技术
2020-01-03 10:51:54本文只是介绍各个注入的核心思想,详细的可以参照文末链接里的源码,一看就明白。本文只是介绍各个注入的...DLL注入是指向某一个特定的进程空间强制插入一个特定的DLL文件映像,值得注意的是这种插入是强制性的插... -
易语言 dll注入
2018-11-12 13:54:40易语言版本 dll注入 注入就是将一个DLL放进某个进程的地址空间里,让它成为那个进程的一部分。要实现DLL注入,首先需要打开目标进程。 -
013-【直播】劫持注入(郁金香).c
2019-05-14 21:49:52d3d9劫持dll 示例代码 //保持原来d3d9.dll的功能 UINT_PTR g_Call14[15]={0}; void InitCall14() { LoadLibraryA("MyGame"); HMODULE hdll=LoadLibraryA("c:\\windows\\syswow64\\d3d9.dll"); //DWORD 地址=... -
Kinject-x64:Kinject - 内核 dll 注入器,目前提供 x86 版本,即将更新到 x64
2021-06-13 12:41:34Kinject - 内核 dll 注入器,目前在 x86 版本中可用,很快将更新到 x64。 在这里你可能只找到驱动程序,应用程序本身将在我完成 x64 版本后发布。 驱动程序的基本结构: 找到一个线程来劫持。 打开目标进程。 ... -
DLL注入之注册表注入
2020-05-07 12:17:25我的原博客位置:...注册表注入DLL 顾名思义,就是通过注册表的方式,把需要的执行的代码片段,注入到目标程序中,使目标程序执行指定的代码片段,从而达到预期效果。 该... -
DLL注入和API拦截
2020-12-09 21:31:41读《Windows核心编程》笔记一DLL注入和API拦截在Windows中,每个进程相互独立,都有自己的私有的地址空间,程序中使用的指针都是进程自己地址空间的一个内存地址,无法创建也没法使用其他进程的指针。这种机制使得... -
DLL注入技术
2021-06-06 17:35:05显式载入|卸载DLL模块2.得到DLL符号地址 1.显式载入|卸载DLL模块 在任何时候,进程中的一个线程可以调用下面两个函数来将一个DLL映射到进程的地址空间中: HMODULE LoadLibrary(PCTSTR pszDLLPathName); HMODULE ... -
DLL注入的多种方式
2021-05-09 15:05:46DLL注入的多种方式 注册表注入 在Windows NT/2000/XP/2003操作系统中,当需要加载user32.dll的程序启动时,user32.dll会加载注册表键HLM\Software\Microsoft\WindowsNT\CurrentVersion\Windows\AppInit_DIls下面列出... -
易语言DLL劫持生成 最新劫持技术-易语言
2021-06-11 17:26:40.dll达到注入目标进程,为什么会被劫持呢?因为在程序执行的时候会在当前目录搜索 lpk .dll文件,如果文件存在就会被加载到进程地址空间。 DLL劫持原理: DLL劫持技术当一个可执行文件运行时,Windows加载器将可... -
windows DLL注入之注册表注入
2019-11-07 15:43:07windows下的注入之注册表注入: 1.概念介绍: 注入与Hook:注入与hook经常被人们混淆,其实注入和hook是两种windows下的编程技术(当然,其他平台也有相关的技术),由于在安全编程中,两项技术经常被同时结合起来使用... -
DLL劫持注入技术分析、过各种游戏保护!
2019-06-27 15:29:58劫持DLL就是要制作一个“假”的DLL,但是功能又不能失真。 可执行文件在调用某函数时,要加载该...DLL注入与DLL劫持的比较: DLL劫持相当于一个定时的炸弹,只等待可执行文件双击运行,拔出导火线,而DLL注入,目... -
APC_dll注入
2022-03-03 20:15:07//注入器 //1.要注入到进程中首先要拿到进程ID //2.获取到LoadLibrary地址 //3.在目标程序的体内开辟一块内存,用来写入dll地址 //4.遍历线程-随便选一个目标进程的线程获取句柄 //5.插入APC,把LoadLibrary作为APC的... -
DLL劫持示例程序:EXE+DLL
2020-07-03 14:10:521. 这是本人编写的DLL劫持演示程序,整个解决方案中包含三个工程:EXE主调程序、DLL被调程序、DLL劫持程序。 2. 本解决方案是基于VS2005开发的。 -
反射式dll注入(ReflectiveDLLInjection)
2020-04-30 11:39:04学习基于stephenfewer大佬的项目:ReflectiveDLLInjection 有兴趣的同学可以下载研究 -
version.dll 劫持源代码
2021-01-08 19:59:17version.dll 劫持源码,亲自实测可用。VC++可以编译成功 -
DLL注入之杀毒
2020-04-05 23:28:19DLL注入之杀毒 1、方法一:与DLL注入过程类似 和DLL的注入过程类似,只不过在这里使用了两个API:GetModuleHandle和FreeLibrary。以下略去了与注入部分相似或相同的代码: // 使目标进程调用GetModuleHandle,获得... -
Windows编程DLL注入之Hook(钩子)注入
2020-11-06 11:57:36消息: 消息可以由系统和应用程序生成,...即成功将Dll注入到进程B,之后可以在DllMain中进行细节处理。 注:钩子函数执行在钩子进程,dll首次被映射至进程B时会在B进程触发DllMain函数,进入case DLL_PROCESS_ATTACH。 -
dll注入实现MFC程序劫持(4)
2019-10-05 05:40:18dll注入实现MFC程序劫持(4) 双击会运行system("pause")打开计算器 现在禁止打开 #include #include #include #include #include "detours.h" #pragma comment ( lib , "detours.lib" ) static ... -
injex:Injex DLL 注入库
2021-06-07 05:53:46DLL 注入器 要编辑和编译的 DLL 模板。 模板 DLL 带有标准功能,可以在注入的任何内容中放置用于函数挂钩的挂钩。 支持的注入方法: Ritcher 方法- 通过在 LoadLibrary 上创建线程将您的 DLL 注入目标进程。 这... -
DLL注入的8种姿势
2019-08-24 16:44:38目录 1、远程线程注入 2、APC注入 3、注册表注入 4、ComRes注入 ...一、DLL注入——远程线程注入 https://blog.csdn.net/Cody_Ren/article/details/100041660 二、DLL注入——APC注入 APC注入...