逆一个驱动中带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解题方法汇总!