首页
社区
课程
招聘
[原创]针对某游戏保护DebugPort清零的一次逆向。
发表于: 2012-5-14 11:04 17719

[原创]针对某游戏保护DebugPort清零的一次逆向。

2012-5-14 11:04
17719
第一次发帖。LZ很菜的哦。大牛请忽略本帖。
首先还是先了解一下DebugPort吧,百度之后得到了如下结果

-------------------------------此处转贴------------------------------------
每个进程都有一个数据结构,EPROCESS,这个结构是在内核里面的,系统用来标识和管理每一个win进程的基本数据结构.

这个结构中包含了一个重要的字段,DebugPort,如果一个进程不在被调试的时候那么就是NULL,否则他是一个指针,win前,这个成员保存的是用于接收调试事件的LPC端口对象指针.发生调试时,系统会向这个端口发送调试信息. 

Winxp下因为使用了专门用于调试的内核对象DebugObject,所以debugport指向的是一个DebugObject对象,不管是指向LPC端口还是指向调试对象,虽然类似不同吧~~~ 
但是他们的作用都是用来传递调试事件的,所以debugport中指向的对象,我们就叫做调试端口 

张奎银大牛,告诉了我们,这个端口是链接调试器进程和被调试进程的纽带~ 
被调试程序的事件由这个端口发送到调试器进程的。   
(so,某些产品,为了不被调试就一直对这个字段写入0,导致调试事件无法发送,造成了调试器像傻子一样~~)
-----------------------------------------------------------

调试内核,最先想到的肯定是windbg,于是LZ碰到了第一个问题,那个T什么的保护禁止了双机调试。下面给出过掉防止双机调试的方法。

KDCOM.dll:KdReceivePacket  //这两个是COM串口的接受和发送数据
KDCOM.dll:KdSendPacket      //主要用来方式别人双机调试 
上面两个函数几乎可以忽略掉,VirtualKD这个工具自己实现了COM通信替代了上面两个函数。

然后是。。。是。。。
KdDisableDebugger,ok过掉对这个函数的调用应该就可以进行双机调试了。
启动虚拟机调试模式,windbg对KdDisableDebugger下断点,然后运行游戏。
发现游戏登陆之前windbg就已经断下来了,eb指令对KdDisableDebugger第一行代码写入C3(ret)

然后F8单步执行找到调用KdDisableDebugger处

仔细看代码不难发现这是一段循环调用KdDisableDebugger的代码。eb对上图中edcaa6d5出写入74过掉此处
F5跑起来会再次断下来,单步执行返回到另一处调用


尾部mov     dword ptr [ecx],eax这句很关键,不能让他执行,一旦执行windbg就失去通信了
对上图中edcaa803位置写入75然后F5跑起来  再次断下来发现调用位置还是上面这里。
修改CALL EAX上面那行也就是edcaa7c4位置写入75再次跑起来就不会再断下来了 游戏正常运行。
但是游戏登陆以后,保护会出现错误重新加载一次保护,然后按照上面的方法重新过一次就可以了。

接下来就等游戏跑起来以后 windbg手动断下来,命令行键入!process 0 0回车
得到当前所有进程的EPROCESS对象地址

注意这里完成后要让虚拟机尽快跑起来,中断久了游戏会和服务器断开连接。
好了会找到两个游戏进程,接下来虚拟机里面打开任务管理器,查看当前游戏的进程ID转换16进制


转换后就是上面获取到的CID:0370
然后对PROCESS 85f5d228 这个地址+BC处下数据写入断点,+bc就是DebugPort地址了
指令 ba w 4[85f5d228 +bc]   //ba指令格式ba Access Size [地址] Access为访问方式 Size为监控访问位置大小

然后跑起来,立马就会断下来,这里注意多跑几次,有两个地方做了清零如下图
第一处:



第二处:



xor     ecx,ecx
xchg    ecx,dword ptr [eax]

还有。。。

xor     eax,eax
xchg    eax,dword ptr [edi]
这两个地方。
好了位置找到了,收工。
另外传说中的监控线程在哪里在哪里在哪里。。。怎么找怎么找。。。   求大牛指教呀  完全没有思路,找不到入手点。。。

[课程]FART 脱壳王!加量不加价!FART作者讲授!

上传的附件:
收藏
免费 6
支持
分享
最新回复 (19)
雪    币: 130
活跃值: (1005)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
TP吧?
干掉线程就作废了
2012-5-14 11:46
0
雪    币: 1505
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
3
论坛里面有很多过debugport的办法,不过都是原理简单,实现复杂.

我还是激励下现在做TP以及其它有用debugport清零方案保护游戏的同学好了:

搜全局变量,改为其它的.
2012-5-14 20:34
0
雪    币: 107
活跃值: (326)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
有点意思啊...前排占位...

慢慢学习哦..呵呵..楼主好样的.
2012-5-14 21:13
0
雪    币: 226
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我也要留位子
2012-5-14 22:04
0
雪    币: 508
活跃值: (202)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
6
在清0的地方下读断点吧
2012-5-15 06:46
0
雪    币: 124
活跃值: (38)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
占坑 看看。。
2012-5-15 11:03
0
雪    币: 101
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
一起研究吧,加我群 游戏辅助驱动学习QQ群:84031558
2012-5-15 19:13
0
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
不错啊

写的很好
2012-5-15 21:47
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
马克
2012-5-16 07:08
0
雪    币: 255
活跃值: (197)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
哎 过了OD附加 还有一堆非法框等着乃
2012-5-16 18:08
0
雪    币: 274
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
路过,帮顶~~
2012-5-17 09:20
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
有点看不懂了!~
2012-5-17 09:36
0
雪    币: 87
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
好文,学习一下
2012-5-17 10:12
0
雪    币: 270
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
过TP都不用写驱动,得猥琐
2012-5-17 14:40
0
雪    币: 584
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
看不懂哦,俺太菜菜了吧
2012-5-25 13:18
0
雪    币: 284
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
某楼有正解,检测线程找到后xx。这文章写的还不错··
检测线程下BC读取 硬件断点
2012-5-28 00:09
0
雪    币: 263
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
搞那么麻烦做什么,自己构建调试子系统就行。

上传的附件:
  • 2.JPG (182.67kb,39次下载)
2012-9-25 18:46
0
雪    币: 122
活跃值: (75)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
19
学习了
2012-9-25 19:35
0
雪    币: 64
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
mark。。
2012-9-25 20:45
0
游客
登录 | 注册 方可回帖
返回
//