分析一个win64保护驱动

1. bp ObRegisterCallbacks, 下段后,在函数入口处断下,此时查看返回地址。

Breakpoint 0 hit

nt!ObRegisterCallbacks:

fffff800`042d05a0 488bc4          mov    rax,rsp

*** ERROR: Module load completed but symbols could not be loaded for win7.sys

2: kd> dq rsp

fffff880`047d47d8  fffff880`03a7e24a ffffffff`8000074c      //fffff880`03a7e24a  是返回地址

fffff880`047d47e8  00000000`00000001 00000000`0000000e

fffff880`047d47f8  fffffa80`614eb000 fffff800`040cb020

fffff880`047d4808  00000000`00000001 fffff880`03a7e330

fffff880`047d4818  00000000`00000000 00000000`00010100

fffff880`047d4828  00000000`000a0008 fffff880`03a7e670

fffff880`047d4838  00000000`00000000 fffff880`047d4800

fffff880`047d4848  fffff880`047d49c0 00000000`00000000

2: kd> u fffff880`03a7e24a

win7+0x124a:

fffff880`03a7e24a 8bd8            mov    ebx,eax

fffff880`03a7e24c b8010000c0      mov    eax,0C0000001h

fffff880`03a7e251 85db            test    ebx,ebx

fffff880`03a7e253 0f48d8          cmovs  ebx,eax

fffff880`03a7e256 e811000000      call    win7+0x126c (fffff880`03a7e26c)

fffff880`03a7e25b 8bc3            mov    eax,ebx

fffff880`03a7e25d 488b9c2480000000 mov    rbx,qword ptr [rsp+80h]

fffff880`03a7e265 4883c470        add    rsp,70h

根据上述代码,对照win7.sys函数反编译源码: 我们看到尾部的偏移一致。

.text:0000000140001244                call    cs:ObRegisterCallbacks

.text:000000014000124A                mov    ebx, eax

.text:000000014000124C                mov    eax, 0C0000001h

.text:0000000140001251                test    ebx, ebx

.text:0000000140001253                cmovs  ebx, eax

.text:0000000140001256                call    sub_14000126C

.text:000000014000125B                mov    eax, ebx

.text:000000014000125D                mov    rbx, [rsp+78h+arg_0]

.text:0000000140001265                add    rsp, 70h

.text:0000000140001269                pop    rbp

.text:000000014000126A                retn

根据注册回调函数的用法:ObRegisterCallbacks(&obReg, &obHandle);

再看rsp+8,若用堆栈传递参数,这个就应该是第一参数arg0。

2: kd> dq ffffffff`8000074c

ffffffff`8000074c  ????????`???????? ????????`????????

ffffffff`8000075c  ????????`???????? ????????`????????

ffffffff`8000076c  ????????`???????? ????????`????????

ffffffff`8000077c  ????????`???????? ????????`????????

ffffffff`8000078c  ????????`???????? ????????`????????

ffffffff`8000079c  ????????`???????? ????????`????????

ffffffff`800007ac  ????????`???????? ????????`????????

ffffffff`800007bc  ????????`???????? ????????`????????

这说明不是采用堆栈传递参数。而是采用寄存器传递参数。ecx,edx

2: kd> dq ecx

fffff880`047d4820  00000000`00010100 00000000`000a0008

fffff880`047d4830  fffff880`03a7e670 00000000`00000000

fffff880`047d4840  fffff880`047d4800 fffff880`047d49c0

fffff880`047d4850  00000000`00000000 fffff800`0428c9c6

fffff880`047d4860  fffffa80`6192ac60 fffffa80`6192ac60

fffff880`047d4870  ffffffff`80000744 00000000`000007ff

fffff880`047d4880  fffff880`047d49c0 00000000`00000000

fffff880`047d4890  00000000`00000000 00000000`00000000

我们知道其参数第一参数arg0 是一个结构体, 这里面有我们需要的回调函数位置。

typedef struct _OB_CALLBACK_REGISTRATION {

USHORT                    Version;

USHORT                    OperationRegistrationCount;

UNICODE_STRING            Altitude;

PVOID                    RegistrationContext;

OB_OPERATION_REGISTRATION *OperationRegistration;    ///指向下面的结构

}

OB_CALLBACK_REGISTRATION, *POB_CALLBACK_REGISTRATION;

00000000`00010100 : 前面的00000000 是填充,用于结构体对齐。 后面的高位  0001  表示OperationRegistrationCount, 低位 0100 表示Version。

00000000`000a0008 : 前面的00000000 是填充,用于结构体对齐。 后面的高位  000a  表示unicode_string中的MaximumLength, 低位 0008 表示Length。

2: kd> dw fffff880`03a7e670  //这个里面存储的是unicode_string中的string。 目前存储的是“2111”

fffff880`03a7e670  0032 0031 0031 0031 0000 0000 0000 0000

fffff880`03a7e680  0000 0000 0000 0000 0000 0000 0000 0000

fffff880`03a7e690  0000 0000 0000 0000 0000 0000 0000 0000

fffff880`03a7e6a0  0000 0000 0000 0000 0000 0000 0000 0000

fffff880`03a7e6b0  0000 0000 0000 0000 0000 0000 0000 0000

fffff880`03a7e6c0  0000 0000 0000 0000 0000 0000 0000 0000

fffff880`03a7e6d0  0000 0000 0000 0000 0000 0000 0000 0000

fffff880`03a7e6e0  0000 0000 0000 0000 0000 0000 0000 0000

字符串内容与源码对应:

.text:00000001400011BC                mov    [rsp+arg_0], rbx

.text:00000001400011C1                push    rbp

.text:00000001400011C2                mov    rbp, rsp

.text:00000001400011C5                sub    rsp, 70h

.text:00000001400011C9                mov    rax, [rcx+28h]

.text:00000001400011CD                xor    edx, edx

.text:00000001400011CF                lea    rcx, [rbp-30h]

.text:00000001400011D3                or      dword ptr [rax+68h], 20h

.text:00000001400011D7                lea    r8d, [rdx+28h]

.text:00000001400011DB                call    sub_1400010A0

.text:00000001400011E0                call    cs:ObGetFilterVersion

.text:00000001400011E6                and    qword ptr [rbp-18h], 0

.text:00000001400011EB                lea    rdx, SourceString ; "2111"              /////字符串

.text:00000001400011F2                lea    rcx, [rbp-28h]  ; DestinationString

.text:00000001400011F6                mov    ebx, 1

.text:00000001400011FB                mov    [rbp-30h], ax

.text:00000001400011FF                mov    [rbp-2Eh], bx

.text:0000000140001203                call    cs:RtlInitUnicodeString

00000000`00000000 对应着RegistrationContext

fffff880`047d4800 对应着OperationRegistration  指向下面的结构体:

typedef struct _OB_OPERATION_REGISTRATION {

POBJECT_TYPE                *ObjectType;

OB_OPERATION                Operations;

POB_PRE_OPERATION_CALLBACK  PreOperation;      ///指向回调函数。

POB_POST_OPERATION_CALLBACK PostOperation;

} OB_OPERATION_REGISTRATION, *POB_OPERATION_REGISTRATION;

2: kd> dq fffff880`047d4800

fffff880`047d4800  fffff800`040cb020 00000000`00000001

fffff880`047d4810  fffff880`03a7e330 00000000`00000000

fffff880`047d4820  00000000`00010100 00000000`000a0008

fffff880`047d4830  fffff880`03a7e670 00000000`00000000

fffff880`047d4840  fffff880`047d4800 fffff880`047d49c0

fffff880`047d4850  00000000`00000000 fffff800`0428c9c6

fffff880`047d4860  fffffa80`6192ac60 fffffa80`6192ac60

fffff880`047d4870  ffffffff`80000744 00000000`000007ff

对照结构体,我们看到:

fffff800`040cb020 对应着 ObjectType

00000000`00000001 对应着 Operations    OB_OPERATION_HANDLE_CREATE

fffff880`03a7e330 对应着 PreOperation

00000000`00000000 对应着 PostOperation

2: kd> u fffff880`03a7e330

win7+0x1330:

fffff880`03a7e330 48895c2408      mov    qword ptr [rsp+8],rbx

fffff880`03a7e335 48896c2418      mov    qword ptr [rsp+18h],rbp

fffff880`03a7e33a 4889742420      mov    qword ptr [rsp+20h],rsi

fffff880`03a7e33f 57              push    rdi

fffff880`03a7e340 4883ec40        sub    rsp,40h

fffff880`03a7e344 488b05b51c0000  mov    rax,qword ptr [win7+0x3000 (fffff880`03a80000)]

fffff880`03a7e34b 4833c4          xor    rax,rsp

fffff880`03a7e34e 4889442430      mov    qword ptr [rsp+30h],rax

再看进程回调函数

.text:0000000140001330 PreProcessCall  proc near              ; DATA XREF: sub_140001190+A2�o

.text:0000000140001330                                        ; .pdata:0000000140004054�o

.text:0000000140001330

.text:0000000140001330 Str1            = byte ptr -28h

.text:0000000140001330 var_18          = qword ptr -18h

.text:0000000140001330 arg_0          = qword ptr  8

.text:0000000140001330 arg_10          = qword ptr  18h

.text:0000000140001330 arg_18          = qword ptr  20h

.text:0000000140001330

.text:0000000140001330                mov    [rsp+arg_0], rbx

.text:0000000140001335                mov    [rsp+arg_10], rbp

.text:000000014000133A                mov    [rsp+arg_18], rsi

.text:000000014000133F                push    rdi

.text:0000000140001340                sub    rsp, 40h

.text:0000000140001344                mov    rax, cs:__security_cookie

.text:000000014000134B                xor    rax, rsp

.text:000000014000134E                mov    [rsp+48h+var_18], rax

两者确认,完全一致。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容