利用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.
posted @ 2018-03-28 18:48  大龙软件工作室  阅读(2510)  评论(0)    收藏  举报