最近研究了几天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期)