首页
社区
课程
招聘
[旧帖] [原创]DXF驱动NtReadvirtualMemory钩子反汇编代码分析 0.00雪花
发表于: 2014-3-22 11:17 2645

[旧帖] [原创]DXF驱动NtReadvirtualMemory钩子反汇编代码分析 0.00雪花

2014-3-22 11:17
2645
最近研究了几天DXF的tp保护,现将自己理解简单分享下!
tp保护主要hook了几个函数,论坛中已经有很多了就不再赘述了!
今天主要说下他hook NtReadvirtualMemory的实现原理
其他的几个也都差不多 大家也可以参照着看看~
首先我们来到NtReadvirtualMemory当前地址 
汇编代码如下:
mov eax, B1C52F8C
jmp eax
     //hook 挂了7字节个钩子
call 80538F40
mov eax, dword ptr fs:[124]
mov edi, eax
mov al, byte ptr [edi+140]
mov byte ptr [ebp-20], al
mov esi, dword ptr [ebp+14]
test al, al
je short 805AA83C
mov eax, dword ptr [ebp+C]
lea edx, dword ptr [eax+esi]
接下来我们跟到 B1C52F8C这个地址看看他的汇编代码
这里就跳到了tp自己的函数中了
因为不能双机调试 就只能通过函数名称来分析它要实现的功能 用KD复制的代码没有地址
和简单流程
push ebp
mov ebp, esp
sub esp, 100
pushad
pushfd
mov eax, B1C8292C
xor ecx, ecx                               //ecx=0
inc ecx                                       //ecx=1
lock xadd dword ptr [eax], ecx  //这里应该是个全局变量地址 不知道它加1的目的是什么
 call dword ptr [B1C57094]  ;all nt!PsGetCurrentProcess 
mov dword ptr [ebp-8], eax//这句是获取当前进程  [ebp-8]=当前EPROCESS
push 0
lea eax, dword ptr [ebp-4]
push eax
push 0
mov eax, dword ptr [B1C57050]
push dword ptr [eax]
push 400
push dword ptr [ebp+8] //  push 目标进程 ProcessHandle 具体大家可以查看下ObReferenceObjectByHandle这个函数
call dword ptr [<&ObReferenceObjectByHandle>] 
mov dword ptr [ebp-C], eax
cmp dword ptr [ebp-C], 0   //判断函数调用是否成功 
jge short B1C52FD4
jmp short B1C53029        //不成功就跳到结束
B1C52FD4:
mov ecx, dword ptr [ebp-4]
call dword ptr [B1C57098] // call ObfDereferenceObject 撤销对象的引用计数 调用ObReferenceObjectByHandle必须要撤销才可以
call dword ptr [B1C57094]
cmp dword ptr [ebp-4], eax
jne short B1C52FEA
jmp short B1C53029
push 4
push dword ptr [ebp-4]
call B1C52F7C  //判断进程是否为dxf进程
movzx eax, al
test eax, eax
jne short B1C52FFD  //不是DXF进程
jmp short B1C53029
B1C52FFD:push 4
push dword ptr [ebp-8]  当前进程eprocess
call B1C47F4A   这个call具体功能没看也是个字符串判断的不是DXF进程跳到这里判断 有可能是白名单 不能调试 就没怎么分析
movzx eax, al
test eax, eax
je short B1C53010
jmp short B1C53029
 B1C53010:mov eax, B1C8292C
or ecx, FFFFFFFF
lock xadd dword ptr [eax], ecx
popfd
popad
mov esp, ebp
pop ebp
mov eax, C000000D  //置返回错误代码  这里就屏蔽了本次调用 
retn 14
B1C53029:
mov eax, B1C8292C    //这里是正常调用的代码!!
or ecx, FFFFFFFF
lock xadd dword ptr [eax], ecx
popfd
popad
mov esp, ebp
pop ebp
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
jmp dword ptr [B1C80F58] //跳回原始地址继续执行

过掉这个函数方法有很多
可以把自己的进程加入白名单
或者直接还原这个函数
挂个ssdt钩子也可以(用这种方法的很多!)

个人觉得自己hook PsGetCurrentProcess应该也可以达到过保护的目的
这个应该可以过掉很多个
其他的钩子和这个都差不太多
第一次发帖,提供思路 抛砖引玉 大牛勿喷 如有不对的地方 大家批评指正!
谢谢大家

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 478
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
这样?。。。
2014-3-22 14:46
0
游客
登录 | 注册 方可回帖
返回
//