首页
论坛
课程
招聘
[旧帖] [原创]上次发过突破TX驱动的程序和驱动,这次直接发出代码送给大家 0.00雪花
2009-10-19 23:23 7799

[旧帖] [原创]上次发过突破TX驱动的程序和驱动,这次直接发出代码送给大家 0.00雪花

2009-10-19 23:23
7799
;@echo off
;goto make

.386
.model flat, stdcall
option casemap:none

include         .\masm32\include\ntddk.inc
include         .\masm32\include\ntstatus.inc
include                .\masm32\include\ntoskrnl.inc

includelib         .\masm32\lib\ntoskrnl.lib

include         .\masm32\Macros\Strings.mac

.const

CCOUNTED_UNICODE_STRING        "\\Device\\myhook", g_DeviceName, 4
COUNTED_UNICODE_STRING        "\\??\\myhook", g_LinkName, 4

;18///////////////////////////////////////////////////////////////////
.data?
SERVICE_DESCRIPTOR_TABLE STRUCT

        ServiceTableBase                DWORD  ?
        ServiceCounterTableBase                DWORD  ?
        NumberOfService                   DWORD  ?
        ParamTableBase                        DWORD  ?

SERVICE_DESCRIPTOR_TABLE ends
;30///////////////////////////////////////////////////////////////////
.data

ssdtaddr        dd 0
oldreadaddr         dd 0
readpush        dd 0
readjmpaddr     dd 0
oldwriteaddr         dd 0
writepush       dd 0
writejmpaddr    dd 0

ntopenprcaddr   dd 0
ntopentrdaddr   dd 0

KiAttachProcessaddr  dd 0

ObOpenObjectByPointeraddr  dd 0

CCOUNTED_UNICODE_STRING "NtOpenProcess", g_ProcessAddr, 4
CCOUNTED_UNICODE_STRING "NtOpenThread", g_ThreadAddr, 4
CCOUNTED_UNICODE_STRING "KeAttachProcess",g_KeAttachAddr, 4
CCOUNTED_UNICODE_STRING "ObOpenObjectByPointer",g_PointerAddr, 4

;56///////////////////////////////////////////////////////////////////
.code

;///////////////////////////////////////////////////////////////////

MyNtReadVirtualMemory proc                             
;写好自己的nt!readvirtualmemory前几段代码直接跳到被hook代码后面

        push 1ch
        push readpush
        jmp  readjmpaddr                               
;readjmpaddr在后面记录下被hook了的代码后的地址

MyNtReadVirtualMemory endp

;///////////////////////////////////////////////////////////////////

MyNtWriteVirtualMemory proc                                ;同上

        push 1ch
        push writepush
        jmp  writejmpaddr

MyNtWriteVirtualMemory endp

;/////////////////////////////////////////////////////////////////

MyOpenProcess proc                                       
;这里TX直接把call ObOpenObjectByPointer改为自己的地址       
;我们就要在他前面hook,让代码走我们的线路跳过TX的call
        pushad                               
;这里的pushad,popad 里面可以写一些检测代码,比如,
;如果是TX的代码要检测这里可以让他去运行他自己的call                       
;这里好像没有检测,所以没有写代码
        popad                                                        push dword ptr [ebp-38h]                       
        push dword ptr [ebp-24h]       
        mov  eax,ntopenprcaddr
        add  eax,0bh
        push eax                                       
;这里要注意,这里的ntopenprcaddr是call ObOpenObjectByPointer后面
;的代码的地址,这个一定要写进去,因为我们是直接jmp进ObOpenObjectByPointer
        jmp  ObOpenObjectByPointeraddr                        MyOpenProcess endp                                       
;这里就相当于是一个call 但这里为什么不用call ObOpenObjectByPointer               
;只不过是少写几行代码也可以这样写                                       
;push dword ptr [ebp-38h]   这两行代码是直接拷贝                               
;push dword ptr [ebp-24h]   ntopenprocess里的代码
;call ObOpenObjectByPointer
;push ntopenprcaddr
;ret
这里一个push 和ret 也就是把下一个代码地址写入esp返回,
;这里大家可以练习一下,刚开绐我这里也不太明白怎么写,蓝屏N次
;后来在ring3下写了几次代码试验出来的,哈哈,菜鸟,只能这样,
                                                       
;//////////////////////////////////////////////////////////////////

MyOpenTread proc                                        ;这里同上
        pushad
        popad
        push dword ptr [ebp-34h]
        push dword ptr [ebp-20h]
        mov  eax,ntopentrdaddr
        add  eax,0bh
        push eax
        jmp  ObOpenObjectByPointeraddr
MyOpenTread endp

;/////////////////////////////////////////////////////////////////
Findcodeaddr proc code1:dword,code2:word,prcaddr:dword       
;这里是通过特征码搜索地址,因为不同的系统各地址不同,所以只能
;这样,试过xpsp2,xpsp3通过,别的系统没测试
        mov    edx,prcaddr                               
        mov    ecx,1000h
        .while ecx
           sub ecx,1h
           add edx,1h
           mov ebx,dword ptr [edx]
           xor eax,eax
           mov ax,word ptr [edx+4h]
        .break .if ebx==code1 && ax==code2
        .endw
        mov    eax,edx
        ret
Findcodeaddr endp
;////////////////////////////////////////////////////////////////

myhook proc
        pushad

        invoke MmGetSystemRoutineAddress,addr g_ProcessAddr
        invoke Findcodeaddr,0ffc875ffh,0dc75h,eax               
;通过windbg找到被hook地址前面的特征码找地址
        mov    ntopenprcaddr,eax
        invoke MmGetSystemRoutineAddress,addr g_ThreadAddr
        invoke Findcodeaddr,0ffcc75ffh,0e075h,eax
        mov    ntopentrdaddr,eax
        invoke MmGetSystemRoutineAddress,addr g_PointerAddr        ;ObOpenObjectByPointer
        mov    ObOpenObjectByPointeraddr,eax
        invoke MmGetSystemRoutineAddress,addr g_KeAttachAddr       
;这个KiAttachProcess没导出函数就通过KeAttachProcess
        invoke Findcodeaddr,570875ffh,0e856h,eax               
;来找了,大鸟们说是第一个E8 call我也就这样找了
        add    eax,6h
        mov    ebx,dword ptr [eax]
        add    ebx,eax
        add    ebx,4h
        mov    KiAttachProcessaddr,ebx

        mov eax,offset KeServiceDescriptorTable                       
;这里找SSDT,ntwritevirtualmemory,ntreadvirtualmemory
        mov eax,[eax]                     ;address of KeServiceDescriptorTable
        assume eax : ptr SERVICE_DESCRIPTOR_TABLE               
;这两个函数在SSDT的位置找出这两个地址,等下改成我们的
        mov ebx,[eax].ServiceTableBase                               
;地址,这就是SSDT hook,当时搞定这个心里乐得不行,
        mov ssdtaddr,ebx                       
;偶菜鸟也能HOOk系统函数了,

        mov eax,ssdtaddr
        add eax,2e8h                      ;0xBA * 4   ntreadvirtualmemoryaddr
        mov eax,DWORD PTR [eax]
        mov oldreadaddr,eax
        mov ebx,DWORD PTR [eax+3h]
        mov readpush,ebx
        add eax,7h
        mov readjmpaddr,eax

        mov eax,ssdtaddr
        add eax,454h                      ;0x115*4    ntwritevirtualmemoryaddr
        mov eax,DWORD PTR [eax]
        mov oldwriteaddr,eax
        mov ebx,DWORD PTR [eax+3h]
        mov writepush,ebx
        add eax,7h
        mov writejmpaddr,eax
                                                       
;这里我就不说了,大鸟们说得很清楚了,改写代码的时候不被中断
;要是代码没改完中断了,嘿嘿,蓝瓶的,好喝
        cli
           mov eax,cr0
        and eax,not 10000h                                       
        mov cr0,eax

        mov eax,ssdtaddr
        mov DWORD ptr [eax+2e8h],offset MyNtReadVirtualMemory
        mov DWORD ptr [eax+454h],offset MyNtWriteVirtualMemory

        mov ebx,ntopenprcaddr
        mov BYTE ptr [ebx],0e9h
        mov eax,offset MyOpenProcess
        sub eax,ebx
        sub eax,5h
        mov DWORD ptr [ebx+1h],eax

        mov ebx,ntopentrdaddr
        mov BYTE ptr [ebx],0e9h
        mov eax,offset MyOpenTread
        sub eax,ebx
        sub eax,5h
        mov DWORD ptr [ebx+1h],eax

        mov eax,cr0
        or  eax,10000h
        mov cr0,eax
        sti
        popad
        mov eax,1h

        ret
myhook endp

;/////////////////////////////////////////////////////////////////

DriverUnload proc pDriverObject:PDRIVER_OBJECT                           
;驱动卸载,把自己hook找码改回

        pushad
        cli
                mov  eax,cr0
        and  eax,not 10000h
        mov  cr0,eax

        mov eax,ssdtaddr
        mov ebx,DWORD ptr [oldreadaddr]
        mov DWORD ptr [eax+2e8h],ebx
        mov ebx,DWORD ptr [oldwriteaddr]
        mov DWORD ptr [eax+454h],ebx

        mov  eax,ntopenprcaddr
        mov  dword PTR [eax],0ffc875ffh
        mov  WORD ptr [eax+4h],0dc75h

        mov  eax,ntopentrdaddr
        mov  dword PTR [eax],0ffcc75ffh
        mov  WORD ptr [eax+4h],0e075h

                mov  eax,cr0
        or   eax,10000h
        mov  cr0,eax
        sti

        invoke IoDeleteSymbolicLink, addr g_LinkName
        mov eax, pDriverObject
        invoke IoDeleteDevice, (DRIVER_OBJECT PTR [eax]).DeviceObject
        popad
  ret  
DriverUnload endp

;////////////////////////////////////////////////////////////////////

MyCreate proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP                       
;这里的做用是当我们的程序加载驱动后,
;可以检测游戏是否运行,等,还有一个对付TX debug清0                               
;在程序中用CreateFile调用此函数
        mov esi, pIrp
        assume esi:ptr _IRP               
           mov [esi].IoStatus.Status, STATUS_UNSUCCESSFUL
        and [esi].IoStatus.Information, 0

        pushad
        mov ebx,KiAttachProcessaddr
        mov eax,dword ptr [ebx]
        .if eax==8b55ff8bh       
             mov  eax,STATUS_UNSUCCESSFUL
        popad
        ret
                                       
;本人对TX hook KiAttachProcess的代码检测,                               
;如果这里代码改动则游戏已运行,        .endif
        add ebx,1h
        mov eax,dword ptr [ebx]
        sub eax,53bh                                                        ;这里就是大鸟找出来的debug清0的地址通过
        mov ebx,dword ptr [eax]   ;ebx此地址为bc改为70                        ;TX hook KiAttachProcess的地址加偏移找到
                                                                       
        cli
        mov eax,cr0
        and eax,not 10000h
        mov cr0,eax

        mov dword ptr [ebx],70h   ;去除debugport 清0
        mov eax,KiAttachProcessaddr
        mov dword ptr [eax],8b55ff8bh
        mov dword ptr [eax+4],5d8b53ech

        mov eax,cr0
        or  eax,10000h
        mov cr0,eax
        sti
        popad       
        mov [esi].IoStatus.Status, STATUS_SUCCESS
        ret
MyCreate endp
;////////////////////////////////////////////////////////////////////

MyClose proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP                       
;关闭CreateFile函数调用
        mov esi, pIrp
        assume esi:ptr _IRP
        mov [esi].IoStatus.Status,STATUS_UNSUCCESSFUL
        and [esi].IoStatus.Information, 0

        mov [esi].IoStatus.Status,STATUS_SUCCESS
        ret
MyClose endp
;////////////////////////////////////////////////////////////////////

DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING                ;驱动入口,这里大家学习下驱动编程

local status:NTSTATUS
local pDeviceObject:PDEVICE_OBJECT

        invoke myhook
        .if eax == 0
                mov  eax,STATUS_UNSUCCESSFUL
                    ret
        .endif

        mov status,STATUS_UNSUCCESSFUL

        invoke IoCreateDevice,pDriverObject,0,addr g_DeviceName,FILE_DEVICE_UNKNOWN,0,FALSE,addr pDeviceObject
        .if eax == STATUS_SUCCESS
                invoke IoCreateSymbolicLink,addr g_LinkName,addr g_DeviceName
                .if eax == STATUS_SUCCESS
                        mov eax, pDriverObject
                        assume eax:ptr DRIVER_OBJECT
                        mov [eax].MajorFunction[IRP_MJ_CREATE*(sizeof PVOID)],offset MyCreate
                        mov [eax].MajorFunction[IRP_MJ_CLOSE*(sizeof PVOID)],offset MyClose
                        mov [eax].DriverUnload,offset DriverUnload
                        assume eax:nothing
                        mov status, STATUS_SUCCESS
                .else
                        invoke IoDeleteDevice, pDeviceObject
                .endif
        .endif
        mov  eax,status
        .if eax ==  STATUS_SUCCESS
        .endif
    ret
DriverEntry endp
end DriverEntry

:make
set drv=mydrv
\masm32\bin\ml /nologo /c /coff %drv%.bat
\masm32\bin\link /nologo /driver /base:0x10000 /align:32 /out:%drv%.sys /subsystem:native /ignore:4078 %drv%.obj
del %drv%.obj
move %drv%.sys ..
echo.
Pause

代码保存为bat 文件,直接运行即可,

本人菜鸟只能拿大鸟们的成果在这里组合一个,代码写得烂,有什么地方可优化的地方,

高手优化过发我一份,哈哈,

菜鸟学习一个多月的成果,此驱动可通过OD加载DNF进行调试

能送一张邀请卡最好不过,哈哈

看雪2022 KCTF 秋季赛 防守篇规则,征题截止日期11月12日!(iPhone 14等你拿!)

收藏
点赞0
打赏
分享
最新回复 (55)
雪    币: 514
活跃值: 活跃值 (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
xacker 活跃值 1 2009-10-20 01:34
2
0
顶  风而上 ^_^
雪    币: 39
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
netzlj 活跃值 2009-10-20 09:31
3
0
能进行调试吗
雪    币: 138
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xiaolsz 活跃值 2009-10-20 09:46
4
0
顶上
雪    币: 132
活跃值: 活跃值 (24)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ainiyang 活跃值 2009-10-20 11:53
5
0
楼主。我也想学驱动开发。我是用delphi的。请问您这是什么语言。
雪    币: 132
活跃值: 活跃值 (24)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ainiyang 活跃值 2009-10-20 18:30
6
0
为什么提示系统找不到指定路径找不到mydrv.obj
雪    币: 87
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
黑~鲨 活跃值 2009-10-20 18:54
7
0
代码为汇编masm32 写的,你要装好masm32和kmdkit去掉注释可编译成功。

不是我想顶风而上,搞这个来学比较刺激,哈哈,搞别的没动力,

再说了,这些都不是最主要的,要真能搞破坏的人,这些东西早就搞定了,

对他们来说这只是小菜,只有我等菜鸟拿来学习下没事的,

适合初学者学习,重点可学习HOOK  API。驱动基本写法。
雪    币: 226
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
黄庆南 活跃值 2009-10-20 19:58
8
0
收藏了,谢谢!
雪    币: 292
活跃值: 活跃值 (147)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
niceli 活跃值 2009-10-20 20:50
9
0
为什么提示系统找不到指定路径找不到mydrv.obj是不是要   

代码为汇编masm32 写的,你要装好masm32和kmdkit去掉注释可编译成功。
雪    币: 39
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
netzlj 活跃值 2009-10-21 16:54
10
0
再过来顶一次,成功突破。
雪    币: 2262
活跃值: 活跃值 (614)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
非虫 活跃值 7 2009-10-21 16:59
11
0
用汇编,真好。
雪    币: 419
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
fixfix 活跃值 2009-10-21 17:02
12
0
一场游戏一场梦
雪    币: 87
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
黑~鲨 活跃值 2009-10-21 17:16
13
0
我是学VC的,还是认为汇编更直接,想改什么改什么,不用想太多指针什么的。方便.

不过写大程序我还是会用VC的,
雪    币: 42
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ojeo 活跃值 2009-10-21 17:33
14
0
收藏备用
雪    币: 87
活跃值: 活跃值 (787)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xiaomajia 活跃值 2009-10-21 18:22
15
0
感觉太假,就不收藏了
雪    币: 203
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xiaoai娜 活跃值 2009-10-21 18:41
16
0
收长了, 留着以后备用
雪    币: 7
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cseeg 活跃值 2009-10-21 20:18
17
0
强悍的呢!tx驱动程序是什么
雪    币: 30
活跃值: 活跃值 (1210)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
riusksk 活跃值 41 2009-10-21 21:47
18
0
用汇编写驱动,膜拜……
雪    币: 248
活跃值: 活跃值 (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
资本 活跃值 2009-10-21 23:18
19
0
TX来抓人咯!收藏下来
雪    币: 432
活跃值: 活跃值 (993)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
xss 活跃值 4 2009-10-22 10:51
20
0
南山法院。。。。。
雪    币: 241
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
SSuNN 活跃值 2009-10-29 12:34
21
0
胆子可大呢,膜拜···
雪    币: 60
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hahafire 活跃值 2009-12-27 15:08
22
0
学习学习,不知道能不能编过
雪    币: 80
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yesor 活跃值 2009-12-27 18:17
23
0
太高深,看不懂
雪    币: 127
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ddao 活跃值 2010-1-5 13:57
24
0
收藏了,好像也有vc版本了。
雪    币: 31
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
佐浅 活跃值 2010-1-5 16:53
25
0
我还只能在新手这回帖啊
游客
登录 | 注册 方可回帖
返回