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

作 者: 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反调试,简单对抗某个驱动的反调试相关推荐

  1. linux 内核驱动 调试,QDMA Linux 内核驱动使用和调试指南

    BY Deepesh Man Shakya 注意:本论坛博客所有内容皆来源于Xilinx工程师,如需转载,请写明出处作者及赛灵思论坛链接并发邮件至cncrc@xilinx.com,未经Xilinx及著 ...

  2. linux下spi flash驱动程序,关于spi flash芯片m25p80驱动以及其简单的mtd驱动分析

    项目中用到了spi flash芯片MX25L25635E,之前在uboot下简单分析了驱动代码,调试该flash擦除的bug,一直没有时间分 析内核中关于该芯片的驱动,以下是对该芯片驱动的一个简单分析 ...

  3. 信捷PLC程序插键槽机全套程序方案,用信捷plc触摸屏伺服驱动,绝对值伺服电机。 实现对两轴伺服进行插键槽控制,对刀快捷,调试简单

    信捷PLC程序插键槽机全套程序方案,用信捷plc触摸屏伺服驱动,绝对值伺服电机. 实现对两轴伺服进行插键槽控制,对刀快捷,调试简单. PLC通讯绝对值伺服,回绝对值原点,绝对值伺服电池记忆零点,不用重 ...

  4. 浅析android手游lua脚本的加密与解密(番外篇之反编译的对抗)

    前言   去年在看雪论坛写了一篇<浅析android手游lua脚本的加密与解密>的精华文章,今年写一篇番外篇,将一些lua反编译对抗的内容整合一起,并以3个实例作为说明(包括2018腾讯游 ...

  5. 关于HMC5883L驱动书写及调试的总结

    刚刚结束对传感器HMC5883L的驱动书写及调试工作,虽然之前对相关的各种知识点都有接触,但是在真正从头书写驱动的时候还是遇到了很多不大不小的麻烦,在这里自行总结一下,也是作为以后驱动书写的一个经验教 ...

  6. mtk驱动camera的调试总结1--原理

    关于camera的调试总结主要从原理知识,调试流程及代码流程,调试碰到的问题总结3个方面讲解. camera在手机驱动调试中占了大头,相对比较复杂.主要是他涉及到的原理.代码比较多,名词也比较多.首先 ...

  7. 关于Linux 驱动以及应用调试信息打印方式总结

    1.应用打印调试 1.1 printf printf 是最简单的应用调试打印方式,默认打印在调试串口上,如果有telnet ssh 这些伪终端运行程序,printf 就打印在当前终端上.printf ...

  8. 驱动开发 - WDK 调试及 SVN 环境搭建[转]

    由于从公司辞职了,所以以前在公司里搭建的驱动开发环境也就 Game Over 了, 同样由于那环境是很久以前搭建的,自己也有很多记不清楚的地方了, 而且其中还是有很多需要注意的地方的,所以在这里顺便做 ...

  9. Linux驱动编程 step-by-step (二) 简单字符设备驱动

    简单字符设备驱动 1.主次设备号 主设备号标识设备连接的的驱动,此设备好由内核使用,标识在相应驱动下得对应的设备 在linux中设备号是一个32位的dev_t类型 typedef __u32    _ ...

最新文章

  1. Python基础06-数据类型:元组tuple
  2. 自定义Quartz超实用工具类
  3. TiKV 源码解析系列文章(二)raft-rs proposal 示例情景分析
  4. c++ 0x8000ffff灾难性故障_《可靠性设计》——故障模式影响分析
  5. windows 10 使用 VMWare workstation player 启动 windows XP 虚拟机出错的问题
  6. (水题)洛谷 - P1603 - 斯诺登的密码
  7. React之组件与模块
  8. 台式临床化学分析仪行业调研报告 - 市场现状分析与发展前景预测
  9. 编辑器统一 快捷键
  10. [转载] Python字符串函数
  11. win7下硬盘安装Windows
  12. Algorithm:数学建模大赛(CUMCM/NPMCM)之05B《DVD在线租赁》
  13. 网络流模型与技巧总结
  14. 《互联网信息资源检索与利用》读书笔记
  15. 任正非、董明珠、曹德旺,中国实业三大网红!他们有个共同点:坚决不做一件事!
  16. COM ---- Inside COM Note
  17. matlab中的级数怎默算_matlab相关系数计算公式(Pearson和Spearman,以及Kendall Rank)...
  18. 在Linux系统下安装更换操作系统
  19. Arduino框架下对ESP32 NVS非易失性存储解读以及应用示例
  20. Python学习学期专业总结

热门文章

  1. Android 仿钉钉、微信 群聊组合头像 CombineBitmap
  2. java 分子 分母_Java写一个类表示分数。分数由分子和分母组成。
  3. Android 蓝牙Wifi配网
  4. java供应链管理系统_供应链管理系统使用JAVA语言的优势
  5. 百度地图API 使用Demo
  6. 微信小程序入门与实战之路由函数与事件冒泡
  7. win10系统镜像Hash值验证
  8. 自动驾驶技术架构和简述
  9. cronolog 安装配置 Centos 7
  10. Java操控Excel