利用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 on 2010-10-18 22:16 Delphi7456 阅读(4285) 评论(0) 收藏 举报
浙公网安备 33010602011771号