php反调试,简单对抗某个驱动的反调试

标 题: 【原创】简单对抗某个驱动的反调试

作 者: ReturnsMe

时 间: 2010-04-18,20:02:11

链 接: http://bbs.pediy.com/showthread.php?t=111236

先声明:

1.本文纯娱乐,本人并不从事制作非法软件的活动…也请读者不要将本文的技术运用到非法领域,否则一切后果自负。

2.我是菜鸟,都是些基本内容。只是看网上很多人搞,又弄的很麻烦,反正自己前两天玩儿了一小下,索性发出来。在ring0搞反反调试似乎已经被某广告鄙视的不行了~所以说我只是娱乐,没有其他目的。我很挫~欢迎批评指正,欢迎交流:http://hi.baidu.com/andriy_aolala/blog

3.本文参考了一些文章,在文末一并感谢

不同游戏的保护驱动版本不太一样,我看的是cf的版本。先用ark初步扫描一下(如果要用xuetr,要先于tp加载,因为它hook了tessafe.sys同样hook的指令,后启动xuetr导致直接重启),我用我以前写的一个ark扫描了一下。

他的hook如下:

代码:

IATkdcom.dllKdSendPacketKdRecivePacket

InlineNtRead/WriteVirtualMemoryKiAttachProcess

CallhookNtOpenThreadNtOpenProcess中的ObReferenceObjectByPointer

此外还有3个Callback,两个系统线程

[/code]

一、首先要解决内核调试的问题,有Windbg才好继续。

代码:

.text:01001532callds:KdDisableDebugger

.text:01001538

.text:01001538loc_1001538:;CODEXREF:.text:01001530j

.text:01001538movedx,ds:KdDebuggerEnabled

.text:0100153Exorecx,ecx

.text:01001540xoreax,eax

.text:01001542incecx

.text:01001543inceax

.text:01001544lockcmpxchg[edx],ecx

.text:01001548testal,al

.text:0100154Ajnzshortloc_1001532

.text:0100154Cretn

[/code]

Ida里面有这么一段,这不新鲜了,直接注册一个LoadImageNotify,启动前IAThookKdDisableDebugger和KdDebuggerEnabled,再inlinehook掉TesSafe.sys里面hook掉KdSendPacketKdRecivePacket的函数,跳转回原函数即可。

至此我们已经可以通过WinDbg调试驱动了。

二、放行OllyIce和CE

Tphook了一大堆,网上写的都是跳来跳去的绕过,但是即使绕过了也有可能过一段时间提示非法软件,原因不明。。总之这么来很费时间。

于是我在其OpenProcess的hook函数里面找到

代码:

.text:01001EBDcallds:IoGetCurrentProcess;得到调用者的eprocess

.text:01001EC3mov[ebp+pEpro],eax

.text:01001EC6push[ebp+pEpro];pEpro

.text:01001EC9callEprocessChk;非常关键的比对函数

.text:01001ECEmovzxeax,al

.text:01001ED1testeax,eax

.text:01001ED3jzshortloc_1001EDA

.text:01001ED5jmploc_1001FC7;返回1的话直接放行

.text:01001FC7moveax,off_100A090

.text:01001FCCorecx,0FFFFFFFFh

.text:01001FCFlockxadd[eax],ecx

.text:01001FD3popf

.text:01001FD4popa

.text:01001FD5movesp,ebp

.text:01001FD7popebp

.text:01001FD8jmpOringinObReferenobjByPointer跳回去

[/code]

我们看看EprocessChk这个函数的伪代码

代码:

char__stdcallEprocessChk(PEPROCESSpEpro)

{

unsignedintv1;//ecx@2

if(pEpro!=(PEPROCESS)dword_100AFAC)

{

v1=0;

if(!process_white_num)

return0;

while(pEpro!=(PEPROCESS)process_white_list[v1])

{

++v1;

if(v1>=process_white_num)

return0;

}

}

return1;

}

[/code]

process_white_list是一个全局数组有0x20个位子,里面存放的是诸如System.exe之类的系统进程eprocess。

代码:

kd>ddtessafe+EEE0

ee1c9ee0863b57c08614cb7886124598861109d0

ee1c9ef086136da0860fc3e8860f6da0860af510

ee1c9f00860afda085fbada00000000000000000

kd>!process863b57c0

PROCESS863b57c0SessionId:noneCid:0004Peb:00000000ParentCid:0000

DirBase:06c28020ObjectTable:e1001e10HandleCount:240.

Image:System

VadRoot863b5050Vads4Clone0Private3.Modified3279.Locked0.

[/code]

这个函数在其所有hook函数里面都存在,对方程序对于系统进程的函数调用是全部放行的。

所以,我们就注册一个CreateProcessNotify把OD和CE加到那个白名单里面~~这样就不用绕hook了。

三、对抗debugport清零

不熟悉debugport的同学可以去看软件调试,这是eprocess中的一个结构,是调试的关键,对方不停清零将导致OD像傻子一样,我看过的对抗方法有两种

1、改内核函数DbgkXXX系列函数中debugport相对于eprocess的偏移值,这个工作量太大,受不了。

2、V大发的重新编译WRK改eprocess结构。。这个倒是很通用啊~

其实对方程序想清零,也要有偏移,在xp中,0xbc是一个特殊的数字,IDA里面直接ATL+I…找到了3~4处,其中一处就是tp程序初始化硬编码。

代码:

char__stdcallIniHardCode(inta1)

{

intv1;//eax@3

if(dword_100A050==5)//这是版本号

{

if(!dword_100A054)

{

v1=a1;

。。。。。。

return1;

}

if(dword_100A054==1)

{

v1=a1;

*(_DWORD*)(a1+4)=0xBCu;//这个值就是dbgport的偏移了

。。。。。。

[/code]

这个函数的参数是一个申请的内存变量地址,保存在全局变量里,我们等其加载完毕后找到这块内存,修改0xbc为0x78(exittime的值),之后就让它丫清零去吧。

四、最后的疑问

1、至此,windbg可正常使用,OD可附加可下断,但tufuzi在其文章中说他会检查硬件断点,所以要hookNtGetContextThread,但我下断这里没见有程序调用。。我下完硬件断点也没见对方有什么反抗。。奇怪啊奇怪

2、虽然CE被加进了白名单,但是会报非法模块,不知其检测机制,驱动里确实找到了教主说的黑名单(名字一遍,特征值一遍),但是两个黑名单自始至终全是零,搞得我以为没有,但是检测函数是实实在在存在的,crctable也存在。我晕啊。

对反调试作者的建议:把你的CV多加一点。。别暴露这么多。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值