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多加一点。。别暴露这么多。。
php反调试,简单对抗某个驱动的反调试相关推荐
- linux 内核驱动 调试,QDMA Linux 内核驱动使用和调试指南
BY Deepesh Man Shakya 注意:本论坛博客所有内容皆来源于Xilinx工程师,如需转载,请写明出处作者及赛灵思论坛链接并发邮件至cncrc@xilinx.com,未经Xilinx及著 ...
- linux下spi flash驱动程序,关于spi flash芯片m25p80驱动以及其简单的mtd驱动分析
项目中用到了spi flash芯片MX25L25635E,之前在uboot下简单分析了驱动代码,调试该flash擦除的bug,一直没有时间分 析内核中关于该芯片的驱动,以下是对该芯片驱动的一个简单分析 ...
- 信捷PLC程序插键槽机全套程序方案,用信捷plc触摸屏伺服驱动,绝对值伺服电机。 实现对两轴伺服进行插键槽控制,对刀快捷,调试简单
信捷PLC程序插键槽机全套程序方案,用信捷plc触摸屏伺服驱动,绝对值伺服电机. 实现对两轴伺服进行插键槽控制,对刀快捷,调试简单. PLC通讯绝对值伺服,回绝对值原点,绝对值伺服电池记忆零点,不用重 ...
- 浅析android手游lua脚本的加密与解密(番外篇之反编译的对抗)
前言 去年在看雪论坛写了一篇<浅析android手游lua脚本的加密与解密>的精华文章,今年写一篇番外篇,将一些lua反编译对抗的内容整合一起,并以3个实例作为说明(包括2018腾讯游 ...
- 关于HMC5883L驱动书写及调试的总结
刚刚结束对传感器HMC5883L的驱动书写及调试工作,虽然之前对相关的各种知识点都有接触,但是在真正从头书写驱动的时候还是遇到了很多不大不小的麻烦,在这里自行总结一下,也是作为以后驱动书写的一个经验教 ...
- mtk驱动camera的调试总结1--原理
关于camera的调试总结主要从原理知识,调试流程及代码流程,调试碰到的问题总结3个方面讲解. camera在手机驱动调试中占了大头,相对比较复杂.主要是他涉及到的原理.代码比较多,名词也比较多.首先 ...
- 关于Linux 驱动以及应用调试信息打印方式总结
1.应用打印调试 1.1 printf printf 是最简单的应用调试打印方式,默认打印在调试串口上,如果有telnet ssh 这些伪终端运行程序,printf 就打印在当前终端上.printf ...
- 驱动开发 - WDK 调试及 SVN 环境搭建[转]
由于从公司辞职了,所以以前在公司里搭建的驱动开发环境也就 Game Over 了, 同样由于那环境是很久以前搭建的,自己也有很多记不清楚的地方了, 而且其中还是有很多需要注意的地方的,所以在这里顺便做 ...
- Linux驱动编程 step-by-step (二) 简单字符设备驱动
简单字符设备驱动 1.主次设备号 主设备号标识设备连接的的驱动,此设备好由内核使用,标识在相应驱动下得对应的设备 在linux中设备号是一个32位的dev_t类型 typedef __u32 _ ...
最新文章
- Python基础06-数据类型:元组tuple
- 自定义Quartz超实用工具类
- TiKV 源码解析系列文章(二)raft-rs proposal 示例情景分析
- c++ 0x8000ffff灾难性故障_《可靠性设计》——故障模式影响分析
- windows 10 使用 VMWare workstation player 启动 windows XP 虚拟机出错的问题
- (水题)洛谷 - P1603 - 斯诺登的密码
- React之组件与模块
- 台式临床化学分析仪行业调研报告 - 市场现状分析与发展前景预测
- 编辑器统一 快捷键
- [转载] Python字符串函数
- win7下硬盘安装Windows
- Algorithm:数学建模大赛(CUMCM/NPMCM)之05B《DVD在线租赁》
- 网络流模型与技巧总结
- 《互联网信息资源检索与利用》读书笔记
- 任正非、董明珠、曹德旺,中国实业三大网红!他们有个共同点:坚决不做一件事!
- COM ---- Inside COM Note
- matlab中的级数怎默算_matlab相关系数计算公式(Pearson和Spearman,以及Kendall Rank)...
- 在Linux系统下安装更换操作系统
- Arduino框架下对ESP32 NVS非易失性存储解读以及应用示例
- Python学习学期专业总结