研读了大大们关于DLL劫持的文章,用win32asm写了下,发现在DLL中不能加载同名的DLL(系统DLL),问了有些高手说,不能加载同名的DLL。
用Yonsm的AheadLib生成了C++代码,发现关于系统DLL的调用都在namespace AheadLib中,不知道namespace在win32asm中怎么写,请高手指教下。
本人写的代码如下(LPK.DLL):
.386
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_PROCVAR0 typedef proto
PROCVAR0 typedef ptr _PROCVAR0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
szSystem db 1024 dup(?)
lpFileName db 1024 dup(?)
hDllInstance dd ?
lpIncCount PROCVAR0 ?
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.const
_dllName db '\lpk.dll',0
_LpkInitialize db 'LpkInitialize',0
_LpkTabbedTextOut db 'LpkTabbedTextOut',0
_LpkDllInitialize db 'LpkDllInitialize',0
_LpkDrawTextEx db 'LpkDrawTextEx',0
_LpkEditControl db 'LpkEditControl',0
_LpkExtTextOut db 'LpkExtTextOut',0
_LpkGetCharacterPlacement db 'LpkGetCharacterPlacement',0
_LpkGetTextExtentExPoint db 'LpkGetTextExtentExPoint',0
_LpkPSMTextOut db 'LpkPSMTextOut',0
_LpkUseGDIWidthCache db 'LpkUseGDIWidthCache',0
_ftsWordBreak db 'ftsWordBreak',0
szTitle db '加载成功',0
szTitle2 db '加载失败',0
szTitle3 db '卸载成功',0
szTitle4 db '卸载失败',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
DllEntry proc _hInstance,_dwReason,_dwReserved
mov eax,_dwReason
.if eax == DLL_PROCESS_ATTACH
invoke DisableThreadLibraryCalls,_hInstance
invoke GetSystemDirectory,addr szSystem,sizeof szSystem
invoke lstrcat,addr szSystem,addr _dllName
invoke LoadLibrary,addr szSystem
.if eax == NULL
;加载失败
invoke MessageBox,NULL,offset szSystem,offset szTitle2,MB_ICONSTOP
mov eax,FALSE
.else
;加载成功
invoke MessageBox,NULL,offset szSystem,offset szTitle,MB_OK
mov hDllInstance,eax
;可以执行到这里,但是调用GetModuleFileName后,lpFileName居然是空的
invoke GetModuleFileName,hDllInstance,addr lpFileName,sizeof lpFileName
invoke MessageBox,NULL,offset lpFileName,offset szTitle,MB_OK
mov eax,TRUE
.endif
.elseif eax == DLL_PROCESS_DETACH
invoke FreeLibrary,hDllInstance
.if eax == NULL
;卸载失败
invoke MessageBox,NULL,offset szSystem,offset szTitle4,MB_ICONSTOP
.else
;卸载成功
invoke MessageBox,NULL,offset szSystem,offset szTitle3,MB_OK
.endif
mov eax,TRUE
.endif
ret
DllEntry Endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
LpkInitialize proc
invoke GetProcAddress,hDllInstance,addr _LpkInitialize
.if eax != NULL
mov lpIncCount,eax
invoke lpIncCount
.endif
ret
LpkInitialize Endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
LpkTabbedTextOut proc
invoke GetProcAddress,hDllInstance,addr _LpkTabbedTextOut
.if eax != NULL
mov lpIncCount,eax
invoke lpIncCount
.endif
ret
LpkTabbedTextOut Endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
LpkDllInitialize proc
invoke GetProcAddress,hDllInstance,addr _LpkDllInitialize
.if eax != NULL
mov lpIncCount,eax
invoke lpIncCount
.endif
ret
LpkDllInitialize Endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
LpkDrawTextEx proc
invoke GetProcAddress,hDllInstance,addr _LpkDrawTextEx
.if eax != NULL
mov lpIncCount,eax
invoke lpIncCount
.endif
ret
LpkDrawTextEx Endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
LpkEditControl proc
invoke GetProcAddress,hDllInstance,addr _LpkEditControl
.if eax != NULL
mov lpIncCount,eax
invoke lpIncCount
.endif
ret
LpkEditControl Endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
LpkExtTextOut proc
invoke GetProcAddress,hDllInstance,addr _LpkExtTextOut
.if eax != NULL
mov lpIncCount,eax
invoke lpIncCount
.endif
ret
LpkExtTextOut Endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
LpkGetCharacterPlacement proc
invoke GetProcAddress,hDllInstance,addr _LpkGetCharacterPlacement
.if eax != NULL
mov lpIncCount,eax
invoke lpIncCount
.endif
ret
LpkGetCharacterPlacement Endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
LpkGetTextExtentExPoint proc
invoke GetProcAddress,hDllInstance,addr _LpkGetTextExtentExPoint
.if eax != NULL
mov lpIncCount,eax
invoke lpIncCount
.endif
ret
LpkGetTextExtentExPoint Endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
LpkPSMTextOut proc
invoke GetProcAddress,hDllInstance,addr _LpkPSMTextOut
.if eax != NULL
mov lpIncCount,eax
invoke lpIncCount
.endif
ret
LpkPSMTextOut Endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
LpkUseGDIWidthCache proc
invoke GetProcAddress,hDllInstance,addr _LpkUseGDIWidthCache
.if eax != NULL
mov lpIncCount,eax
invoke lpIncCount
.endif
ret
LpkUseGDIWidthCache Endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ftsWordBreak proc
invoke GetProcAddress,hDllInstance,addr _ftsWordBreak
.if eax != NULL
mov lpIncCount,eax
invoke lpIncCount
.endif
ret
ftsWordBreak Endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
End DllEntry
[培训]科锐逆向工程师培训第53期2025年7月8日开班!