DLL注入_拦截技术之Hook方式
后卫大师教你进程注入
首先提一下,由于文章完全是我手写,所以打不了太多,请包含,由于我已经提供了源代码,所以我在这里详细讲一下理论,至于想看代码的下载代码就可以了。代码中关于注入的部分做了详细的注释。MFC界面部分的注释没有写,(毕竟太肤浅了。)
好,言归正传。
所谓DLL注入,既把一个DLL文件放到目标进程中。
下面介绍2种注入方式:
.远程线程注入。
.利用hook注入。(可以过卡巴斯基)
由于本文篇幅限制,不写如何编写DLL。
一.首先讲一下远程线程注入的方法:
.假设我们已经写好了一个DLL文件。
.设置本进程权限为debug权限,既调试权限,可以打开其他进程。代码如下: BOOL SetToken(void)
{
HANDLE hToken;
TOKEN_PRIVILEGES Privileges;
LUID luid;
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY | TOKEN_READ,&hToken);
Privileges.PrivilegeCount=;
LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&luid);
Privileges.Privileges[].Luid=luid;
Privileges.Privileges[].Attributes=SE_PRIVILEGE_ENABLED;
if(!AdjustTokenPrivileges(hToken,FALSE,&Privileges,NULL,NULL,NULL)!=)
return FALSE;
CloseHandle(hToken);
return (GetLastError() == ERROR_SUCCESS);
}
.获得目标进程的句柄。
OpenProcess(权限类型,是否可被继承,进程ID)功能:返回目标进程句柄.
.在远程进程中分配内存,用来存储,我们要注入的dll的路径
VirtualAllocEx(hProcess, NULL, cb, MEM_COMMIT, PAGE_READWRITE); //VirtualAllocEx()函数功能:为制定的进程分配虚拟地址
//参1:要分配的进程句柄
//参2:要分配的虚拟地址的位置,0表示,自动分配位置
//参3:分配的大小
//参4:MEM_COMMIT表示,分配物理内存或者页面内存,并且初始化内存为0
//参5:存储选项:PAGE_READWRITE表示可以在页面内存中 “读写”
//返回值:如果分配内存成功,则返回分配内存的地址,如果分配失败则返回NULL,调用GetLastError()查看错误原因 .在远程进程中刚才分配的内存处,写入目标DLL路径:
WriteProcessMemory(hProcess, pszLibFileRemote,PVOID) pszLibFile, cb, NULL)
//WriteProcessMemory()函数功能:在制定进程中写入内存
//参1:写入进程的句柄
//参2:写入内存的起始地址,必须是已经创建的地址,比如上面用VirtualAllocEx()在进程中创建的内存地址
//参3:写入内存中的数据内容的缓存
//参4:写入数据大小
//参5:一个选项,0表示忽视
//返回值: 非0值表示成功, 返回0则表示写入错误。调用GetLastError()查看错误原因 .获取LoadLibrary()函数地址,因为要用他来动态加载DLL,该函数在kernel32.dll文件中
PROC AdrMyDllDir=(PROC)::GetProcAddress(::GetModuleHandle(TEXT("kernel32.dll")),"LoadLibraryW");//W代表UNICODE版本,说实话,A代表多字节字符集,本人喜欢UNICODE版本 GetProcAddress()
FARPROC GetProcAddress(HMODULE hModule,LPCWSTR lpProcName);
//功能:返回指定的DLL输出函数的函数地址
//参数1:DLL模块句柄
//参数2:DLL输出函数的函数名
这个函数的返回值,就是LoadLibraryW的地址了 .创建远程线程,既在目标进程中创建一个线程,这里的线程跟普通的线程不同,普通线程有线程处理函数ProcThread()
CreateRemoteThread()
HANDLE CreateRemoteThread(
HANDLE hProcess,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId
);
//函数功能:在制定进程中的虚拟地址中创建一个线程
//参数1:进程句柄,线程被创建在这个进程中
//参数2:安全等级,0表示默认安全等级
//参数3:创建线程的大小,0表示系统自动分配线程实际需要的大小
//参数4:线程起始地址,使用LPTHREAD_START_ROUTINE 定义的线程,并且线程是在远程进程中已经存在。
//参数5: 给线程函数传递的参数
//参数6:创建标志,如果参数是0,则线程创建后立即运行
//参数7:线程ID,如果 ID给0 ,则不返回创建线程的ID ::CreateRemoteThread(hProcess,,,(LPTHREAD_START_ROUTINE)AdrMyDllDir,bufRemote,,);
这里的AdrMyDllDir存放LoadLibraryW ,也就是说把LoadLibraryW当做线程处理函数,传入的参数bufRemote存放的是目标DLL文件的地址。 二。下面讲解一下如何用hook既钩子注入DLL文件。
首先给不懂钩子的人简单介绍一下原理:所谓hook,既钩子。hook会在应用程序接到消息之前,拦截应用程序的信息,比如鼠标键盘钩子会拦截一个应用程序的鼠标键盘信息。要做盗号木马?用WH_KEYBOARD类型的hook
.我们要跨进程使用钩子,要把hook函数写在DLL文件中,这是微软明确规定的。也有其他方法,这里不多叙述
.在DLL文件中 设置钩子.
这里需要调用线程ID,threadId,我们会在下面调用DLL的调用端中写入
hhookGetMsg=::SetWindowsHookEx(WH_GETMESSAGE,GetMessageHookProc,::GetModuleHandle(TEXT("dll.dll")),threadId);
//参数1:钩子类型
//参数2:钩子处理函数
//参数3:钩子所在的模块
//参数4:钩子要拦截的线程ID,如果要设置全局钩子,这里给0。
把这个SetWindowsHookEx()函数写在一个导出函数中,允许调用dll文件的程序调用
_declspec(dllexport) void SetHook(DWORD threadId)
{
hhookGetMsg=::SetWindowsHookEx(WH_GETMESSAGE,GetMessageHookProc,::GetModuleHandle(TEXT("dll.dll")),threadId);
}
SetHook()就是本dll的导出函数
.在钩子处理函数中写入功能,当钩子截取到WM_NULL消息的时候,注入DLL文件。由于WM_NULL消息,是个没用的消息,应用程序一般不会收到这个消息,除非我们自己发送一个这个消息,所以我们在注入DLL的时候,只要给要注入的应用程序发一个WM_NULL消息,当钩子截取到WM_NULL的时候就注入钩子,就可以了。
LRESULT CALLBACK GetMessageHookProc(int nCode,WPARAM wParam,LPARAM lParam)
{
MSG* pMsg=(MSG*)lParam;
if(WM_NULL==pMsg->message)
::LoadLibraryW(TEXT("D://MyDLL.dll"));
}
好了,编译DLL项目,产生DLL文件。 .编写调用端,调用钩子
首先获取窗口句柄
HWND FindWindow( LPCTSTR lpClassName,
LPCTSTR lpWindowName
);
返回窗体句柄。hWnd.
hWnd=FindWindow(,要注入dll的窗体的名称(例如:千千静听))
利用hWnd,查找窗体线程ID
threadId=GetWindowThreadProcessId(hWnd,);
好了,我们有了线程ID了,可以调用钩子了。
SetHook(threadId);
这时钩子已经加载到目标线程中了。
向目标窗体发送WM_NULL消息
SendMessage(hWnd,WM_NULL,,);
钩子会在目标窗体受到消息前受到WM_NULL消息。由于钩子处理函数中做了判断,当受到WM_NULL消息时,加载DLL文件。所以DLL文件就注入到目标线程中了。 你可以把你的DLL文件中写入许多功能,而且DLL已经被目标程序加载了,也就是说,你的DLL程序已经打入到目标程序内部了,所以现在你可以为所欲为了
DLL注入_拦截技术之Hook方式的更多相关文章
- <ReversingEngineering>关于windows32位系统下的dll注入技术经验汇
上个学期把自己闷在图书馆一直在看关于逆向工程技术方面的书,从入门到初级,现在也敢说自己一条腿已经迈进了这片知识的大门里,因为该博客刚开通先将一些经验记录下来,也是留给自己一方面做个参照. <逆向 ...
- Dll注入技术之消息钩子
转自:黑客反病毒 DLL注入技术之消息钩子注入 消息钩子注入原理是利用Windows 系统中SetWindowsHookEx()这个API,他可以拦截目标进程的消息到指定的DLL中导出的函数,利用这个 ...
- 20145314郑凯杰《网络对抗技术》恶意DLL注入进程(进程捆绑)的实现
20145314郑凯杰<网络对抗技术>恶意DLL注入进程(进程捆绑)的实现 一.本节摘要 简介:在这部分里,要实现将恶意后门悄无声息地与进程进行捆绑,通过和已运行的进程进行捆绑,达到附着攻 ...
- Dll注入技术之注册表注入
DLL注入技术之REG注入 DLL注入技术指的是将一个DLL文件强行加载到EXE文件中,并成为EXE文件中的一部分,这样做的目的在于方便我们通过这个DLL读写EXE文件内存数据,(例如 HOOK EX ...
- Dll注入技术之远程线程注入
DLL注入技术之远线程注入 DLL注入技术指的是将一个DLL文件强行加载到EXE文件中,并成为EXE文件中的一部分,这样做的目的在于方便我们通过这个DLL读写EXE文件内存数据,(例如 HOOK EX ...
- Ring3下的DLL注入(NtCreateThreadEx + LdrLoadDll方式实现,可以注入系统进程)
工具介绍及使用请移步:http://blog.csdn.net/sunflover454/article/details/50441014 本文首发在零日安全论坛:http://www.jmpoep. ...
- 第22章 DLL注入和API拦截(2)
22.4 使用远程线程来注入DLL 22.4.1 概述 (1)远程线程注入是指一个进程在另一个进程中创建线程,然后载入我们编写的DLL,并执行该DLL代码的技术.其基本思路是通过CreateRemot ...
- 第22章 DLL注入和API拦截(1)
22.1 注入的一个例子(跨进程子类化窗口) ①子类化窗口可以改变窗口的行为,让发往该窗口的消息重新发到我们指定的过程来处理.但这种行为只能在本进程中(如A),对于从一个进程(如B)去子类化另一个进程 ...
- 系统安全攻防战:DLL注入技术详解
DLL注入是一种允许攻击者在另一个进程的地址空间的上下文中运行任意代码的技术.攻击者使用DLL注入的过程中如果被赋予过多的运行特权,那么攻击者就很有可能会在DLL文件中嵌入自己的恶意攻击代码以获取更高 ...
随机推荐
- SQL事务与并发
1.Transaction(事务)是什么: 事务是作为单一工作单元而执行的一系列操作.包括增删查改. 2.事务的种类: 事务分为显示事务和隐式事务: 隐式事务:就是平常我们使用每一条sql 语句就是一 ...
- HTML5实现坦克大战(一)
Tank 字段 x:坦克的中心点的横坐标 y:坦克的中心点的纵坐标 dir:坦克的前进的方向 spped:坦克的速度 color:坦克的颜色,用于区分种类不同的坦克 bullet:坦克的子弹 为a ...
- TreeSet()详解
TreeSet()详解 1.TreeSet原理: /* * TreeSet存储对象的时候, 可以排序, 但是需要指定排序的算法 * * Integer能排序(有默认顺序), String能排 ...
- Python核心编程读笔 10:函数和函数式编程
第11章 函数和函数式编程 一 调用函数 1 关键字参数 def foo(x): foo_suite # presumably does some processing with 'x' 标准调用 ...
- getchar()用法
getchar() .从缓冲区读走一个字符,相当于清除缓冲区 .前面的scanf()在读取输入时会在缓冲区中留下一个字符'\n'(输入完s[i]的值后按回车键所致),所以如果不在此加一个getchar ...
- Java学习之Java中常用对象
java的几种对象(PO,VO,DAO,BO,POJO)解释 一.PO:persistant object 持久对象,可以看成是与数据库中的表相映射的java对象.最简单的PO就是对应数据库中 ...
- ENVI5.1批量镶嵌工具界面按钮显示不全的解决方案
打开批量镶嵌工具,在导出文件界面,部分按钮显示不全.具体见下图: 图 1 界面按钮显示不全 解决方案: 以win7.8系统为例: 显示桌面 – > 右键“个性化” – >显示 – > ...
- 浮动层固定兼容IE6 position:fixed的最佳解决方案
第一种:css方法 有时候当我们需要把一个元素固定在页面的某个部位,一般都是用css中的“position:fixed;”方法来解决,但是IE6不支持fixed,所以今天分享一个兼容IE6的页面底部固 ...
- ODI KM二次开发手册
ODI KM二次开发手册 分类: ODI(16) 目录(?)[+] 1 引言 1.1 编写目的 本手册面向的读者对象为具备数据集成业务知识及对ODI操作了解的开发人员,作为其完成基于ODI基础上K ...
- 武汉新芯:已建成IP体系,欲以存储器为特色
武汉新芯集成电路制造公司(XMC)是地方政府投资的半导体企业,2006年由湖北省.武汉市.武汉市东湖高新区投资,并由东湖高新区管理的全资国有企业,前几年委托SMIC(中芯国际)经营管理,从2012年底 ...