|
废话不多说,代码如下:
#include <ntddk.h> #include <ntifs.h> #include <windef.h> ULONG g_KiInsertQueueApc; ULONG g_uCr0; BYTE g_HookCode[5] = { 0xe9, 0, 0, 0, 0 }; BYTE g_OrigCode[5] = { 0 }; // Ôº¯ÊýµÄǰ×Ö½ÚÄÚÈÝ BYTE jmp_orig_code[7] = { 0xEA, 0, 0, 0, 0, 0x08, 0x00 }; //ÒòΪÊdz¤×ªÒÆ£¬ËùÒÔÓиö 0x08 BOOL g_bHooked = FALSE; VOID fake_KiInsertQueueApc ( PKAPC Apc, KPRIORITY Increment ); VOID Proxy_KiInsertQueueApc ( PKAPC Apc, KPRIORITY Increment ); void WPOFF() { ULONG uAttr; _asm { push eax; mov eax, cr0; mov uAttr, eax; and eax, 0FFFEFFFFh; // CR0 16 BIT = 0 mov cr0, eax; pop eax; cli }; g_uCr0 = uAttr; //±£´æÔÓÐµÄ CRO ŒÙÐÔ } VOID WPON() { _asm { sti push eax; mov eax, g_uCr0; //»ÖÍÔÓÐ CR0 ŒÙÐÔ mov cr0, eax; pop eax; }; } // // Í£Ö¹inline hook // VOID UnHookKiInsertQueueApc () { KIRQL oldIrql; WPOFF(); oldIrql = KeRaiseIrqlToDpcLevel(); RtlCopyMemory ( (BYTE*)g_KiInsertQueueApc, g_OrigCode, 5 ); KeLowerIrql(oldIrql); WPON(); g_bHooked = FALSE; } // // ¿ªÊ¼inline hook -- KiInsertQueueApc // VOID HookKiInsertQueueApc () { KIRQL oldIrql; if (g_KiInsertQueueApc == 0) { DbgPrint("KiInsertQueueApc == NULL/n"); return; } //DbgPrint("¿ªÊ¼inline hook -- KiInsertQueueApc/n"); DbgPrint( "KiInsertQueueApcµÄµØÖ·t0x%08x/n", (ULONG)g_KiInsertQueueApc ); // ±£´æÔº¯ÊýµÄǰ×Ö½ÚÄÚÈÝ RtlCopyMemory (g_OrigCode, (BYTE*)g_KiInsertQueueApc, 5);//¡ï *( (ULONG*)(g_HookCode + 1) ) = (ULONG)fake_KiInsertQueueApc - (ULONG)g_KiInsertQueueApc - 5;//¡ï // ½ûֹϵͳд±£»¤£¬ÌáÉýIRQLµ½DPC WPOFF(); oldIrql = KeRaiseIrqlToDpcLevel(); RtlCopyMemory ( (BYTE*)g_KiInsertQueueApc, g_HookCode, 5 ); *( (ULONG*)(jmp_orig_code + 1) ) = (ULONG) ( (BYTE*)g_KiInsertQueueApc + 5 );//¡ï RtlCopyMemory ( (BYTE*)Proxy_KiInsertQueueApc, g_OrigCode, 5);//ÐÞ¸ÄProxy_KiInsertQueueApcº¯ÊýÍ· RtlCopyMemory ( (BYTE*)Proxy_KiInsertQueueApc + 5, jmp_orig_code, 7); // »Ö¸´Ð´±£»¤£¬½µµÍIRQL KeLowerIrql(oldIrql); WPON(); g_bHooked = TRUE; } // // Ìø×ªµ½ÎÒÃǵĺ¯ÊýÀïÃæ½øÐÐÔ¤´¦Àí // __declspec (naked) VOID fake_KiInsertQueueApc ( PKAPC Apc, KPRIORITY Increment ) { // È¥µôDbgPrint,²»È»Õâ¸öhook»á²úÉúµÝ¹é //DbgPrint("inline hook -- KiInsertQueueApc ³É¹¦/n"); __asm { jmp Proxy_KiInsertQueueApc //¡ïÔÚÕâһϵÁÐJMPÖУ¬Ã»ÓÐÒ»´¦Ê¹ÓÃCALL£¬¼ò»¯ÁË´úÂ룬ÔöÇ¿ÁËÎȶ¨ÐÔ } } // // ´úÀíº¯Êý£¬¸ºÔðÌø×ªµ½Ôº¯ÊýÖмÌÐøÖ´ÐÐ // __declspec (naked) VOID Proxy_KiInsertQueueApc ( PKAPC Apc, KPRIORITY Increment ) { __asm { // ¹²×Ö½Ú _emit 0x90 _emit 0x90 _emit 0x90 _emit 0x90 _emit 0x90 // ǰ×Ö½ÚʵÏÖÔº¯ÊýµÄÍ·×Ö½Ú¹¦ÄÜ _emit 0x90 // Õâ¸öÌî³äjmp _emit 0x90 _emit 0x90 _emit 0x90 _emit 0x90 // Õâ×Ö½Ú±£´æÔº¯Êý+5´¦µÄµØÖ· _emit 0x90 _emit 0x90 // ÒòΪÊdz¤×ªÒÆ,ËùÒÔ±ØÐëÊÇ0x0080 } } ULONG GetFunctionAddr( IN PCWSTR FunctionName) { UNICODE_STRING UniCodeFunctionName; RtlInitUnicodeString( &UniCodeFunctionName, FunctionName ); return (ULONG)MmGetSystemRoutineAddress( &UniCodeFunctionName ); } //¸ù¾ÝÌØÕ÷Öµ£¬´ÓKeInsertQueueApcËÑË÷ÖÐËÑË÷KiInsertQueueApc ULONG FindKiInsertQueueApcAddress() { char * Addr_KeInsertQueueApc = 0; int i = 0; char Findcode[] = { 0xE8, 0xcc, 0x29, 0x00, 0x00 }; ULONG Addr_KiInsertQueueApc = 0; Addr_KeInsertQueueApc = (char *) GetFunctionAddr(L"KeInsertQueueApc"); for(i = 0; i < 100; i ++) { if( Addr_KeInsertQueueApc[i] == Findcode[0] && Addr_KeInsertQueueApc[i + 1] == Findcode[1] && Addr_KeInsertQueueApc[i + 2] == Findcode[2] && Addr_KeInsertQueueApc[i + 3] == Findcode[3] && Addr_KeInsertQueueApc[i + 4] == Findcode[4] ) { Addr_KiInsertQueueApc = (ULONG)&Addr_KeInsertQueueApc[i] + 0x29cc + 5; break; } } return Addr_KiInsertQueueApc; } VOID OnUnload( IN PDRIVER_OBJECT DriverObject ) { DbgPrint("My Driver Unloaded!"); UnHookKiInsertQueueApc(); } NTSTATUS DriverEntry( IN PDRIVER_OBJECT theDriverObject, IN PUNICODE_STRING theRegistryPath ) { DbgPrint("My Driver Loaded!"); theDriverObject->DriverUnload = OnUnload; g_KiInsertQueueApc = FindKiInsertQueueApcAddress(); HookKiInsertQueueApc(); return STATUS_SUCCESS; } //完毕 |
相关推荐
内存注入之IAT Hook和Inline Hook综合程序
内存注入综合程序 1) 进程列表获取 2) IAT表项获取 3) IAT Hook 4) Inline Hook
InlineHook基础代码
//#include "stdafx.h"; #include <iostream>; using namespace std; #include <windows.h>; #include <tlhelp32.h>; #include <tchar.h>; #include<stdio.h>; DWORD WINAPI MyThreadProc2( LPVOID pParam ); DWORD WINAPI MyThreadProc1(.
普及X64 ssdtshadow inline HOOK
序: 我只想说~~再不发帖老大就 不搭理我了~~~ 原因:玩保护玩到了 XINGCODE3 就他的各种检测就让我不得不重视这个问题了:o: 各种窗口 各种X 我的工具 让我忍无可忍,就决定先HOOK了在说其他 最开始我用TA 的代码里面的 HOOK 方法 在 挂钩 NT 内核中的函数算是无往不利 在SHADOWSSDT中就蛋疼菊花紧了~~ 于是 开始自己搞:mad::mad:
inline hook的实现
思路 对于目标运行中的EXE程序,如notepad.exe,使用inline hook劫持其kernel32.dll中的writefile函数: 找到notepad.exe的进程PID,通过进程PID获取进程模块,通过进程模块获取程序加载的imagebase。 在获得imagebase后,就可以像类似分析PE文件一样,先找PE头,然后到可选头,里面读取data directory的第2个成员...
API hook原理和实例快速入门(inline hook),以dll线程注入方式使用(win7-64bit)
一个完整的hook,如果hook程序是以dll形式生成的,是分两步:1.完成dll本身的设计和生成,2.完成dll注入程序的设计和生成 本文完成第一步。 第二步在http://blog.youkuaiyun.com/arvon2012/article/details/7767437有详细讲解。 最近在64位win7上hook文件复制,拖拽和剪切的hook(这个要通过hook IFileOperat
C# inline-hook / api-hook
我查阅了一下相关C#方面的资料,却没有发现有提供过关于api-hook方面的资 料包括应用库由此本人编写一套inline-hook的库用于支持x64、x86上的基于在 clr的公共语言,如: c#、c+/clr、vb.net 全部都可以使用该类库改变底层api执 行结果,如我们需要制作抓包工具,或者拦截某个ActiveX对象内部调用的函数 用处广泛 有些人在制作“截包”工具时是通过使用S
inlinehook 看这一篇
inlinehook 代码实战
WIN32 Inline HOOK
Inline hook 和CE里面的代码注入很像(应该是一个东西),这个技术的原理是,修改汇编指令,让某个指令跳转到我们定义的函数,然后在函数内完成被替换的指令,然后再跳转回去。在我们定义的函数内,我们可以实时获取寄存器的值,从而可以完成对函数行为的监视和修改。 在我们定义的函数内,需要注意,寄存器的值和堆栈状态,执行前后必须完全一致,否则程序会出错。为了实现这个目的,我们需要用到裸函数。 下面是代码,要注意代码中使用的地址仅在我的机器上有效,如果你要编译这个程序,第一次运行会失败,请根据生成的汇编代码,找
一份非常棒的inline hook代码
#include #include #include ULONG g_KiInsertQueueApc;ULONG g_uCr0; BYTE g_HookCode[5] = { 0xe9, 0, 0, 0, 0 };BYTE g_OrigCode[5] = { 0 }; // Ôº¯&E ...#include #include #include U
C++ Windows实现64/32位InlineHook(x86平台)
C++实现64/32位InlineHook。
完美支持64&32位InlineHook,C语言,C++类 都有
Windows 64位和32位Inline Hook的例子。包括C语言代码,和封装好的C++类,绝对超值,超简单实用的例子,可以直接运行,用了绝对说好!
如何写一个Android inline hook框架
Android_Inline_Hook https://github.com/GToad/Android_Inline_Hook_ARM64 有32和64的实现,但是是分离的,要用的话还要自己把两份代码合并在一起。 缺点: 1、不支持函数替换(即hook后不执行原函数),现在只能修改参数寄存器,无法修改返回值。 2、不支持定义同类型的hook函数来接受处理参数,只能通过修改寄存器的方式修改参数。 ...
HOOK技术之InLineHOOK源代码
InLineHOOK技术,通过读写进程内存的技术实现在指令层面上的HOOK技术,比较常用的HOOK技术。
Android Natvie Hook讲解、 got表hook、inline hook 原理
Android Natvie Hook 讲解什么是Hook,以及Android Native层 hook名词解释以及知识储备处理器架构欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 什么是
内存注入(IAT Hook 和Inline Hook)
本压缩包有我自己写的内存注入程序与测试程序,并附有相应的源码..会用MessageBox 去Hook 指定的函数
inline hook 源码
inline hook实现,支持 x86 and x64, linux and window各个版本
稳定多线程中的inline hook
优化inline hook 实验平台:WIN10 实验工具:VS2017,OD 我所说的是windows下的inline hook,总所周知inline hook是windows平台下很灵活好用的一种hook方式, 但inline hook是非线程稳定的,也就是说在多线程的程序中,频繁的进行inline hook有可能会导致程序崩溃,不稳定。 之前在为了解决这个问题,只找到了Hook七个字节的...
Python数据分析案例——宏观经济指标与沪深指数实证研究分析
沪深300指数与宏观经济指标关联性研究:2015-2024实证分析 摘要:本文基于2015-2024年月度数据,采用多元回归方法分析宏观经济指标对沪深300指数的影响。研究发现,市场情绪(SEN)、美国利率(STY)、美元指数(DXY)、狭义货币供应量(M1)和CPI对指数具有显著解释力(P<0.05),而GDP、LPR等传统指标影响不显著。模型解释力达62%(R²=0.62),表明A股短期走势更受资金流动、投资者心理和国际金融条件驱动。研究为投资者提供了除基本面外的市场预判指标,建议关注M1增速、美
8615



被折叠的 条评论
为什么被折叠?



