dll注入

远程线程注入遇到的问题

二次信任 提交于 2020-03-25 21:07:13
前因:   远程线程注入dll的时候debug版的dll注入不成功,release版的dll成功,经过在网上查阅,最后在windows黑客编程技术详解里找到了解决办法 解决办法:    VC项目属性 →配置属性→C/C++→代码生成→运行时库 可以采用的方式有:多线程(/MT)、多线程调试(/MTd)、多线程DLL(/MD)、多线程调试DLL(/MDd)   Debug模式选择"MTD",Release选择"MT"(我之前是MD也成功了)   MFC的使用”选项中设置“在静态库中使用MFC”   这个地方还没有弄很明白,如果哪位大佬有知道的还望不吝赐教 来源: https://www.cnblogs.com/ndyxb/p/12569376.html

N种内核注入DLL的思路及实现

瘦欲@ 提交于 2020-03-02 10:48:06
内核注入 ,技术古老但很实用。现在部分RK趋向无进程,玩的是 SYS+DLL ,有的无文件,全部存在于内存中。可能有部分人会说:“都进内核了.什么不能干?”。是啊,要是内核中可以做包括R3上所有能做的事,软件开发商们也没必要做应用程序了。有时,我们确实需要R3程序去干驱动做起来很困难或者没必要驱动中去做的事,进程 / DLL是不错的选择,但进程目标太大,所以更多的同学趋向于注DLL。 若要开发安全软件、小型工具,可借鉴其思路,Anti Rootkits时,在某些极端情况下,可使用同样的技术发现、清除RK,保证用户电脑的正常使用。在此,我将探讨几种内核注入DLL的思路及实现原理。 (1) APC 技术 给一个Alertbale的用户态线程插APC,让其执行其中的ShellCode,来执行我们的代码。这个方法简单易行,但是不够稳定,兼容性不好。测试中发现经常出现Explorer.exe等插崩溃的情况,而且有杀软在的情况下,插入有时会被拦截,起不到应有的效果。(可参考我以前逆过的一个驱动: 逆向fuck.sys--编译通过--源码 ) (2) 内核Patch [url=file://KnownDLLs/Kernel32.dll]\\KnownDLLs\\Kernel32.dll[/url] CreateThread [url=file://KnownDLLs/]\\KnownDLLs[

SetWindowsHookEx的用法

馋奶兔 提交于 2020-03-01 02:46:21
HOOK钩子详细介绍 基本概念 钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监 视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理 window消息或特定事件。 钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有 到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强 制结束消息的传递。 运行机制 1、钩子链表和钩子子程: 每一个Hook都有一个与之相关联的指针列表,称之为钩子链表,由系统来维护。这个列表的指针 指向指定的,应用程 序定义的,被Hook子程调用的回调函数,也就是该钩子的各个处理子程。当与指定的Hook类型关联的消息发生时,系统就把这个消息传递到Hook子程。 一些Hook子程可以只监视消息,或者修改消息,或者停止消息的前进,避免这些消息传递到下一个Hook子程或者目的窗口。最近安装的钩子放在链的开始, 而最早安装的钩子放在最后,也就是后加入的先获得控制权。 Windows 并不要求钩子子程的卸载顺序一定得和安装顺序相反。每当有一个钩子被卸载,Windows 便释放其占用的内存,并更新整个Hook链表

Dll注入技术之消息钩子

扶醉桌前 提交于 2020-02-27 04:00:23
DLL注入技术之消息钩子注入 消息钩子注入原理是利用Windows 系统中SetWindowsHookEx()这个API,他可以拦截目标进程的消息到指定的DLL中导出的函数,利用这个特性,我们可以将DLL注入到指定进程中。主要流程如下图所示 1.准备阶段 需要编写一个DLL,并且显式导出MyMessageProc()函数,主要代码如下: LRESULT WINAPI MyMessageProc( int code, WPARAM wParam, LPARAM lParam) { return CallNextHookEx(NULL, code, wParam, lParam); } 显示导出某个函数需要在.def文件中的EXPORTS填写MyMessageProc(),如下图所示: 2 .HOOK阶段 使用SetWindowsHookEx()之前首先需要将HOOK的DLL 加载到本身的进程中,以此得到DLL的模块句柄,再使用GetProcAddress()得到DLL中显示导出的函数MyMessageProc()的函数地址,最后遍历出待注入进程的线程ID,这样SetWindowsHookEx()就可以利用这些参数进行HOOK了。主要代码如下图所示: //加载DLL到本身进程 hMod = LoadLibrary(pDllName); if (!hMod) return FALSE;

注入 - 远线程注入DLL到目标进程

这一生的挚爱 提交于 2020-02-27 03:21:23
// // 函数 -- void InjectDLL(LPCTSTR) // // 功能 -- 注入DLL到指定窗口 // // @param -- 要注入的DLL全路径 // // 返回值 -- 无 // void InjectDLL(LPCTSTR lpDLLFullPath) { DWORD dwPID = 0; // 目标进程PID HANDLE hGameProcess = NULL; // 目标进程句柄 LPDWORD lpdwAddr = NULL; // 远程申请的内存空间地址 DWORD dwWriteByteSize = 0; // 写入的字节数 HANDLE hRemoteThread = NULL; // 远程线程句柄 // 1. 获取窗口句柄 HWND hGameWnd = ::FindWindow(GAME_CLASS_NAME, NULL); if (hGameWnd) { // 2. 通过窗口句柄, 获取窗口PID GetWindowThreadProcessId(hGameWnd, &dwPID); if (dwPID) { // 3. 通过窗口PID, 获取游戏进程句柄 hGameProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID); if (hGameProcess) { // 4.

Dll注入:Windows消息钩子注入

北城余情 提交于 2020-02-26 23:01:48
SetWindowsHook() 是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。 钩子机制允许应用程序截获处理window消息或特定事件。 HHOOK WINAPI SetWindowsHookEx( __in int idHook, \\钩子类型 __in HOOKPROC lpfn, \\回调函数地址 __in HINSTANCE hMod, \\实例句柄 __in DWORD dwThreadId); \\线程ID 使用API函数SetWindowsHookEx()把一个应用程序定义的钩子子程安装到钩子 链表 中。 SetWindowsHookEx函数总是在Hook链的开头安装Hook子程。当指定类型的Hook监视的事件发生时,系统就调用与这个Hook关联的 Hook链的开头的Hook子程。每一个Hook链中的Hook子程都决定是否把这个事件传递到下一个Hook子程。Hook子程传递事件到下一个 Hook子程需要调用CallNextHookEx函数。 系统钩子 SetWindowsHookEx()函数的最后一个参数决定了此钩子是 系统钩子 还是线程钩子。 线程钩子 线程勾子用于监视指定线程的事件消息。线程勾子一般在当前线程或者当前线程派生的线程内。

Dll注入:Ring3 层 APC注入

£可爱£侵袭症+ 提交于 2020-02-26 14:04:50
APC,即Asynchronous procedure call,异步程序调用 APC注入的原理是: 在一个进程中,当一个执行到SleepEx()或者WaitForSingleObjectEx()时,系统就会产生一个软中断,当线程再次被唤醒时,此线程会首先执行APC队列中的被注册的函数,利用QueueUserAPC()这个API,并以此去执行我们的DLL加载代码,进而完成DLL注入的目的, 注入流程: 1.根据进程名称得进程ID 2.枚举该进程中的线程 3.将自己的函数插入到每个线程的APC队列中 #include "stdafx.h" #include <windows.h> #include <Tlhelp32.h> #include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; typedef struct _THREADLIST { DWORD dwThreadId; _THREADLIST *pNext; }THREADLIST; int q = 0; DWORD GetProcessID(const char *szProcessName); int EnumThreadID(DWORD dwPID, THREADLIST * pdwTidList); THREADLIST*

dll注入

假装没事ソ 提交于 2020-02-26 13:33:27
所谓DLL注入就是将一个DLL放进某个进程的地址空间里,让它成为那个进程的一部分。要实现DLL注入,首先需要打开目标进程。 例: hRemoteProcess = OpenProcess( PROCESS_CREATE_THREAD | //允许远程创建线程   PROCESS_VM_OPERATION | //允许远程VM操 [1] 作   PROCESS_VM_WRITE, //允许远程VM写   FALSE, dwRemoteProcessId )   由于我们后面需要写入远程进程的内存地址空间并建立远程线程,所以需要申请足够的权限(PROCESS_CREATE_THREAD、VM_OPERATION、VM_WRITE)。   如果进程打不开,以后的操作就别想了。进程打开后,就可以建立远线程了,不过别急,先想想这个远线程的线程函数是什么?我们的目的是注入一个DLL。而且我们知道用LoadLibrary可以加载一个DLL到本进程的地址空间。于是,自然会想到如果可以在目标进程中调用LoadLibrary,不就可以把DLL加载到目标进程的地址空间了吗?对!就是这样。远线程就在这儿用了一次,建立的远线程的线程函数就是LoadLibrary,而参数就是要注入的DLL的文件名。(这里需要自己想一想,注意到了吗,线程函数ThreadProc和LoadLibrary函数非常相似,返回值

DLL注入模板

烈酒焚心 提交于 2020-02-26 13:31:35
// Injector.cpp文件. // #include <windows.h> #include <tlhelp32.h> //----------------------------------------------------------------------------------------- // 在进程空间注入的DLL. BOOL WINAPI LoadLib(DWORD dwProcessId, LPTSTR lpszLibName) { BOOL bResult = FALSE; HANDLE hProcess = NULL; HANDLE hThread = NULL; PSTR pszLibFileRemote = NULL; __try { // 获得想要注入代码的进程的句柄. hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, dwProcessId ); if (hProcess == NULL) __leave; // 计算DLL路径名需要的字节数. int cch = 1 + strlen(lpszLibName); // 在远程线程中为路径名分配空间. pszLibFileRemote = (PSTR)VirtualAllocEx( hProcess, NULL, cch, MEM

Dll注入技术之远程线程注入

偶尔善良 提交于 2020-02-26 13:22:50
DLL注入技术之远线程注入 DLL注入技术指的是将一个DLL文件强行加载到EXE文件中,并成为EXE文件中的一部分,这样做的目的在于方便我们通过这个DLL读写EXE文件内存数据,(例如 HOOK EXE文件中的API),或以被注入EXE的身份去执行一些操作等等。 远线程注入原理是利用Windows 系统中CreateRemoteThread()这个API,其中第4个参数是准备运行的线程,我们可以将LoadLibrary()填入其中,这样就可以执行远程进程中的LoadLibrary()函数,进而将我们自己准备的DLL加载到远程进程空间中执行。 当然除了CreateRemoteThread()和LoadLibrary()这个两个主要的API还是远远不够的,我们还需要以下表格所示的API: OpenProcess 打开远程进程 VirtualAllocEx 在远程进程中申请空间 WriteProcessMemory 在远程进程中写入数据 WaitForSingleObject 等待信号量 VirtualFreeEx 释放远程进程中申请空间 CloseHandle 关闭句柄 主要代码如下: int CRemoteThreadInjectDLL::InjectDll( DWORD dwProcessId, PTCHAR szDllName) { if (szDllName[0] ==