- 注册时间
- 2010-6-12
- 最后登录
- 2019-9-29
- 在线时间
- 53 小时
终身VIP会员
- 魔鬼币
- 55135
|
简单分析,小弟能力有限如果有什么错误的话,欢迎各位牛牛指正,共同进步嘛
第一处清零代码-
- mov edi, edi
- push ebp
- mov ebp, esp
- push ecx
- push esi
- mov [ebp+var_1], 0
- call ds:KeGetCurrentIrql
- cmp al, 2 //判断中断级
- mov esi, offset SpinLock
- mov ecx, esi
- jb short loc_1002660
- call ds:KefAcquireSpinLockAtDpcLevel
- mov [ebp+var_1], 1
- jmp short loc_1002669
复制代码 loc_1002660:
- call ds:KfAcquireSpinLock
- mov [ebp+NewIrql], al
复制代码 loc_1002669:-
- mov ecx, dword_100D1C0 //这里比较关键啦。 dword_100D1C0 这个全局变量很重要
- mov edx, offset dword_100D1C0
- cmp ecx, edx
- jz short loc_10026BA// 这个是个关键比较啦
- push ebx
- push edi
复制代码 loc_100267A:-
- mov edi, dword_100CEDC //这里存放着EPROCESS的下标
- mov edi, [edi+4] //CEDC+4的位置正是BC
- add edi, [ecx-34h] //[D1C0-34]的位置存放着EPROCESS结构的地址
- xor eax, eax
- xchg eax, [edi] //清零
- mov eax, dword_100CEDC
- mov ebx, [ecx-2Ch] //存放着EPROCESS+70位置的内容
- mov eax, [eax+18h] //CEDC+18位置存放70下标
- mov edi, [ecx-34h]//EPROCESS结构的地址
- mov [eax+edi], ebx //写回去防止修改位置
- mov ebx, [ecx-28h] //74的内容
- mov [eax+edi+4], ebx//写回去
- mov edi, dword_100CEDC
- mov edi, [edi+1Ch] //取78位置
- add edi, [ecx-34h]
- xor eax, eax //写回去
- stosd
- stosd
复制代码 上面这一段把EPROCESS+70,74,78的位置全部封杀了
防止把BC的位置修改为70,74,78,所以曾经某种方法改位置变得无效了
第2段清零位代码,这里有个检测
- mov edi, edi
- push ebp
- mov ebp, esp
- push ecx
- push ecx
- push ebx
- xor ebx, ebx
- push esi
- mov ecx, offset SpinLock
- mov byte ptr [ebp-1], 1
- mov [ebp-8], ebx
- call ds:KfAcquireSpinLock
- mov esi, dword_100D1C0 //这里同1的注释 这个变量很重要
- cmp esi, offset dword_100D1C0//这里同1的注释一样
- mov [ebp-2], al
- jz loc_1004FE9 //关键跳
- mov [ebp-1], bl
- push edi
复制代码 loc_1004F62:
- mov eax, dword_100CEDC //这里存放着EPROCESS的下标
- mov eax, [eax+4] //CEDC+4的位置正是BC
- lea edi, [esi-34h] //[D1C0-34]的位置存放着EPROCESS结构的地址 注意这里是取地址
- add eax, [edi] //指到BC处
- xor ebx, ebx
- xchg ebx, [eax] //清零
- xor eax, eax
- cmp [ebp-8], eax
- jnz short loc_1004F83
- cmp ebx, eax
- jz short loc_1004F83
- mov ecx, [edi]
- mov [ebp-8], ecx
复制代码 loc_1004F83:
- mov ecx, 1505h
- movsx edx, byte ptr [edi+eax] //这段算法主要是检测有没有被修改如果有的话就重启机器
- imul ecx, 21h //edi存放着EPROCESS的地址,有兴趣的朋友可以逆下
- add ecx, edx
- inc eax
- cmp eax, 18h
- jb short loc_1004F88
- cmp ecx, [edi+1Ch] //1CH处存放着检验值 1CH+4位置存放着进程名
- jz short loc_1004FA1
- call sub_100163C //重启机器
复制代码 其实这里注意dword_100D1C0 变量这里很重要。
这2个都好搞定,关键是有个监控- mov edi, edi
- push ebp
- mov ebp, esp
- sub esp, 10h
- mov eax, dword_100CA6C //CA6C=CF;
- push ebx
- push esi
- push edi
- mov edi, offset unk_100CA68
- sub edi, 0CA68h //EDI=模块载入地址
- lea ecx, [eax+eax*2]//EAX=CF;
- shl ecx, 2 //这步计算我估计应该是得出了100B268总大小
- push 0
- mov [ebp+var_10], edi
- mov [ebp+var_4], ecx
- pop edx
- jz short loc_100422B
复制代码 loc_100420C:- movzx esi, byte_100B268[edx]/*
- 100B268这个变量指向一个结构 这个结构类似 struct{ULONG PY(偏移),INT LEN,ULONG HASH}
- CRC检验,估计是黑白名单之类的,我的猜测,如果有错那位朋友知道的话帮我纠正一下
- */
- mov ebx, [ebp+var_4]
- shr ebx, 1Bh
- xor esi, ebx
- mov ebx, [ebp+var_4]
- shl ebx, 5
- xor esi, ebx
- inc edx
- cmp edx, ecx
- mov [ebp+var_4], esi
- jb short loc_100420C
复制代码 loc_100422B:- cmp [ebp+var_4], 17606A55h //上面一系列的计算和(17606A55计算后的总大小)比较,如果被修改了就重启
- jz short loc_100423E
- call sub_100163C //重启
- mov eax, dword_100CA6C
复制代码 loc_100423E:- and [ebp+var_C], 0
- test eax, eax
- jbe short loc_100429F //这个跳可以修改
- mov esi, offset unk_100B26C
复制代码 loc_100424B:- mov ecx, [esi-4] //ECX==STRUCT结构的PY偏移
- mov edx, [esi]
- and [ebp+var_8], 0
- add ecx, edi //加上模块载入地址址
- test edx, edx
- mov [ebp+var_4], edx
- jbe short loc_1004282
复制代码 loc_100425D:- mov edi, [ebp+var_8]
- movzx edi, byte ptr [ecx+edi] //取出PY下面的值来计算HASH
- mov ebx, [ebp+var_4]
- shr ebx, 1Bh
- xor edi, ebx
- mov ebx, [ebp+var_4]
- shl ebx, 5
- xor edi, ebx
- inc [ebp+var_8]
- cmp [ebp+var_8], edx //edx == STRUCT结构中的LEN
- mov [ebp+var_4], edi
- jb short loc_100425D
- mov edi, [ebp+var_10]
- mov ecx, [ebp+var_4]
- cmp ecx, [esi+4] //经过一系列运算比较是不是STRUCT中的HASH
- jz short loc_1004294 //相同就跳
- call sub_100163C //不同就重启
- mov eax, dword_100CA6C
复制代码 loc_1004294:- inc [ebp+var_C]
- add esi, 0Ch
- cmp [ebp+var_C], eax
- jb short loc_100424B
- pop edi
- pop esi
- pop ebx
- leave
- retn
复制代码 重启代码- in al, 64h
- mov bl, al
- test bl, 1
- jz short loc_1001660
- in al, 60h
- test bl, 2
- jnz short loc_1001655
- mov al, 0FEh
- out 64h, al
- popa
- retn
复制代码 解决方法很多,我说几种
第一种是我以前用的一种比较挫的,其实最重要的是解决监控哪里,
分2步 1。在监控哪里 跳走或者直接返回
2.注意我标的清零的2段代码
mov ecx, dword_100D1C0 //这里比较关键啦。
mov edx, offset dword_100D1C0
cmp ecx, edx
jz short loc_10026BA// 这个是个关键比较啦
在函数开头钩钩一下跳到我们的函数
处理一下先查找到模块加载地址(Modulebase)。
伪代码
ULONG D1C0=Modulebase+0XD1C0;
_asm{
mov edi,edi
push ebp
mov ebp,esp
mov eax,D1C0
mov [eax],eax
mov eax,Ret(返回地址)
add eax,5
jmp eax
}
jz short loc_10026BA相等就跳啦
第二种方法 前天看到的,好像更加简便 查看
感谢这位朋友的共享精神;
第三种没尝试
直接修改
jz short loc_10026BA
jz loc_1004FE9
jbe short loc_100429F
第三种没实践过只是大概估计,有兴趣的朋友可以尝试一下。多实践总不会错
至于那些SSDT HOOK呀inline-hook要我相信大部分人都能解决的。
本人能力有限。此文章如果有什么不正确的地方,希望大家指正一下,共同学习,共同进步嘛。 |
|