利用DLL劫持内存补丁技术注入

当一个可执行文件运行时,Windows加载器将可执行模块映射到进程的地址空间中,加载器分析可执行模块的输入表,并设法找出任何需要的DLL,并将它们映射到进程的地址空间中。由于输入表中只包含DLL名而没有它的路径名,因此加载程序必须在磁盘上搜索DLL文件。首先会尝试从当前程序所在的目录加载DLL,如果没找到,则在Windows系统目录查找,最后是在环境变量中列出的各个目录下查找。利用这个特点,先伪造一个系统同名的DLL,提供同样的输出表,每个输出函数转向真正的系统DLL。程序调用系统DLL时会先调用当前目录下伪造的DLL,完成相关功能后,再跳到系统DLL同名函数里执行。这个过程用个形象的词来描述就是系统DLL被劫持
(hijack)了。
示例DELPHI源码:

Library USP10; 

uses

Windows, 

SysUtils, 

Classes; 

{$R *.res}

ModHandle: Cardinal

POldLpkPresent: Pointer

POldScriptApplyDigitSubstitution: Pointer

POldScriptApplyLogicalWidth: Pointer

POldScriptBreak: Pointer

POldScriptCPtoX: Pointer

POldScriptCacheGetHeight: Pointer

POldScriptFreeCache: Pointer

POldScriptGetCMap: Pointer

POldScriptGetFontProperties: Pointer

POldScriptGetGlyphABCWidth: Pointer

POldScriptGetLogicalWidths: Pointer

POldScriptGetProperties: Pointer

POldScriptIsComplex: Pointer

POldScriptItemize: Pointer

POldScriptJustify: Pointer

POldScriptLayout: Pointer

POldScriptPlace: Pointer

POldScriptRecordDigitSubstitution: Pointer

POldScriptShape: Pointer

POldScriptStringAnalyse: Pointer

POldScriptStringCPtoX: Pointer

POldScriptStringFree: Pointer

POldScriptStringGetLogicalWidths: Pointer

POldScriptStringGetOrder: Pointer

POldScriptStringOut: Pointer

POldScriptStringValidate: Pointer

POldScriptStringXtoCP: Pointer

POldScriptString_pLogAttr: Pointer

POldScriptString_pSize: Pointer

POldScriptString_pcOutChars: Pointer

POldScriptTextOut: Pointer

POldScriptXtoCP: Pointer

POldUspAllocCache: Pointer

POldUspAllocTemp: Pointer

POldUspFreeMem: Pointer

procedure LpkPresent; asm jmp POldLpkPresent end

procedure ScriptApplyDigitSubstitution; asm jmp POldScriptApplyDigitSubstitution end

procedure ScriptApplyLogicalWidth; asm jmp POldScriptApplyLogicalWidth end

procedure ScriptBreak; asm jmp POldScriptBreak end

procedure ScriptCPtoX; asm jmp POldScriptCPtoX end

procedure ScriptCacheGetHeight; asm jmp POldScriptCacheGetHeight end

procedure ScriptFreeCache; asm jmp POldScriptFreeCache end

procedure ScriptGetCMap; asm jmp POldScriptGetCMap end

procedure ScriptGetFontProperties; asm jmp POldScriptGetFontProperties end

procedure ScriptGetGlyphABCWidth; asm jmp POldScriptGetGlyphABCWidth end

procedure ScriptGetLogicalWidths; asm jmp POldScriptGetLogicalWidths end

procedure ScriptGetProperties; asm jmp POldScriptGetProperties end

procedure ScriptIsComplex; asm jmp POldScriptIsComplex end

procedure ScriptItemize; asm jmp POldScriptItemize end

procedure ScriptJustify; asm jmp POldScriptJustify end

procedure ScriptLayout; asm jmp POldScriptLayout end

procedure ScriptPlace; asm jmp POldScriptPlace end

procedure ScriptRecordDigitSubstitution; asm jmp POldScriptRecordDigitSubstitution end

procedure ScriptShape; asm jmp POldScriptShape end

procedure ScriptStringAnalyse; asm jmp POldScriptStringAnalyse end

procedure ScriptStringCPtoX; asm jmp POldScriptStringCPtoX end

procedure ScriptStringFree; asm jmp POldScriptStringFree end

procedure ScriptStringGetLogicalWidths; asm jmp POldScriptStringGetLogicalWidths end

procedure ScriptStringGetOrder; asm jmp POldScriptStringGetOrder end

procedure ScriptStringOut; asm jmp POldScriptStringOut end

procedure ScriptStringValidate; asm jmp POldScriptStringValidate end

procedure ScriptStringXtoCP; asm jmp POldScriptStringXtoCP end

procedure ScriptString_pLogAttr; asm jmp POldScriptString_pLogAttr end

procedure ScriptString_pSize; asm jmp POldScriptString_pSize end

procedure ScriptString_pcOutChars; asm jmp POldScriptString_pcOutChars end

procedure ScriptTextOut; asm jmp POldScriptTextOut end

procedure ScriptXtoCP; asm jmp POldScriptXtoCP end

procedure UspAllocCache; asm jmp POldUspAllocCache end

procedure UspAllocTemp; asm jmp POldUspAllocTemp end

procedure UspFreeMem; asm jmp POldUspFreeMem end

exports

LpkPresent, 

ScriptApplyDigitSubstitution, 

ScriptApplyLogicalWidth, 

ScriptBreak, 

ScriptCPtoX, 

ScriptCacheGetHeight, 

ScriptFreeCache, 

ScriptGetCMap, 

ScriptGetFontProperties, 

ScriptGetGlyphABCWidth, 

ScriptGetLogicalWidths, 

ScriptGetProperties, 

ScriptIsComplex, 

ScriptItemize, 

ScriptJustify, 

ScriptLayout, 

ScriptPlace, 

ScriptRecordDigitSubstitution, 

ScriptShape, 

ScriptStringAnalyse, 

ScriptStringCPtoX, 

ScriptStringFree, 

ScriptStringGetLogicalWidths, 

ScriptStringGetOrder, 

ScriptStringOut, 

ScriptStringValidate, 

ScriptStringXtoCP, 

ScriptString_pLogAttr, 

ScriptString_pSize, 

ScriptString_pcOutChars, 

ScriptTextOut, 

ScriptXtoCP, 

UspAllocCache, 

UspAllocTemp, 

UspFreeMem; 

begin

ModHandle:= LoadLibrary(‘C:\WINDOWS\system32\usp10.dll‘); 

if ModHandle > 0 then

begin

   POldLpkPresent:= GetProcAddress(ModHandle, ‘LpkPresent‘); 

   POldScriptApplyDigitSubstitution:= GetProcAddress(ModHandle,‘ScriptApplyDigitSubstitution‘); 

   POldScriptApplyLogicalWidth:= GetProcAddress(ModHandle,‘ScriptApplyLogicalWidth‘); 

   POldScriptBreak:= GetProcAddress(ModHandle, ‘ScriptBreak‘); 

   POldScriptCPtoX:= GetProcAddress(ModHandle, ‘ScriptCPtoX‘); 

   POldScriptCacheGetHeight:= GetProcAddress(ModHandle, ‘ScriptCacheGetHeight‘); 

   POldScriptFreeCache:= GetProcAddress(ModHandle, ‘ScriptFreeCache‘); 

   POldScriptGetCMap:= GetProcAddress(ModHandle, ‘ScriptGetCMap‘); 

   POldScriptGetFontProperties:= GetProcAddress(ModHandle,‘ScriptGetFontProperties‘); 

   POldScriptGetGlyphABCWidth:= GetProcAddress(ModHandle, ‘ScriptGetGlyphABCWidth‘); 

   POldScriptGetLogicalWidths:= GetProcAddress(ModHandle, ‘ScriptGetLogicalWidths‘); 

   POldScriptGetProperties:= GetProcAddress(ModHandle, ‘ScriptGetProperties‘); 

   POldScriptIsComplex:= GetProcAddress(ModHandle, ‘ScriptIsComplex‘); 

   POldScriptItemize:= GetProcAddress(ModHandle, ‘ScriptItemize‘); 

   POldScriptJustify:= GetProcAddress(ModHandle, ‘ScriptJustify‘); 

   POldScriptLayout:= GetProcAddress(ModHandle, ‘ScriptLayout‘); 

   POldScriptPlace:= GetProcAddress(ModHandle, ‘ScriptPlace‘); 

   POldScriptRecordDigitSubstitution:= GetProcAddress(ModHandle,‘ScriptRecordDigitSubstitution‘); 

   POldScriptShape:= GetProcAddress(ModHandle, ‘ScriptShape‘); 

   POldScriptStringAnalyse:= GetProcAddress(ModHandle, ‘ScriptStringAnalyse‘); 

   POldScriptStringCPtoX:= GetProcAddress(ModHandle, ‘ScriptStringCPtoX‘); 

   POldScriptStringFree:= GetProcAddress(ModHandle, ‘ScriptStringFree‘); 

   POldScriptStringGetLogicalWidths:= GetProcAddress(ModHandle,‘ScriptStringGetLogicalWidths‘); 

   POldScriptStringGetOrder:= GetProcAddress(ModHandle, ‘ScriptStringGetOrder‘); 

   POldScriptStringOut:= GetProcAddress(ModHandle, ‘ScriptStringOut‘); 

   POldScriptStringValidate:= GetProcAddress(ModHandle, ‘ScriptStringValidate‘); 

   POldScriptStringXtoCP:= GetProcAddress(ModHandle, ‘ScriptStringXtoCP‘); 

   POldScriptString_pLogAttr:= GetProcAddress(ModHandle, ‘ScriptString_pLogAttr‘); 

   POldScriptString_pSize:= GetProcAddress(ModHandle, ‘ScriptString_pSize‘); 

   POldScriptString_pcOutChars:= GetProcAddress(ModHandle,‘ScriptString_pcOutChars‘); 

   POldScriptTextOut:= GetProcAddress(ModHandle, ‘ScriptTextOut‘); 

   POldScriptXtoCP:= GetProcAddress(ModHandle, ‘ScriptXtoCP‘); 

   POldUspAllocCache:= GetProcAddress(ModHandle, ‘UspAllocCache‘); 

   POldUspAllocTemp:= GetProcAddress(ModHandle, ‘UspAllocTemp‘); 

   POldUspFreeMem:= GetProcAddress(ModHandle, ‘UspFreeMem‘); 

end

begin

//添加自己的补丁内容!

end

end.

原文地址:https://www.cnblogs.com/plug/p/8665616.html

时间: 2024-08-07 09:46:04

利用DLL劫持内存补丁技术注入的相关文章

进程间通信 - 动态链接库中共享内存(利用DLL的2~3G的地址段空间)

前言 进程是装入内存并准备执行的程序,每个进程都有私有的虚拟地址空间,由代码.数据,以及其他的一些资源组成.32位系统的进程分配4G的虚拟地址空间.内存地址范围是0x00000000-0xFFFFFFFF.这个内存地址空间是每个进程独立的,也就是说,在一个进程中是不能访问其他进程的地址空间的. 举个例子,进程A的内存里保存了一个数据,假设这个数据的地址是0x33333333.这个是时候,即使把进程B的内存地址是0x33333333的数据读出来.这个数据也和进程A里同地址的数据是不一样的.甚至进程

dll劫持技术探索

0x1:实验背景 看到国外一篇文章,大致描述如下: Hi, There are a dll planting vuln in skype installer. This vuln had been reported to Microsoft but they decided not fix this. Here is the vulnerability details: ------ Skype installer in Windows is open to DLL hijacking. Sky

DLL劫持技术例子: HijackDll

控制台程序:DllLoader Dll加载器,用于动态加载目标Dll,并动态调用目标函数 1 #include <cstdio> 2 #include <windows.h> 3 4 typedef int (*pAdd) (int a, int b); 5 6 int main() 7 { 8 HMODULE hModule = GetModuleHandleA("Dll.dll") != NULL ? GetModuleHandleA("Dll.d

Dll劫持漏洞详解

  一.dll的定义 DLL(Dynamic Link Library)文件为动态链接库文件,又称"应用程序拓展",是软件文件类型.在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中.当我们执行某一个程序时,相应的DLL文件就会被调用.一个应用程序可使用多个DLL文件,一个DLL文件也可能被不同的应用程序使用,这样的DLL文件被称为共享DLL文件. 如果在进程尝试加载一个DLL时没有指定DLL的绝对路径,那么Wi

阿里资深工程师分享支付宝热补丁技术—— AndFix原理

本文由嵌入式企鹅圈原创团队成员.阿里资深工程师Hao分享. 上次我们介绍了用dexposed方案实施热补丁的原理,它本质上就是hook要修改的函数,这样一来在正式版本发布时就不能直接拿热补丁的代码集成进去了,因为热补丁是按hook的思路,并且按照实现XC_MethodReplacement类的方式写的,正式的补丁还需要重新包装一边.更重要的是dexposed对art的支持并不好,大大限制了它的使用范围. 今天我们介绍的是AndFix方案:https://github.com/alibaba/An

c++跨动态库DLL的内存分配与释放问题

先说结论: 1.如果两个DLL(或者EXE调用DLL)的CRT链接均为MD,则可以跨动态库分配和释放,如果一个是MT,另外一个是MD则会有问题. 2.利用虚函数的动态绑定技术,动态绑定分配释放内存的new和delete等,可以解决这个问题,例如shared_ptr.但如果shared_ptr包装是vector等类型,在调用和被调用中都涉及到vector的修改的话,仍然会有问题,因为两个地方都会有释放和分配. 似乎最好的办法还是用原始指针加数组长度的方式传递. 参见下面两个文章. 1.跨DLL的内

数据库虚拟补丁技术研究 &nbsp; &nbsp; &nbsp;

虚拟补丁技术是通过控制所保护系统的输入输出,防止对系统的漏洞攻击行为的技术. 虚拟补丁技术通过外围的方式,针对系统漏洞攻击的特征进行攻击行为发现和拦截的安全防御手段.它使漏洞防御的实施更为轻便,更加及时.虚拟补丁技术较早使用在web应用系统上,数据库的虚拟补丁是近几年最新提出的防御技术,较早提出的是Mcaffee,国内数据库安全厂商安华金和也是这方面的佼佼者. 数据库漏洞分类及成因 美国Verizon就"核心数据是如何丢失的"做过一次全面的市场调查,结果发现,75%的数据丢失情况是由于

lpk.dll 劫持木马

前言 小菜最近开始做样本分析,第一次遇到dll劫持样本,所以这里写一个分析,一是方便监督自己学习,二是 0x01.dll劫持原理 由于输入表中只包含DLL名而没有它的路径名,因此加载程序必须在磁盘上搜索DLL文件.首先会尝试从当前程序所在的目录加载DLL,如果没找到,则在Windows系统目录中查找,最后是在环境变量中列出的各个目录下查找.利用这个特点,先伪造一个系统同名的DLL,提供同样的输出表,每个输出函数转向真正的系统DLL.程序调用系统DLL时会先调用当前目录下伪造的DLL,完成相关功能

C语言/C+游戏编程学习之简单 DLL 劫持,就是这么任性

C语言面向过程编程的语言:C++面向对象编程的语言. 两者有本质的区别,其实是完全不同的两种语言,只不过C++兼容C语言而已. 其中C++则一般看作是对C语言的扩展.因为C语言没有面向对象的语法结构,而当时业界又迫切需要面向对象的编程特性,所以贝尔实验室的开发者就为C语言添加了面向对象的结构.现在C++已经不只是C语言的扩展了,它已经完全可以被看作一种新的编程语言.虽然C语言的特性以及库函数仍然被C++支持,不过C++拥有自己的独立的类库体系,功能相当强大. C/C++的优点在于与底层比较接近,