首页
论坛
专栏
课程

[旧帖] [原创]浅析QQ炫舞6开挂 0.00元

2010-7-4 19:57 3266

[旧帖] [原创]浅析QQ炫舞6开挂 0.00元

2010-7-4 19:57
3266
偶去年在网上看到有一些“大牛”代练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

[公告][征集寄语] 看雪20周年年会 | 感恩有你,一路同行

最新回复 (35)
sonicyouth 2010-7-4 20:05
2
0
牛人啊~~膜拜中!!!!
YangCoCol 3 2010-7-4 20:17
3
0
共同努力!!!!!创造美好明天~~~~~
xahzad 2010-7-5 02:30
4
0
是你自己做的吗。。还是。。。。
YangCoCol 3 2010-7-5 14:25
5
0
确实是自己所做....偶开发驱动已经3年.....抄袭在学习阶段常做(对自己提高很有用)....
现在主要和几个志同道合的兄弟做驱动开发和单片机系统开发项目.......
chenjiang 2010-7-5 17:11
6
0
能看哈就好,最是这样,好像KX越不多
yy大雄 2010-7-7 20:58
7
0
只能膜拜 无法超越
杀不死 2010-7-7 21:16
8
0
triones 6 2010-7-8 09:46
9
0
楼主本意是封装,结果反而把这封装拆散了,而且只HOOK SSDT,有一定局限性。
其实完全可以做个通用封装:以下给出C源码:

inline bool Crackit(void* mem,unsigned char* crackcode,size_t len)
{
#ifdef _RING0
PMDL pMDL = MmCreateMdl(NULL,mem,len);
if (pMDL == NULL) return false;
MmBuildMdlForNonPagedPool(pMDL);
pMDL->MdlFlags = pMDL->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA | MDL_WRITE_OPERATION;
void* Mem = MmMapLockedPages(pMDL,KernelMode);
if (Mem == NULL) return false;

RtlCopyMemory(mem,crackcode,len);

MmUnmapLockedPages(Mem,pMDL);
IoFreeMdl(pMDL);
#else
if(!WriteProcessMemory((HANDLE)-1,(LPVOID)mem,(LPCVOID)crackcode,len,0)) return false;
#endif
return true;
}
uidfivezz 2010-7-8 09:56
10
0
学习    但是看不懂
ifocke 2010-7-8 11:02
11
0
樓主真乃一人才!不感興趣遊戲的路過!
fuzhousea 2010-7-8 11:04
12
0
膜拜,学习一下。
fefrsh 2010-7-8 14:22
13
0
invoke KeRaiseIrqlToDpcLevel;●提升中断优先级
        mov @@Irql,eax
        pop edi
        mov esi,@pNewFunc      
        invoke KeInterlockedExchange,edi,esi  
        invoke KeLowerIrql,@@Irql;●恢复中断优先级
        popad
......
你的代码貌似没有涉及到 多处理器的内容。。。

另外,那蓝屏可能是 cli ,sti使用不够严谨造成的
LShang 2010-7-8 14:55
14
0
膜拜楼主.
驱动这个东东貌似很难...
zhuoyujian 2010-7-8 15:09
15
0
  太牛了 大牛就是大牛
hqm 2010-7-8 15:37
16
0
学习呀,顶了再看
狂世战神 2010-7-8 16:17
17
0
bestXP 2010-7-10 10:21
18
0
膜拜,学习一下
幽幽精灵 2010-7-10 10:59
19
0
太难了羡慕中
雨忆 2010-7-10 14:19
20
0
恭喜 恭喜 你成功了
wuhandai 2010-7-11 00:25
21
0
高军 2010-11-25 20:22
22
0
好东西,学习了
nane 2010-11-25 20:31
23
0
这个如果真能实现就很厉害的楼主
衣羊 2010-11-25 21:23
24
0
icoon 2010-11-25 22:26
25
0
真是高深,还得继续研究下代码
estelle 2010-12-14 12:21
26
0
学习了
感谢楼主的代码
cocowolf 2010-12-14 18:09
27
0
看看有多少KX了
LuckyFox 2010-12-16 09:49
28
0
我正在努力中...
samlyn 2010-12-16 22:37
29
0
虽然看的不是很懂,还是膜拜下楼主
熊猫正正 9 2010-12-23 16:27
30
0
汇编驱动,不愧为搞硬件人啦~
Hacker—小宇 2011-5-10 04:52
31
0
膜拜楼上的大妞们
沙漏 2011-5-10 10:53
32
0
楼主太帅了。。。
沙漏 2011-5-10 21:49
33
0
学习i学习 。。。。。。。
mircocopy 2011-5-12 20:03
34
0
技术贴,学习了
comewisdom 2011-5-12 21:14
35
0
学习学习学习.........
duanmuci 2011-5-15 09:43
36
0
开眼界了,而且学到新东东
游客
登录 | 注册 方可回帖
返回