[C] 纯文本查看 复制代码
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; QQ本地会员 源代码 [通过msimg32.dll劫持启动] shuax 2011.05.21
; msimg32.Asm
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.586
.model flat, stdcall
option casemap :none
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;头文件
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
include windows.inc
include kernel32.inc
includelib kernel32.lib
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;全局变量
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.data
;初始化的变量
szCopyright db 'QQLocalVIP by shuax',0
szMsimg32 db '\msimg32.dll',0
szKernelUtil db 'KernelUtil.dll',0
szvSetDdrawflag db 'vSetDdrawflag',0
szDllInitialize db 'DllInitialize',0
szGradientFill db 'GradientFill',0
szAlphaBlend db 'AlphaBlend',0
szTransparentBlt db 'TransparentBlt',0
szGetSelfUin db '?GetSelfUin@Contact@Util@@YAKXZ',0
szIsFlagValid db '?IsFlagValid@Contact@Util@@YAHKK@Z',0
;声明函数指针
p_GetSelfUin typedef proto C ;使用__cdecl
p_IsFlagValid typedef proto C:DWORD,:DWORD ;使用__cdecl
g_GetSelfUin typedef ptr p_GetSelfUin
g_IsFlagValid typedef ptr p_IsFlagValid
GetSelfUin g_GetSelfUin 0;判断是否是自己
IsFlagValid g_IsFlagValid 0
.data?
;未初始化的变量
szSysDLL BYTE MAX_PATH DUP(?)
g_msimg32 dd ?
g_kernelutil dd ?
g_vSetDdrawflag dd ?
g_DllInitialize dd ?
g_GradientFill dd ?
g_AlphaBlend dd ?
g_TransparentBlt dd ?
g_bak BYTE 10 DUP(?)
g_jmp BYTE 5 DUP(?)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;代码
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;导出函数
vSetDdrawflag proc
jmp g_vSetDdrawflag
vSetDdrawflag endp
DllInitialize proc
jmp g_DllInitialize
DllInitialize endp
GradientFill proc
jmp g_GradientFill
GradientFill endp
AlphaBlend proc
jmp g_AlphaBlend
AlphaBlend endp
TransparentBlt proc
jmp g_TransparentBlt
TransparentBlt endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;本地会员
MyIsFlagValid proc C QQUIN:DWORD, Flag:DWORD
.IF Flag==4;是否是判断会员
.IF GetSelfUin!=0
invoke GetSelfUin
.IF QQUIN==eax ;判断是否是自己,如果是则返回TRUE
mov eax, TRUE
jmp original
.ENDIF
.ENDIF
.ENDIF
.IF IsFlagValid!=0
invoke IsFlagValid,QQUIN,Flag;调用原始函数
.ENDIF
;返回
original:
mov esp,ebp ;使用__cdecl
pop ebp
retn
MyIsFlagValid endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;5字节inline hook
HookCode proc TargetProc:DWORD, NewProc:DWORD
;参数检查
.IF TargetProc == 0
ret
.endif
;使得g_bak区块可执行
mov ecx,offset g_bak
mov IsFlagValid,ecx
invoke VirtualProtect,IsFlagValid,10,PAGE_EXECUTE_READWRITE,0
;读取前5个字节
invoke ReadProcessMemory,-1,TargetProc, IsFlagValid, 5, NULL;
.IF eax!=0
;如果已经被hook过,则修正JMP偏移
mov ecx,dword ptr [g_bak]
.IF cl==0E9h
mov ecx,dword ptr [g_bak+1]
add ecx,TargetProc
sub ecx,offset g_bak
mov dword ptr [g_bak+1],ecx
.endif
;写入还原
mov ecx,offset g_bak
add ecx,5
mov byte ptr [ecx],0E9h
inc ecx
mov eax,TargetProc
sub eax,ecx
inc eax
mov dword ptr [ecx],eax
;写入跳转
mov eax,offset g_jmp
mov byte ptr [eax],0E9h
inc eax
mov ecx,NewProc
sub ecx,TargetProc
sub ecx,5
mov dword ptr [eax],ecx
invoke WriteProcessMemory,-1,TargetProc, addr g_jmp, 5, NULL
.endif
ret
HookCode endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;DllMain
DllEntry proc hModule:HINSTANCE, dwReason:DWORD, lpReserved:DWORD
.IF dwReason == DLL_PROCESS_ATTACH
;获得系统msimg32.dll地址
invoke GetSystemDirectory,addr szSysDLL, MAX_PATH
invoke lstrcat,addr szSysDLL, addr szMsimg32
invoke LoadLibrary,addr szSysDLL
.IF eax!=0
;获得各个函数地址
mov g_msimg32,eax
invoke GetProcAddress,g_msimg32,addr szvSetDdrawflag
mov g_vSetDdrawflag, eax
invoke GetProcAddress,g_msimg32,addr szDllInitialize
mov g_DllInitialize, eax
invoke GetProcAddress,g_msimg32,addr szGradientFill
mov g_GradientFill, eax
invoke GetProcAddress,g_msimg32,addr szAlphaBlend
mov g_AlphaBlend, eax
invoke GetProcAddress,g_msimg32,addr szTransparentBlt
mov g_TransparentBlt, eax
;写入本地会员hook
invoke GetModuleHandle,addr szKernelUtil
.IF eax!=0
mov g_kernelutil,eax
invoke GetProcAddress,g_kernelutil,addr szGetSelfUin
mov GetSelfUin, eax
invoke GetProcAddress,g_kernelutil,addr szIsFlagValid
invoke HookCode,eax,MyIsFlagValid
;打印版权信息
invoke OutputDebugString,addr szCopyright
.ENDIF
.ENDIF
.ENDIF
mov eax, TRUE
ret
DllEntry Endp
End DllEntry
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QQ本地会员 源代码 [采用msimg32.dll劫持] shuax 2011.05.21; msimg32.Def; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;LIBRARY "msimg32.DLL"EXPORTS vSetDdrawflag DllInitialize GradientFill AlphaBlend TransparentBlt