首页
社区
课程
招聘
[原创]某P的debugport的另一种过法。
发表于: 2013-8-3 23:01 12615

[原创]某P的debugport的另一种过法。

2013-8-3 23:01
12615

继上一次过掉双击调试之后,利用它的思想,又相继过掉了那几个函数和debugport。刚才在虚拟机里面,OD加载之后,有模块,可下段,没又sx非法之类报错。但是过了一会游戏退出了。不知道是不是跟我虚拟机配置不够有关?总之能调试附加,给我这新人一大信心。

开始说debugport的过法。看了以前好多帖子,都是修改TP,最近,有人也是修改TP,另外pass crc校验。我不会找crc校验,希望有大牛来指点我一下。于是另外想了一种办法。
先上反汇编代码:

b0dc627e 895c3804        mov     dword ptr [eax+edi+4],ebx
b0dc6282 8b3dc472ddb0    mov     edi,dword ptr [TesXXXX+0x132c4 (b0dd72c4)]
b0dc6288 8b7f1c          mov     edi,dword ptr [edi+1Ch]
b0dc628b 0379b8          add     edi,dword ptr [ecx-48h]
b0dc628e 33c0            xor     eax,eax
b0dc6290 ab              stos    dword ptr es:[edi]
b0dc6291 ab              stos    dword ptr es:[edi]
b0dc6292 8b3dc472ddb0    mov     edi,dword ptr [TesXXXX+0x132c4 (b0dd72c4)]
b0dc6298 8b7f04          mov     edi,dword ptr [edi+4]
b0dc629b 0379b8          add     edi,dword ptr [ecx-48h]
b0dc629e 33c0            xor     eax,eax
b0dc62a0 8707            xchg    eax,dword ptr [edi]//这里清0

一处清零的地方。我从上面跟下来,发现,debugport的偏移0xbc让他存在了一个局部变量中。

那么,跟到这个局部变量赋值的地方。

b0e6XXXX 0f85d2000000    jne     TesXXXX+0x783c (b0e6XXXX)
b0e6XXXX 8b4508          mov     eax,dword ptr [ebp+8]
b0e6XXXX c74004bc000000  mov     dword ptr [eax+4],0BCh//这里赋值。
b0e6XXXX c7400c30010000  mov     dword ptr [eax+0Ch],130h
b0e6XXXX c74010a0010000  mov     dword ptr [eax+10h],1A0h
b0e6XXXX c7004c020000    mov     dword ptr [eax],24Ch
b0e6XXXX c740141c010000  mov     dword ptr [eax+14h],11Ch

这段代码大体意思,判断当前系统版本。然后会给一些偏移。。。别的不管,我只管0xbc

然后,我可以在b0e6XXXX c7400c30010000  mov     dword ptr [eax+0Ch],130h
下硬件断点。然后HOOK INT1 中断。然后悄无声息的将eax+4的内容改为别的。我发现118这个偏移不错。

然后。。。。某P开始疯狂对这个地址清0.

好了。想法就是这样。(之前有人说到律师函之类,所以锁了一些修饰。希望不会引火。)
上代码:

下硬件断点。
                __asm
                {
                        mov eax,hookaddr
                        mov DR0,eax
                        mov eax,2
                        mov DR7,eax
                }

void __declspec (naked) My_Kitrap1()
{
                _asm
                {   
                        //保存环境;
                        pushfd
                        pushad
                        mov ebx,eax
                        mov ecx,XxxPBASE
                        add ecx,0x7774
                        mov eax,dr0
                        cmp eax,ecx
                        jne jmpoldtrap01
                        mov eax,dr6
                        and eax,1
                        cmp eax,1
                        jne jmpoldtrap01
                        mov word ptr [ebx+4],0x118
                        mov eax,0
                        mov dr0,eax
                        popad
                        popfd
                        iretd
jmpoldtrap01:
                        popad
                        popfd
                        push  0
                        mov   word ptr [esp+2],0
                        jmp originalkitrap1addrjmpaddr
                }
}

大体 就这样吧。

现在我有几个问题,想问,麻烦大牛给小弟解解惑。

1,某P现在加了object hook?这个会有什么影响呢?难道推出的原因是他?

2,虚拟机,我只用了单核,多核的时候就会出错。  我IDThook的时候是inline hook的。
多个CPU的时候,他们的INT1 的地址应该都一样吧? 难道我下硬件断点的时候,还需要对多个CPU下?dr0-7这几个硬件断点到底是属于线程的还是属于CPU呢?基础很差啊我。
3,刚开始我OD附加的时候,没有模块,没有CPU的内容。OD附加了之后,也不退出,就是什么都没有。后来突然想起来,加了个驱动。就是HOOK NTSetThreadInformation 这个函数的。居然能成了。。哦对了。想到这好像有点印象了。。。他调用了这个函数,防止调试器获取异常?对吧。。。。

先问这些吧。睡觉去了。晚安。


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 5
支持
分享
最新回复 (15)
雪    币: 70
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
每个CPU都有一张IDT表。。。,windbg可以直接下ba断点的,(想想保护是怎么限制硬断的?动动脑筋,很简单)
2013-8-4 02:02
0
雪    币: 70
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
object hook 是把DEBUG_ALL_ACCESS 改成了0,这样所有进程都被设置了
你搞的太复杂了。。。
2013-8-4 02:05
0
雪    币: 119
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
楼主是用的哪款游戏做的实验?因为不同的腾*。。讯的游戏,某P版本不一样,hook的地方也不一样。。小菜没法照着学习。
2013-8-4 11:09
0
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5
如果你是在内核下,
dr0-7这几个硬件断点属于cpu,你要把全部cpu都设置一遍,注意,是全部哦,像IDThook那样.
2013-8-4 11:29
0
雪    币: 15
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
斗X衣申
2013-8-4 13:30
0
雪    币: 15
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
在双核CPU的虚拟机中,存在以下问题。

   __asm
    {
      mov eax,hookaddr
      mov DR0,eax
      mov eax,2
      mov DR7,eax
      int 3
    }
用这个下写入DR0后,在int 3 的地方。断下来,然后windbg中查看两个CPU的kprcb结构中的processorstate结构中的context结构中的dr0,发现竟然没有一个是我设置的值。。。都为0.
很是不解。

在windbg中的register栏中的dr0这地方明明可以显示的dr0是我写入的值啊。。。

这样直接导致,我下的硬件断点,程序执行的时候根本不断下来。。。

不知道怎么入手了。一会看看虚拟机单核CPU是否也存在这样的情况。
2013-8-4 20:13
0
雪    币: 42
活跃值: (26)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
帅气  给了我们思路  马克
2013-8-4 20:26
0
雪    币: 9720
活跃值: (2531)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
mark吧
2013-8-4 22:55
0
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
10
我告诉你为什么,因为windows每次从ring3切换到ring0,都会把dx寄存器全部清空,所以,你必须
设置dr7寄存器的全局断点,然后判断是否系统想修改寄存器,是的话,就跳过,否则,我打赌,你没理解我这里说的,你永远也找不到你的程序出错的原因.
2013-8-5 09:18
0
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
楼主的方法是 是将debugport的地址给改掉了,让TP不断的向无用的地址写入0
2013-8-5 11:21
0
雪    币: 119
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
呵呵。谢谢
2013-8-5 12:06
0
雪    币: 15
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
13
亲,我承认我看你上面给我的回帖的时候。没仔细看你那后半句,需要设置全部CPU的DR7。。。我设置的就是全局断点。。。我现在按照你说的,我试试。。。。。
2013-8-5 16:04
0
雪    币: 433
活跃值: (1910)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
14
楼主ID:一身膘...
2013-8-5 19:21
0
雪    币: 13
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
mark关注中
2013-8-8 09:09
0
雪    币: 134
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
关注。。。。。。。。。。。。。
2013-8-14 23:25
0
游客
登录 | 注册 方可回帖
返回
//