转:DLL注入大法—之HOOK注入

version.dll劫持注入模版 // dllmain.cpp : 定义 DLL 应用程序的入口点。 #include "stdafx.h" BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: { 阅读详情
我原来写过有关HOOK的介绍,如果你看过了或者是以前写过HOOK程序,那么你已经会这种DLL注入了。它其它就是为系统或某个线程安装一个钩子。这里要说的是,如果是全局钩子,那么你的DLL将会在进程调用时载入到任意一个调用的进程的地址空间中,这样是相当浪费资源的。因此我在下载的演示中就只对某一个指定的线程安装线程钩子。

  1、用BCB建立一个DLL工程(如果你用的是VC或其它,请自己对照),输入以下代码:

//===========================================================================

// 文件: UnitLib.cpp

// 说明: 演示利用钩子技术进行DLL注入.

// 将本DLL中的代码注入到指定的进程空间.

// 作者: 陶冶(无邪)

//===========================================================================


// 函数声明

extern "C" __declspec(dllexport) __stdcall

bool SetHook(DWORD dwThreadId);

extern "C" __declspec(dllexport) __stdcall

LRESULT CALLBACK MyProc(int nCode, WPARAM wParam, LPARAM lParam);


static HHOOK hHook = NULL; // 钩子句柄

static HINSTANCE hInst; // 当前DLL句柄


int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)

{

hInst = hinst;

return 1;

}

//---------------------------------------------------------------------------

// 安装钩子函数

bool __declspec(dllexport) __stdcall SetHook(DWORD dwThreadId)

{

if (dwThreadId != 0)

{

MessageBox(NULL, ("DLL已经注入!nThreadId = " +

IntToStr(dwThreadId)).c_str(),"DLL",

MB_ICONINFORMATION + MB_OK);

    // 安装指定线程的钩子

hHook = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)MyProc,

hInst,dwThreadId);

if (hHook != NULL)

return true;

}else

{

MessageBox(NULL, "DLL即将从记事本进程空间中撤出!","DLL",

MB_ICONINFORMATION + MB_OK);

return (UnhookWindowsHookEx(hHook));

}

return true;

}


// 钩子函数

LRESULT CALLBACK __declspec(dllexport) __stdcall

MyProc(int nCode, WPARAM wParam, LPARAM lParam)

{

  // 因为只是演示DLL注入,所以这里什么也不做,交给系统处理

return (CallNextHookEx(hHook, nCode, wParam, lParam));

}

//---------------------------------------------------------------------------


该DLL中有两个函数,一个为安装钩子函数(SetHook),另一个为钩子函数(MyProc)。其中安装钩子函数提供了一个参数,由该参数指定安装到哪个线程,如果该参数为0,则卸载钩子。

  编译该工程,即生成我们要用来注入到指定进程中的DLL文件了。

    

2、建立测试工程。用BCB建立一个应用程序工程,在窗体中添加两个按钮,一个用来安装线程钩子,一个用来卸载。代码如下:

//---------------------------------------------------------------------------

// SetHook函数原型声明

typedef BOOL (WINAPI *LPSETHOOK)(unsigned long dwThreadId);


//---------------------------------------------------------------------------

__fastcall TfrmMain::TfrmMain(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

// 安装钩子

void __fastcall TfrmMain::Button1Click(TObject *Sender)

{

String szPath;

LPSETHOOK lproc;

HANDLE hDll;

BOOL bRet;

PROCESS_INFORMATION info;

STARTUPINFO start;


memset(&start, 0, sizeof(start));

// 取得要载入的DLL文件名

szPath = Application->ExeName;

szPath = szPath.SubString(0, szPath.Length()

- String(StrRScan(szPath.c_str(),'/')).Length());

szPath = szPath + "/DllLib.dll";

  // 载入DLL

hDll = LoadLibrary(szPath.c_str());

if (hDll != NULL)

{

lproc = (LPSETHOOK)GetProcAddress(hDll,"SetHook");

if (lproc != NULL)

{

// 因为没有适当的工具可以取得线程ID,也为了简单起见,所以这里新创建了一个记事本进程,以便取得它的线程ID,对其安装钩子,把我们的DLL注入到记事本进程中。

bRet = CreateProcess(NULL,

"c:/winnt/system32/notepad.exe",

NULL,

NULL,

TRUE,

0,

NULL,

NULL,

&start,

&info);

if (bRet != 0)

{

if((*lproc)(info.dwThreadId) == false)

ShowMessage("Sethook failed with error " +

IntToStr(GetLastError()));

}

else

{

ShowMessage("CreateProcess failed with error " +

IntToStr(GetLastError()));

}

}

}

}

//---------------------------------------------------------------------------

// 卸载钩子

void __fastcall TfrmMain::Button2Click(TObject *Sender)

{

String szPath;

LPSETHOOK lproc;

HANDLE hDll;


szPath = Application->ExeName;

szPath = szPath.SubString(0, szPath.Length()

- String(StrRScan(szPath.c_str(),'/')).Length());

szPath = szPath + "/DllLib.dll";

hDll = LoadLibrary(szPath.c_str());

if (hDll != NULL)

{

lproc = (LPSETHOOK)GetProcAddress(hDll,"SetHook");

if (lproc != NULL)

(*lproc)(0);

}

}

//---------------------------------------------------------------------------

  接下来生成可执行文件,点击第一个安装钩子按钮,然后你就可以用我们最开始写的查看模块的工具来查看了,你将会在模块中看到你刚才DLL的路径及文件名,这表明我们已经成功地将自己的DLL注入到了记事本进程空间。点击卸载按钮后,再查看记事本进程中的模块,将不会看到我们DLL文件的完整文件名,这表明已经成功撤消了对记事本进程的注入。

 

DLL注入技术之消息钩子注入(HOOK简单的实现) 低头不是认输,是要看清自己的路。仰头不是骄傲,是看见自己的天空。——致自己 Hook,是Windows消息处理机制的一个平台,应用程序可以在上面设置子程序以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。简单来说,如下图所示(个人理解,如有错误请留言): 现在开始简单的编写一... 阅读详情

相关推荐

C# HOOK / DLL Inject(注入)

满屏幕都是“你好,你已被注入”是不是感到很好玩呢? HOOK注入不是一个新技术 但是呢 有时候你还真 需要求助它 虽然我一般注入不使用HOOK方式但它却是最简便的一个方式 下面我就来介绍一下代码吧 首先我们使用一个可以编写标准Win32 DLL的语言(C++/E/Delphi)等。 下面为C++的一个示例代码:        这里只是娱乐的说说它还没有真正的注入 但是你可以在这里编写自

8569

实现DLL的注入与卸载

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/wzxq123/article/details/514

[32/64]关于DLL注入与Hook(minihook)的简单介绍与使用

因为工作有时候用到,简单的介绍下相关的知识,都是很基础的,部分在网上收集整理。 0x01关于DLL注入 DLL注入技术的用途是很广泛的,这主要体现在: - 假如你要操纵的对象涉及的数据不在进程内; - 你想对目标进程中的函数进行拦截或者修改(API)。 - 你想编写一些函数用于增强或增加目标进程功能,比如可以给目标进程的某个窗口插入个消息循环增加其响应能力。(Mfc Windows程

chenzy945的记录 1万+

使用windows钩子(HOOK)实现DLL注入

本文章介绍如何使用HOOK技术实现DLL注入。通过一个测试程序,记录你的任何键盘输入信息,见识到HOOK技术的强大之处。

new9232的博客 1万+

注入系列:Hook注入

0x00 注入原理 Windows 中大部分的应用程序都是基于消息机制的,它们都有一个过程函数,根据不同的消息完成不同的功能。 Windows 操作系统提供的钩子机制就是用来截获和监视系统中这些消息的。 局部钩子是针对某个线程的 全局钩子则是作用于整个系统的基于消息的应用。 全局钩子需要使用 DLL 文件,在 DLL 中实现相应的钩子函数。 接下来,以实现全局hook注入为例。 0x01 注入...

weixin_43742894的博客 1570

Windows Dll注入与API HOOK

DLL注入: 1.      使用注册表注入dll HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersion\Windows\AppInit_DLLs AppInit_Dlls中设置待注入的dll绝对路径 LoadAppInit_Dlls值设为1 2.      使用Windows挂钩注入dll 需要使用SetWind

小黑话不多 3173

SetHook ,修改dll中的api函数

#include<Windows.h> #include <stdio.h> BOOL SetHook(HMODULE hMod); void ProcessNameList(HMODULE hMod); typedef int(WINAPI* NewMessageBox)(HWND, LPCSTR, LPCSTR, UINT); PROC g_proc = (PROC)MessageBoxA; //取messagebox的名称 void main() { Proces.

ellis993的博客 517

【软件逆向】如何在windows下远程注入dll并进行虚表hook

如何在windows下远程注入dll并进行虚表hook

zhangjiuding的博客 3080

【第38节】windows原理:DLL注入与Hook是什么

Hook 技术,中文叫钩子技术,本质上是在程序运行过程中,拦截特定事件或函数调用,改变其执行路径,插入自定义代码,来实现特定功能的一种编程技术。Hook在程序设计中是一种灵活多变的技术手段,它主要用于改变程序原有的执行流程,让程序执行开发者自己定义的代码。在Windows系统下,Hook有两种含义,一是系统提供的消息Hook机制,由一系列API提供服务,通过这些API可以对大多数应用程序的关键节点进行Hook操作,Windows会为每种Hook类型维护一个钩子链表;

攻城狮7号的博客 5204

使用Rust编写 Windows dll 并注入进第三方进程后对 Windows API MessageBoxW 进行 Hook

hook 方式 这里采用编译成 dll 后注入,这里有两点需要注意: 目标程序为 32/64 位 rust 编译工具链也需要对应 32/64 位 编译需要用 release 模式,防止注入编译器在 debug 下为了调试附加的数据 Cargo.toml 中需要说明将其编译为库且类型为动态的,如果编译时显示找不到编译目标则手动添加一行路径: [lib] crate-type = ["dylib"] path = "src/lib.rs" 当然你还可以通过创建远程线程来 hook,不过过程比较繁琐这里就提

kunyus的博客 8875

代码注入 API HOOK(非DLL)

使用代码注入来实现进程隐藏  而不是使用DLL注入来实现进程隐藏  没有什么高级技术  纯体力活  原理就不说了  只是没有通过DLL注入  来实现HOOK API从核心编程 以来  似乎 一提到C注入 就是DLL注入 很奇怪 为什么没人写个完整的代码注入所以 自己动手写了下纯粹注入代码   邪恶二进制上 也有个代码注入的 只是用了一个未公开的函数,我还看不懂= =本来想用汇编写的  发现汇编注入

dalixux的专栏 2194

通过Hook将DLL注入进程

1. 为什么需要dll注入? 如果一个进程的程序是我们自己编写的,我们可以在程序中隐式或者显式地加载需要的dll,不需要dll注入。但是,当一个进程的程序不是我们编写的,而我们又需要该程序加载指定的dll,以便进行某些操作,这是就需要dll注入。 我们知道,dll可以被多个进程加载,当一个进程加载dll时,dll被映射到该进程的地址空间。dll注入的最大目的,进入目标进程的地址空间,这样就可以操作目标进程中的对象了。 2. 通过Hook将dll注入进程 Hook技术是基于wi...

翻肚鱼儿的博客 2776

Rust实战:通过DLL注入与IAT Hook技术拦截Windows API调用

本文详细介绍了如何使用Rust语言实现Windows平台下的DLL注入与IAT Hook技术,以拦截并修改目标进程对特定API(如MessageBoxW)的调用。通过实战代码解析,阐述了Rust在系统编程中的内存安全优势、DLL入口点编写、IAT遍历与地址替换原理,以及远程线程注入的具体步骤,为开发者提供了一套安全、高效的API拦截解决方案。

ol789012345的博客 709

通过HOOK来注入DLL的一点心得!!!!!!

这段时间研究了一下注入技术,今天有空来写一下心得,以免以后忘记.用HOOK进行注入的思路主要如下:1.首先,写一个钩子,放在DLL中,然后,导出设置钩子的函数SetHook。2.在我的应用程序中,通过FindWindow来找出要注入的目标进程的ThreadId;3.在自己的程序中调用SetHook,传入ThreadId;4.在SetHook中设置目标进程的线程钩子,设置完成之后

jasonM2008的专栏 1万+

DLL系统注入与Hook技术实战教程

系统注入是一种高级技术,用于将代码或程序模块动态地集成到另一个运行中的进程。在安全性和功能扩展方面,DLL(动态链接库)注入尤为关键,因为DLL可以提供额外的代码,而无需对目标应用程序进行再编译。这种技术使得开发者能够在不改变现有程序的情况下,增强程序的功能。Windows API (WinAPI) 是一组由Microsoft提供的函数和宏,用于访问操作系统和应用程序提供的服务。在DLL注入的上下文中,WinAPI扮演着至关重要的角色。

weixin_42497762的博客 1435

深入理解DLL注入、输入法与键盘HOOK技术

本文还有配套的精品资源,点击获取 简介:本文深入探讨了Windows操作系统中DLL注入、输入法处理以及键盘HOOK技术的应用。DLL注入技术允许代码注入到其他进程,具有调试、监控和安全风险。键盘HOOK分为WH_KEYBOARD和WH_KEYBOARD_LL两种类型,前者线程局部,后者全局。输入法拦截和IME消息处理可用于自定义输入法或游戏外挂开发。DLL注入有时可利用I...

weixin_35757531的博客 2170

代码注入之Hook注入

介绍通过Hook实现代码注入的方法,具体给出了两种非代码Hook方式的具体实现,即Hook内核回调表和Hook IP寄存器,最后给出了检测这类Hook的建议。

leegh0000的博客 2150

version.dll 劫持源代码

version.dll 劫持源码,亲自实测可用。VC++可以编译成功

上一篇: 转:DLL注入大法—之CreateRemoteThread法
下一篇: 转:DLL注入大法—之利用特洛伊DLL进行注入
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值