0xAA55 发表于 2014-7-22 01:55:43

【DLL劫持】用NASM汇编语言实现32位dsound.dll的劫持

原理很简单。弄一个导出表和原dsound.dll一致的自定义DLL,里面的函数就都可以劫持了。
dsound.dll是使用DirectSound必不可少的DLL,通过使用它,游戏可以播放各种各样的音效。就比如《光环2》这个游戏,它就是使用DirectSound进行声音的播放的。
我觉得《光环2》的精英战士长得比较萌,而且声音也铿锵有力(虽然四个下颌让它们吐字不清)。通过劫持dsound.dll可以实现游戏音效的截取。
当然不能急,要一步一步来。写的函数名字和调用约定以及参数个数必须和原DLL完全一致,才能保证完全加载。
我这里给的源代码是自己写了个dsound.dll,然后它引用了原始的dsound.dll。做法就是用LoadLibrary加载原始DLL,调用原始的函数,然后对其进行处理。
先看ds.defLIBRARY
    EXPORTS
DirectSoundCreate               @1
DirectSoundEnumerateA         @2
DirectSoundEnumerateW         @3
DllCanUnloadNow               @4
DllGetClassObject               @5
DirectSoundCaptureCreate      @6
DirectSoundCaptureEnumerateA    @7
DirectSoundCaptureEnumerateW    @8
GetDeviceID                     @9
DirectSoundFullDuplexCreate   @10
DirectSoundCreate8            @11
DirectSoundCaptureCreate8       @12你会发现它和原始的dsound.dll一致。然后就是源码部分。因为是汇编写的所以代码略丑。;DllMain用到的常数
%define DLL_PROCESS_ATTACH 1
%define DLL_THREAD_ATTACH2
%define DLL_THREAD_DETACH3
%define DLL_PROCESS_DETACH 0

;要用到的函数
extern __imp__Beep@8
extern __imp__LoadLibraryA@4
extern __imp__GetProcAddress@8
extern __imp__FreeLibrary@4

;导出的函数
global _DllMain@12
global _DirectSoundCreate@12
global _DirectSoundEnumerateA@8
global _DirectSoundEnumerateW@8
global _DllCanUnloadNow@0
global _DllGetClassObject@12
global _DirectSoundCaptureCreate@12
global _DirectSoundCaptureEnumerateA@8
global _DirectSoundCaptureEnumerateW@8
global _GetDeviceID@8
global _DirectSoundFullDuplexCreate@40
global _DirectSoundCreate8@12
global _DirectSoundCaptureCreate8@12

;代码段
segment .text
;==============================================================================
;加载原始DLL的宏
;------------------------------------------------------------------------------
%macro LoadOrg 0
push OrgDllName;DLL路径字符串
call
mov ,eax;存储返回值
%endmacro

;==============================================================================
;调用原始函数的宏,参数是GetProcAddress的函数名那个参数。
;------------------------------------------------------------------------------
%macro CallOrg 1
push %1;函数名
push dword;DLL句柄
call ;取得函数地址
call eax;调用函数
%endmacro

;==============================================================================
;卸载原始DLL的宏
;------------------------------------------------------------------------------
%macro FreeOrg 0
push dword;DLL句柄
call
%endmacro

;==============================================================================
;发出蜂鸣的宏
;------------------------------------------------------------------------------
%macro Beep 2
push %2;时长
push %1;频率
call ;蜂鸣
%endmacro

;==============================================================================
;DllMain
;Dll的入口点
;------------------------------------------------------------------------------
_DllMain@12:
;判断是DLL加载还是DLL卸载
cmp dword,DLL_PROCESS_ATTACH
jz .ProcAttach
cmp dword,DLL_PROCESS_DETACH
jz .ProcDetach
jmp .EOFunc

;DLL卸载
.ProcDetach:
Beep 500,100;发出音高比较低的蜂鸣
jmp .EOFunc

;DLL加载
.ProcAttach:
Beep 1000,100;发出音高比较高的蜂鸣

.EOFunc:
mov eax,1
ret 12

;==============================================================================
;DirectSoundCreate
;------------------------------------------------------------------------------
_DirectSoundCreate@12:
LoadOrg
push dword
push dword
push dword
CallOrg dword 1
FreeOrg
ret 12

;==============================================================================
;DirectSoundEnumerateA
;------------------------------------------------------------------------------
_DirectSoundEnumerateA@8:
LoadOrg
push dword
push dword
CallOrg dword 2
FreeOrg
ret 8

;==============================================================================
;DirectSoundEnumerateW
;------------------------------------------------------------------------------
_DirectSoundEnumerateW@8:
LoadOrg
push dword
push dword
CallOrg dword 3
FreeOrg
ret 8

;==============================================================================
;DllCanUnloadNow
;------------------------------------------------------------------------------
_DllCanUnloadNow@0:
LoadOrg
CallOrg dword 4
FreeOrg
ret

;==============================================================================
;DllGetClassObject
;------------------------------------------------------------------------------
_DllGetClassObject@12:
LoadOrg
push dword
push dword
push dword
CallOrg dword 5
FreeOrg
ret 12

;==============================================================================
;DirectSoundCaptureCreate
;------------------------------------------------------------------------------
_DirectSoundCaptureCreate@12:
LoadOrg
push dword
push dword
push dword
CallOrg dword 6
FreeOrg
ret 12

;==============================================================================
;DirectSoundCaptureEnumerateA
;------------------------------------------------------------------------------
_DirectSoundCaptureEnumerateA@8:
LoadOrg
push dword
push dword
CallOrg dword 7
FreeOrg
ret 8

;==============================================================================
;DirectSoundCaptureEnumerateW
;------------------------------------------------------------------------------
_DirectSoundCaptureEnumerateW@8:
LoadOrg
push dword
push dword
CallOrg dword 8
FreeOrg
ret 8

;==============================================================================
;GetDeviceID
;------------------------------------------------------------------------------
_GetDeviceID@8:
LoadOrg
push dword
push dword
CallOrg dword 9
FreeOrg
ret 8

;==============================================================================
;DirectSoundFullDuplexCreate
;------------------------------------------------------------------------------
_DirectSoundFullDuplexCreate@40:
LoadOrg
push dword
push dword
push dword
push dword
push dword
push dword
push dword
push dword
push dword
push dword
CallOrg dword 10
FreeOrg
ret 40

;==============================================================================
;DirectSoundCreate8
;------------------------------------------------------------------------------
_DirectSoundCreate8@12:
LoadOrg
push dword
push dword
push dword
CallOrg dword 11
push eax
FreeOrg
pop eax
ret 12

;==============================================================================
;DirectSoundCaptureCreate8
;------------------------------------------------------------------------------
_DirectSoundCaptureCreate8@12:
LoadOrg
push dword
push dword
push dword
CallOrg dword 12
FreeOrg
ret 12

;数据段
segment .data
OrgDllName db "c:\windows\system32\dsound.dll";原始DLL路径
OrgDllHMod dd 0;原始DLL句柄这个源码需要用nasm编译,然后用link链接(VC6的link),你需要链接的库是kernel32.lib
SRC:
我这个帖子只是举一个举一反三的作用。大家看了可以编写别的DLL的劫持程序。

0xAA55 发表于 2014-7-22 01:57:52

不知道如何编译链接的,可以下载我提供的源码,它自带了编译器、库、编译批命令。
其实你完全不需要用汇编来写,C语言照样可以。其实严格来说,对于COM的DLL,VB都能编写劫持的东西。

CTW 发表于 2014-7-22 04:16:45

支持AA55分享精神
页: [1]
查看完整版本: 【DLL劫持】用NASM汇编语言实现32位dsound.dll的劫持