[分享]浅析QQ炫舞6开挂

[原创]浅析QQ炫舞6开挂
转载:https://bbs.pediy.com/thread-116205.htm

偶去年在网上看到有一些“大牛”代练QQ炫舞,还上传了视频,个人感觉挺酷的,他用的是六开挂,售价还不菲(200RMB),老婆一狠心就买了下来( 哎…也太鄙视她老公了)
真是倒霉透了,只要一在我的电脑上运行就蓝哦….估计是释放了驱动,而驱动导致系统崩溃,二话不说,PEiD查壳..UPX的(真是命好…)(VC写的),OD载入ESP定律脱掉、修复,为了安全起见还是在虚拟机下运行,蓝蓝蓝…,回到主系统,载入程序,下CreateServiceA断点,断下,释放出名为QQSafeRun.sys 的驱动,复制,用W32Dasm反汇编,分析此驱动是挂钩SSDT,Hook了NtCreateMutant内核函数,直接返回0(靠…真够绝的!),大家都知道NT之后系统SSDT为只读属性,要改写就得设置成可写的,当然方法有多种,它用的是CR0欺骗,反汇编代码如下:
…………….
…………….
cli
mov eax,cr0
xor eax,10000h
mov cr0,eax
…………….
一些操作
…………….
mov eax,cr0
xor eax,10000h
mov cr0,eax
sti
……………….
……………….
这种方法在单核PC上还好,而偶的是四核的,难怪狂蓝,偶是学硬件开发的,深深的知道四个CPU挂在一个总线上将意味着什么~~~
网上一些网友也曾讨论过类似问题的就绝方案,这似乎已经有点老掉牙了,可是出于偶职业的原因还是拿出来研究研究…调用原子操作函数似乎是个很好的办法,但是似乎也存在不妥之处,虽然DPC是最好的选择,但偶更喜欢用MDL+“原子操作”解决,于是通过分析反汇编代码功能,用windows汇编语言(只会这个)写了个驱动,这个驱动同样挂钩SSDT,hook了NtCreateMutant内核函数,在多核PC下运行稳定,没有再出现蓝屏…,这个驱动在XP+sp2/sp3下调试通过,偶将MDL操作SSDT的函数写成了通用函数,以便以后调用……
生成的驱动可以用驱动加载软件加载,实践证明:只要您的电脑配置够猛可以尽情的多开n个QQ炫舞….。
偶是学底层程序和硬件开发的,所以嘛…写不出好好的Ring3程序….有待努力!!!!
驱动代码如下:
编译环境:RadASM
编程语言:windows汇编语言

;●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
;●                               SafeHook_Func.asm                                  ●
;●                                                                                  ●
;● 作者:CoCol   QQ:1174968967                                                       ●
;●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
;--------------------------------------------------------------------------------------
;函数:GetSerTablInf
;参数说明:pSerTablBase:服务表基址变量、pTablSize:服务表大小变量
;功能:得到系统服务表信息
;--------------------------------------------------------------------------------------
GetSerTablInf proc pSerTablBase:dword,pTablSize:dword 
        pushad
        mov eax,KeServiceDescriptorTable;获取KeServiceDescriptorTable地址指针
        mov esi,[eax]
        mov eax,[esi];获取KeServiceDescriptorTable->ServiceTableBase
        mov edi,pSerTablBase
        mov [edi],eax
        add esi,8h
        mov eax,[esi]
        sal eax,2h
        mov edi,pTablSize
        mov [edi],eax
        popad
        ret
GetSerTablInf endp
;--------------------------------------------------------------------------------------
;函数:LockMdl
;参数说明:ObAddr:源地址、Codesize:尺寸、pMdl:MDL指针、pTab:新表指针
;功能:生成物理映像页
;--------------------------------------------------------------------------------------
LockMdl proc ObAddr:dword,Codesize:dword,pMdl:dword,pTab:dword
        local Status:NTSTATUS
        pushad
        mov Status,STATUS_SUCCESS 
        invoke MmCreateMdl,NULL,ObAddr,Codesize
        .if sdword ptr eax<0
                mov Status,STATUS_UNSUCCESSFUL;创建MDL不成功返回STATUS_UNSUCCESSFUL
                jmp Exit
        .endif
        mov edi,pMdl
        mov [edi],eax 
        mov ebx,eax 
        assume ebx: ptr MDL 
        invoke MmBuildMdlForNonPagedPool,ebx 
        or [ebx].MdlFlags,81H 
        invoke MmMapLockedPages,ebx,KernelMode 
        mov edi,pTab
        mov[edi],eax 
        Exit:
        popad
        mov eax,Status
        ret  
LockMdl endp 
;--------------------------------------------------------------------------------------
;函数:UnLockMdl
;参数说明:dwMdl:MDL地址、dwTab:新表地址
;功能:释放生成的物理映像页
;--------------------------------------------------------------------------------------
UnLockMdl proc dwMdl:dword,dwTab:dword 
        pushad
        invoke MmUnmapLockedPages,dwTab,dwMdl
        invoke IoFreeMdl,dwMdl
        popad
        ret 
UnLockMdl endp 
;--------------------------------------------------------------------------------------
;函数:KeInterlockedExchange
;参数说明:@plTarget:目标地址指针、@lValue:源地址
;功能:原子操作函数
;--------------------------------------------------------------------------------------
KeInterlockedExchange proc @plTarget:dword,@lValue:dword
        pushad
            mov ecx,@plTarget
            mov edx,@lValue
            mov eax,dword ptr[ecx]
      @@:lock cmpxchg dword ptr[ecx],edx
            jne @B
            popad           
            ret           
KeInterlockedExchange endp
;--------------------------------------------------------------------------------------
;函数:HookSSDT
;参数说明:@pRelKeFunc:原函数地址、@pAddrToRelFunc:原函数地址指针、@pNewFunc:自定义函数指针
;         @swFuncName:导出函数的函数名UNICODE字符串指针、Id:未导出函数ID号          
;功能:Hook指定内核函数          【MapServiceDescriptorTable:自定义全局变量】
;--------------------------------------------------------------------------------------
HookSSDT proc @pRelKeFunc:dword,@pAddrToRelFunc:dword,@pNewFunc:dword,@swFuncName:dword,Id:dword
        local @@Irql:dword
        pushad
        mov esi,MapServiceDescriptorTable;获取KeServiceDescriptorTable->ServiceTableBase物理映像地址
        .if Id==NULL
                invoke MmGetSystemRoutineAddress,@swFuncName
                inc eax
                movzx ecx,byte ptr[eax];获取服务号        
        .else
                mov ecx,Id
        .endif
        sal ecx,2h        
        add esi,ecx
        mov edi,@pAddrToRelFunc
        mov [edi],esi
        mov edi,dword ptr[esi];(edi)=欲Hook内核函数的地址
        push esi
        mov esi,@pRelKeFunc
        mov [esi],edi
        invoke KeRaiseIrqlToDpcLevel;●提升中断优先级
        mov @@Irql,eax
        pop edi
        mov esi,@pNewFunc       
        invoke KeInterlockedExchange,edi,esi  
        invoke KeLowerIrql,@@Irql;●恢复中断优先级 
        popad
        ret
HookSSDT endp
;--------------------------------------------------------------------------------------
;函数:UnHookSSDT
;参数说明:@pRelKeFunc:原函数地址、@AddrToRelFunc:原函数地址变量
;功能:恢复被Hook的内核函数
;--------------------------------------------------------------------------------------
UnHookSSDT proc @pRelKeFunc:dword,@AddrToRelFunc:dword
        local @@Irql:dword
        pushad
        invoke KeRaiseIrqlToDpcLevel
        mov @@Irql,eax 
        mov edi,@AddrToRelFunc
        mov esi,@pRelKeFunc
        invoke KeInterlockedExchange,edi,esi
        invoke KeLowerIrql,@@Irql       
        popad
        ret
UnHookSSDT endp
;●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
;●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
;●                               Demo.inc                                           ●
;●                                                                                  ●
;● 作者:CoCol   QQ:1174968967                                                       ●
;●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
;==============================Include=================================================
include         w2k\ntstatus.inc 
include         w2k\ntddk.inc 
include         w2k\hal.inc
include         w2k\ntoskrnl.inc
include         w2k\ntdef.inc
include         Macros\Strings.mac
;==============================IncludeLib==============================================
includelib         w2k\ntoskrnl.lib 
includelib         w2k\hal.lib
;===============================Typedef================================================
_NTCREATEMUTANT typedef proto:dword,:dword,:dword,:dword
NTCREATEMUTANT typedef ptr _NTCREATEMUTANT
;======================================================================================
;●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
;●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
;●                               SafeHookSSDT.Asm                                   ●
;●                                                                                  ●
;● 作者:CoCol   QQ:1174968967                                                       ●
;●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
;--------------------------------------------------------------------
.486p;保护模式
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include Demo.inc
;--------------------------------------------------------------------
.data
RealNtCreateMutant NTCREATEMUTANT  ?
DescriptorAddrToMutant dd ?
MapServiceDescriptorTable dd ?
MewMDL dd ?
SerTablBase dd ?
TablSize dd ?
.code
include SafeHook_Func.asm
HookNtCreateMutant proc MutantHandle:dword,DesiredAccess:dword,ObjectAttributes:dword,InitialOwner:dword
        pushad
        invoke RealNtCreateMutant,MutantHandle,DesiredAccess,ObjectAttributes,InitialOwner
        popad
        xor eax,eax
        ret     
HookNtCreateMutant endp
DriverUnload proc pDriverObject:PDRIVER_OBJECT
        pushad
        ;----------------------------------------------------------------------
        invoke UnHookSSDT,RealNtCreateMutant,DescriptorAddrToMutant
        invoke UnLockMdl,MewMDL,MapServiceDescriptorTable
        ;----------------------------------------------------------------------
        popad                
        ret
DriverUnload endp
DriverEntry proc pDriverObject:PDRIVER_OBJECT,pusRegistryPath:PUNICODE_STRING;入口函数
        local Status:dword
        pushad
        mov Status,STATUS_SUCCESS
        ;----------------------------------------------------------------------
        invoke GetSerTablInf,offset SerTablBase,offset TablSize  
        invoke LockMdl,SerTablBase,TablSize,offset MewMDL,offset MapServiceDescriptorTable
        .if eax==STATUS_UNSUCCESSFUL
                mov Status,eax
                jmp Exit
        .endif  
        invoke HookSSDT,offset RealNtCreateMutant,offset DescriptorAddrToMutant,offset HookNtCreateMutant,NULL,2bH  
        ;----------------------------------------------------------------------
        mov esi,pDriverObject
        assume esi:ptr DRIVER_OBJECT
        mov [esi].DriverUnload,offset DriverUnload;设置卸载例程
        assume esi:nothing
        Exit:
        popad
        mov eax,Status
        ret
DriverEntry endp
end DriverEntry
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值