首页
社区
课程
招聘
[原创]逆一个驱动中带Exception的函数
发表于: 2010-10-14 10:22 13931

[原创]逆一个驱动中带Exception的函数

2010-10-14 10:22
13931
逆一个驱动中带Exception的函数

金山推出了隐私保护器,拿来看看:
        下载地址:        http://bbs.duba.net/thread-22314119-1-1.html
1013版本。压缩包中只有一个EXE文件。不需要安装,直接运行。开始监控后,
在目录:
        C:\Documents and Settings\MyUserName\Application Data\kprivacy.exe\
下发现一个文件
        ksafefilemon.sys 文件长度 129128
这就是它的驱动了。要实现文件监控,一般还是要驱动的。

用IDA打开,分析一下这个驱动。

第一个函数 00012100 明显可以改名为 AllocMem
第二个函数 00012120 明显可以改名为 FreeMem
第三个函数 00012140 中有这么一句:

.text:0001214A                 push    offset _except_handler3

显然用到了Exception。这种带Exception代码的逆向,一般是记不住的。为了逆它,写一个测试函数:
void puts(const char* p);
void test()
{
  puts("first");
  __try
  {
    puts("seccond");
  }
  __except(0)
  {
    puts("third");
  }
}

把以上测试代码用DDK 7600.16385.0 fre x86 WXP 编译,用IDA打开生成的OBJ文件,
test函数中只出现
        call __SEH_prolog4
不行。不是我们所要的。

把以上测试代码用DDK 7600.16385.0 chk x86 WXP 编译,用IDA打开生成的OBJ文件,
test函数中出现了
        push offset __except_handler4
也不行。

为什么我们出现了 __except_handler4 而没有出现 _except_handler3 呢?网上搜索一下,
原来,新版的DDK使用了MSVC8作为编译器,就改为 __except_handler4 了。看来要找一个旧版的DDK试一试。

网上搜索,
        WIN DDK 3790.1830 ISO下载
        http://download.microsoft.com/download/9/0/f/90f019ac-8243-48d3-91cf-81fc4093ecfd/1830_usa_ddk.iso

把测试代码用DDK 3790.1830 fre x86 WXP 编译,用IDA打开生成的OBJ文件,
test函数中出现了
        call __SEH_prolog
也不行。

把测试代码用DDK 3790.1830 chk x86 WXP 编译,用IDA打开生成的OBJ文件,
test函数中出现了
        push    offset __except_handler3
终于找到了!

虽然这个 __except_handler3 比我们要找的 _except_handler3 多了一个下划线,不去深究了,我们认为它就是一样的。

还有,难道金山的这个驱动文件,是用 Checked Build 编译的?而不是一般的 Free Build ?

对比我们写的 test 函数和 sub_12140 ,就容易知道它是怎么使用 __try __except 的了。
最后,逆向出来的函数是这样的:
#include <excpt.h>

#define OUT
typedef unsigned short wchar_t;

int __stdcall sub_12140(const char* a0, OUT wchar_t* a4, unsigned short a8_len)
{
  int i = 0;  //v1c
  __try
  {
    for (i = 0; i < a8_len; i++)
    {
      a4[i] = a0[i];
    }
    return 0;
  }
  __except(EXCEPTION_EXECUTE_HANDLER) //EXCEPTION_EXECUTE_HANDLER = 1
  {
    return 0xE00B0002;
  }
}

原始的汇编是这样的:

sub_12140       proc near               ; CODE XREF: sub_1AFC0+D9p

var_20          = dword ptr -20h
var_1C          = dword ptr -1Ch
var_18          = dword ptr -18h
var_10          = dword ptr -10h
var_4           = dword ptr -4
arg_0           = dword ptr  8
arg_4           = dword ptr  0Ch
arg_8           = word ptr  10h

                push    ebp
                mov     ebp, esp
                push    -1
                push    offset dword_27C98
                push    offset _except_handler3
                mov     eax, large fs:0
                push    eax
                mov     large fs:0, esp
                add     esp, 0FFFFFFF0h
                push    ebx
                push    esi
                push    edi
                mov     [ebp+var_18], esp
                mov     [ebp+var_20], 0E00B0001h
                mov     [ebp+var_1C], 0
                mov     [ebp+var_4], 0
                mov     [ebp+var_1C], 0
                jmp     short loc_1218D
; ---------------------------------------------------------------------------

loc_12184:                              ; CODE XREF: sub_12140+6Aj
                mov     eax, [ebp+var_1C]
                add     eax, 1
                mov     [ebp+var_1C], eax

loc_1218D:                              ; CODE XREF: sub_12140+42j
                movzx   ecx, [ebp+arg_8]
                cmp     [ebp+var_1C], ecx
                jge     short loc_121AC
                mov     edx, [ebp+arg_0]
                add     edx, [ebp+var_1C]
                movsx   ax, byte ptr [edx]
                mov     ecx, [ebp+var_1C]
                mov     edx, [ebp+arg_4]
                mov     [edx+ecx*2], ax
                jmp     short loc_12184
; ---------------------------------------------------------------------------

loc_121AC:                              ; CODE XREF: sub_12140+54j
                mov     [ebp+var_4], -1
                jmp     short loc_121D5
; ---------------------------------------------------------------------------

loc_121B5:                              ; DATA XREF: .text:00027C9Co
                mov     eax, 1
                retn
; ---------------------------------------------------------------------------

loc_121BB:                              ; DATA XREF: .text:00027CA0o
                mov     esp, [ebp+var_18]
                mov     [ebp+var_20], 0E00B0002h
                mov     [ebp+var_4], -1
                jmp     short loc_121DC
; ---------------------------------------------------------------------------
                mov     [ebp+var_4], -1

loc_121D5:                              ; CODE XREF: sub_12140+73j
                mov     [ebp+var_20], 0

loc_121DC:                              ; CODE XREF: sub_12140+8Cj
                mov     eax, [ebp+var_20]
                mov     ecx, [ebp+var_10]
                mov     large fs:0, ecx
                pop     edi
                pop     esi
                pop     ebx
                mov     esp, ebp
                pop     ebp
                retn    0Ch
sub_12140       endp

dword_27C98     dd -1                   ; DATA XREF: sub_12140+5o
                dd offset loc_121B5
                dd offset loc_121BB

[课程]Android-CTF解题方法汇总!

收藏
免费 7
支持
分享
最新回复 (31)
雪    币: 1098
活跃值: (193)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
2
好久不见了。挺想你的。
2010-10-14 10:32
0
雪    币: 411
活跃值: (247)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
卧室来看牜人的~
2010-10-14 18:31
0
雪    币: 89
活跃值: (185)
能力值: ( LV9,RANK:270 )
在线值:
发帖
回帖
粉丝
4
惊现大牛啊,围观中……
2010-10-14 18:34
0
雪    币: 284
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
大牛出没请注意
2010-10-14 20:10
0
雪    币: 70
活跃值: (74)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
又学会了一招,呵呵,刘先生果然牛。。。
2010-10-14 20:27
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
7
F5
int __usercall sub_401000<eax>(int a1<eax>, char *a2, WORD *a3, unsigned __int16 a4)
{
  char v5; // [sp-Ch] [bp-2Ch]@1
  unsigned int v6; // [sp+0h] [bp-20h]@1
  int i; // [sp+4h] [bp-1Ch]@1
  SEHRegistrationNode __$SEHRec$; // [sp+8h] [bp-18h]@1

  __$SEHRec$.EncodedScopeTable = (int)&dword_4010B2;
  __$SEHRec$.Handler = (int)sub_4010D0;
  __$SEHRec$.Next = a1;
  __$SEHRec$.SavedESP = (int)&v5;
  v6 = 0xE00B0001u;
  __$SEHRec$.TryLevel = 0;
  for ( i = 0; i < a4; ++i )
    a3[i] = a2[i];
  return 0;
}



支持给F5写个plugin
2010-10-14 20:58
0
雪    币: 132
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
呵呵,大牛~
2010-10-14 22:37
0
雪    币: 270
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
9
涛哥......
2010-10-14 22:39
0
雪    币: 596
活跃值: (449)
能力值: ( LV12,RANK:320 )
在线值:
发帖
回帖
粉丝
10
我晕 金山也来了个隐私保护器,干脆再弄个金山浏览器 金山保险箱得了,膜拜大牛
2010-10-14 23:26
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
11
ks真的还山寨了一个浏览器. 只是没发布...
2010-10-14 23:49
0
雪    币: 93944
活跃值: (200219)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
12
Thanks for share.

Программное обеспечение выпуска и Windows Crack Обучение
Нам-Dabei Guanyin Бодхисаттва Нам без митабха
2010-10-14 23:49
0
雪    币: 142
活跃值: (310)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
13
Программное обеспечение выпуска и Windows Crack Обучение  
Нам-Dabei Guanyin Бодхисаттва Нам без митабха

读音

不老歌拉木闹也 哦呗呗切尼也 我不死嘎 一 windows crack 哦不切尼也
那木 大呗 观音 包的黑撒的瓦 那木 被子 米大不哈
2010-10-15 10:55
0
雪    币: 57
活跃值: (55)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
14
方法不错……
学习了
2010-10-15 14:04
0
雪    币: 468
活跃值: (340)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
15
再逆两个函数

void sub_12380(PVOID a0_pmem, ULONG a4_len, ULONG a8_align)
{
  char v9 = 0;
  if (a4_len == 0)
    return;
  ULONG p = (ULONG)a0_pmem;
  if ((a8_align - 1) & p)
  {
    ExRaiseDatatypeMisalignment();
    return;
  }
  ULONG v8 = p + a4_len - 1;
  if (p > v8 || v8 >= *MmUserProbeAddress)
  {
    ExRaiseAccessViolation();
    return;
  }
  v8 = (ULONG)PAGE_ALIGN(v8) + PAGE_SIZE; //(v8 & 0xFFFFF000) + 0x1000;
  do
  {
    v9 = *(char*)p;
    p = (ULONG)PAGE_ALIGN(p) + PAGE_SIZE;  //(p & 0xFFFFF000) + 0x1000;
  } while (p != v8);
}
bool sub_122E0(PVOID a0_pmem, ULONG a4_len)
{
  if (a0_pmem == NULL || a0_pmem >= *MmSystemRangeStart)
    return false;
  __try
  {
    sub_12380(a0_pmem, a4_len, 1);
    return true;
  }
  __except(EXCEPTION_EXECUTE_HANDLER)
  {
    return false;
  }
}
/*
可以看出函数 sub_122E0 完成的功能是,通过每个Page读一个字节,检查一段内存是否可读。

可以想象,之所以他用 checked build 而不用 free build 来编译,可能就是担心
sub_12380 中的 v9 = *(char*)p 被优化掉。 其实,可以通过把 v9 定义为 static 来解决这个问题。

这种在 __try __except 中使用
  ExRaiseStatus(NTSTATUS)
  ExRaiseAccessViolation()  STATUS_ACCESS_VIOLATION
  ExRaiseDatatypeMisalignment() STATUS_DATATYPE_MISALIGNMENT
的做法值得学习。这样,在 __except 中可以用
  GetExceptionCode()
判断出了什么事
*/
2010-10-15 15:13
0
雪    币: 391
活跃值: (135)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
16
噢,刘涛涛大牛,你终于出现了
2010-10-15 16:11
0
雪    币: 320
活跃值: (183)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
17
哇咔咔 大牛出没
2010-10-15 16:33
0
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
期待继续 ,,,,
2010-10-15 17:04
0
雪    币: 314
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
应该不是check的,看字符串
f:\\kxengine\\defend3\\product\\release\\dbginfo\\ksafefilemon.pdb
2010-10-15 20:06
0
雪    币: 245
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
支持继续~~~~~~~
2010-10-16 00:27
0
雪    币: 1163
活跃值: (137)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
21
支持直接发idb
2010-10-16 12:30
0
雪    币: 615
活跃值: (1132)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
22
so.......
2010-10-16 12:32
0
雪    币: 364
活跃值: (152)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
23
呵呵……是release版的,不过我把优化关了
2010-10-17 18:30
0
雪    币: 412
活跃值: (30)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
24
楼上真相帝...
2010-10-17 20:02
0
雪    币: 116
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
学习大牛的方法!
2010-10-17 23:37
0
游客
登录 | 注册 方可回帖
返回
//