首页
社区
课程
招聘
加壳技术--DRx解码阻止调试
发表于: 2004-6-25 19:38 10634

加壳技术--DRx解码阻止调试

2004-6-25 19:38
10634
这些代码是从我逆向出hying外壳原码得来,有些描述不准确,凑合看吧

;//////////////////////////////////
;//drx 解码

        Call    Push_drx_handler

Drx_handler    Proc Near

Pframe        = Dword    Ptr  4
Pcontext        = Dword    Ptr  0ch

        Mov    Eax, [esp+pframe]
        Mov    Eax, [eax]                ; Eax =        Pframe->exceptioncode
        Mov    Ecx, [esp+pcontext]    ; Ecx -> Context

        Inc    Dword Ptr [ecx+0b8h] ; Context.regeip++

        Cmp    Eax, Exception_breakpoint
        Jnz    Drx_not_breakpoint

        Mov    Eax, [ecx+0b4h]    ; Eax <- Context.regebp
        Lea    Eax, [drx_0-@symbiont_start][eax]
        Mov    [ecx+4], Eax    ; Dr0

        Mov    Eax, [ecx+0b4h]    ; Eax <- Context.regebp
        Lea    Eax, [drx_1-@symbiont_start][eax]
        Mov    [ecx+8], Eax    ; Dr1

        Mov    Eax, [ecx+0b4h]
        Lea    Eax, [drx_2-@symbiont_start][eax]
        Mov    [ecx+0ch], Eax    ; Dr2

        Mov    Eax, [ecx+0b4h]
        Lea    Eax, [drx_3-@symbiont_start][eax]
        Mov    [ecx+10h], Eax    ; Dr3

        Xor    EaxEax
        And    Dword Ptr [ecx+14h], 0ffff0ff0h    ; 11111111111111110000111111110000b
        Mov    Dword Ptr [ecx+18h], 155h ; 101010101b
        Jmp    Drx_ret

Drx_not_breakpoint:
        Cmp    Eax, Exception_single_step
        Jnz    Drx_not_single
        Call    Drx_get_counet

        Dd        0    ; 记录单步断点出现次数

Drx_get_counet:
        Pop    Eax
        Inc    Dword Ptr [eax]
        Mov    Eax, [eax]
        Cmp    Eax, 1        ; Dr0
        Jnz    Loc_401341
        Not    Dword Ptr [ecx+0b0h] ; Context.regeax
        Jmp    Drx_processed

Loc_401341:
        Cmp    Eax, 2        ; Dr1
        Jnz    Loc_401357
        Mov    Eax, [ecx+0b0h]    ; Eax <- Context.regeax
        Rol    Eax, 13h
        Mov    [ecx+0b0h], Eax    ; Eax -> Context.regeax
        Jmp    Drx_processed

Loc_401357:
        Cmp    Eax, 3        ; Dr2
        Jnz    Loc_401385

        Add    Dword Ptr [ecx+0b0h], 78787878 ; Context.regeax        += 78787878h

        Mov    Eax, [ecx+0b0h]    ; Eax <- Context.regeax
        Mov    Ebx, [ecx+0a4h]    ; Ebx <- Context.regebx

        Xchg    AxBx
        Add    AxBx

        Mov    [ecx+0b0h], Eax    ; Eax <- Context.regeax
        Mov    [ecx+0a4h], Ebx    ; Ebx <- Context.regebx
        Jmp    Drx_processed

Loc_401385:
        Mov    Eax, [ecx+0a0h]    ; Dr3
                    ; Eax <- Context.regesi

        Xor    Byte Ptr [eax],    55h

Drx_processed:

        Xor    EaxEax
        Jmp    Drx_ret

Drx_not_single:
        Cmp    Eax, Exception_int_divide_by_zero
        Jnz    Drx_cannot_process

        Inc    Dword Ptr [ecx+0b8h] ; Context.regeip++        (2 Byte        Code)
        Xor    EaxEax
        And    [ecx+4], Eax    ; Context.idr0 <- 0
        And    [ecx+8], Eax    ; Context.idr1 <- 0
        And    [ecx+0ch], Eax    ; Context.idr2 <- 0
        And    [ecx+10h], Eax    ; Context.idr3 <- 0
        And    Dword Ptr [ecx+14h], 0ffff0ff0h    ; Context.idr6 <- 0ffff0ff0h
                                                            ; 清 Bt,bs,bd,b3,b2,b1,b0 位
        And    Dword Ptr [ecx+18h], 0dc00h ; 仅保留 Gd,ge 位
        Jmp    Drx_ret

Drx_cannot_process:
        Xor    EaxEax
        Inc    Eax

Drx_ret:
        Ret

Drx_handler    Endp

Push_drx_handler:

        Xor    EaxEax
        Push    Dword Ptr    Fs:0
        Mov    Fs:0, Esp

        Int    3        ; 设置 Drx
        Nop            ; Int 3        后紧跟 Nop 通常是为了兼容某些系统

        Mov    EcxEbp
        Sub    EcxEsi
        Xor    EbxEbx
        Xor    EaxEax

Drx_crc_13db:
        Lodsb
        Add    EbxEax
        Loop    Drx_crc_13db
        Mov    EaxEbx

Drx_0:
        Clc            ; Not Eax
        Nop
        Lea    Esi, [drx_1-@symbiont_start][ebp]
        Mov    Ecx, @sumbiont_end-drx_1

Drx_decode_13ef:
        Mul    Ecx
        Ror    EaxCl
        Xor    [esi], Al
        Inc    Esi
        Inc    Eax
        Aam
        Loop    Drx_decode_13ef

        Mov    Ecx, Drx_handler-@symbiont_start ; Esi -> Loader Data
        Mov    EsiEbp                                    ; Mem Ptr Start
        Xor    EaxEax

Drx_crc_1404:
        Xor    Al, [esi]
        Ror    Eax, 8
        Inc    Esi
        Loop    Drx_crc_1404

Drx_1:

        Cld    ; Rol          Eax, 13h
        Nop
        Mov    Ecx, @sumbiont_end-drx_2
        Lea    Esi, [drx_2-@symbiont_start][ebp]

Drx_decode_1419:
        Lea    Eax, [ecx+eax*4+key_1] ; 43h
        Xor    [esi], Al
        Aam
        Inc    Esi
        Loop    Drx_decode_1419

        Mov    Ecx, Drx_2-push_drx_handler
        Shr    Ecx, 2        ; Ecx /= 4 (sizeof Dword)
        Lea    Esi, [push_drx_handler-@symbiont_start][ebp]
        Xor    EbxEbx

Drx_crc_1434:
        Lodsd
        Xor    EbxEax
        Loop    Drx_crc_1434

Drx_2:
        Stc            ; Add                Eax, 78787878h
                        ; Xchg        Ax, Bx
                        ; Add                Ax, Bx
        Nop
        Mov    Ecx, @sumbiont_end-drx_3
        Shr    Ecx, 2
        Lea    Esi, [drx_3-@symbiont_start][ebp]

Drx_decode_1449:
        Xor    EdxEdx
        Mul    Ebx
        Add    Edx, 78787878
        Xor    [esi], Edx
        Mov    EaxEbx
        Mov    EbxEdx
        Add    Esi, 4
        Loop    Drx_decode_1449

        Lea    Esi, [crypted_code_start-@symbiont_start][ebp]
        Mov    Ecx, @sumbiont_end-crypted_code_start

Drx_decode_1469:
        Not    Byte Ptr [esi]

Drx_3:
        Nop            ; Xor          Byte Ptr [esi], 55h
        Nop
        Inc    Esi
        Loop    Drx_decode_1469

Crypted_code_start:

        Mov    Eax, 100h
        Xor    EdxEdx
        Xor    EbxEbx
        Div    Ebx        ; :d
        Nop

        Pop    Dword Ptr    Fs:0
        Pop    Eax

[课程]Linux pwn 探索篇!

收藏
免费 8
支持
分享
最新回复 (13)
雪    币: 266
活跃值: (269)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
2
good
2004-6-25 19:57
0
雪    币: 392
活跃值: (909)
能力值: ( LV9,RANK:690 )
在线值:
发帖
回帖
粉丝
3
收藏!
2004-6-25 21:21
0
雪    币: 274
活跃值: (165)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
Int    3        ; 设置 Drx
        Nop            ; Int 3 后紧跟 Nop 通常是为了兼容某些 Cpu

好象是跟操作系统有关。
2004-6-25 22:28
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
5
最初由 老王 发布
Int 3 ; 设置 Drx
Nop ; Int 3 后紧跟 Nop 通常是为了兼容某些 Cpu

好象是跟操作系统有关。

不清楚啦:o
2004-6-25 23:54
0
雪    币: 392
活跃值: (909)
能力值: ( LV9,RANK:690 )
在线值:
发帖
回帖
粉丝
6
最初由 老王 发布
Int 3 ; 设置 Drx
Nop ; Int 3 后紧跟 Nop 通常是为了兼容某些 Cpu

好象是跟操作系统有关。


什么操作系统会有问题?我试了Win2k和WinXP都没有问题……
2004-6-26 00:16
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
7
个别极端版本:D
2004-6-26 00:20
0
雪    币: 274
活跃值: (165)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
9X与NT,发生INT3异常时,context.EIP不一样。
2004-6-26 00:29
0
雪    币: 260
活跃值: (162)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
最初由 老王 发布
Int 3 ; 设置 Drx
Nop ; Int 3 后紧跟 Nop 通常是为了兼容某些 Cpu

好象是跟操作系统有关。


是的  和操作系统有直接关系
比如98和XP在int3的时候处理结果会有不同
2004-6-26 05:40
0
雪    币: 260
活跃值: (162)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
呵呵 我的做法是不去管操作系统之间不同的地方
直接产生一个异常 SEH里面捕获各种结果在以后的异常处理中加以利用
2004-6-26 05:42
0
雪    币: 260
活跃值: (162)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
最初由 cyclotron 发布


什么操作系统会有问题?我试了Win2k和WinXP都没有问题……


不同的操作系统有区别的
int3的异常发生以后  SEH的context.Eip 有2种可能
1: int3处的EIP
2: int3下个一个指令的EIP
2004-6-26 05:45
0
雪    币: 255
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
好文~!
2004-6-26 08:15
0
雪    币: 266
活跃值: (191)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13
2004-6-26 15:27
0
雪    币: 227
活跃值: (130)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
版主一张贴,省我十本书~!
kimmal的签名是有意思
2004-6-26 15:40
0
游客
登录 | 注册 方可回帖
返回
//