首页
社区
课程
招聘
tELock 0.98 精彩代码
发表于: 2004-6-6 16:51 9172

tELock 0.98 精彩代码

2004-6-6 16:51
9172

; by forgot[uPaCkING SaGa]:)
                call        Delta        ; 重定位
Delta:pop        ebp

                lea        eax, SEH_Handler - Delta[ebp]
                push        eax
                xor        eax, eax
                push        fs:[eax]
                mov        fs:[eax], esp ; 建立 SEH 链表

                int        3                ; EXCEPTION_BREAKPOINT
                nop
                mov        eax, eax

Dr3:        stc
                nop
                lea        eax, ds:1234h[ebx*2]

Dr2:        clc
                nop
                shr        ebx, 5

Dr1:        cld
                nop
                rol        eax, 7

Dr0:        nop
                nop

                xor        ebx, ebx
                div        ebx        ; 除 0 异常
                pop        fs:0        ; 恢复 SEH 链表
                add        esp, 4

                mov        si, 'FG'        ; SoftICE Magic
                mov        di, 'JM'
                mov        al, Counter - Delta[ebp] ; DRx 中断计数器
                .IF        FALSE
; ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
SEH_Handler PROC C pExcept:DWORD,pFrame:DWORD,pContext:DWORD,pDispatch:DWORD
                mov        eax, pExcept
                mov        ecx, pContext        ; ECX -> CONTEXT
                ASSUME        ECX:PTR CONTEXT
                inc        [ecx].regEip        ; CONTEXT.regEip++
                mov        eax, [eax]        ; EAX -> 异常类型
                .IF        eax == EXCEPTION_INT_DIVIDE_BY_ZERO
                                inc        [ecx].regEip ; CONTEXT.regEip++
                                xor        eax, eax        ; EAX =        0
                                and        [ecx].iDr0, eax
                                and        [ecx].iDr1, eax ; CONTEXT.iDr1 =        0
                                and        [ecx].iDr2, eax ; CONTEXT.iDr2 =        0
                                and        [ecx].iDr3, eax ; CONTEXT.iDr3 =        0
                                and        [ecx].iDr6, 0FFFF0FF0h ;        CONTEXT.iDr6 = 0FFFF0FF0h
                                and        [ecx].iDr7, 0DC00h ; CONTEXT.iDr7 = 0DC00h
                .ELSEIF        eax == EXCEPTION_SINGLE_STEP

                                        call        @F
                                        Counter        db    0        ; DRx 中断计数器
                                @@:pop        eax ; EAX -> Counter
                                        inc        byte ptr [eax]        ; 计数器++
                                        sub        eax, eax        ; EAX =        0

                .ELSEIF        eax == EXCEPTION_BREAKPOINT

                                        mov        eax, [ecx].regEbp
                                        lea        eax, Dr0 -        Delta[eax]
                                        mov        [ecx].iDr0, eax

                                        mov        eax, [ecx].regEbp
                                        lea        eax, Dr1 -        Delta[eax]
                                        mov        [ecx].iDr1, eax

                                        mov        eax, [ecx].regEbp
                                        lea        eax, Dr2 -        Delta[eax]
                                        mov        [ecx].iDr2, eax

                                        mov        eax, [ecx].regEbp
                                        lea        eax, Dr3 -        Delta[eax]
                                        mov        [ecx].iDr3, eax

                                        xor        eax, eax
                                        and        [ecx].iDr6, 0FFFF0FF0h
                                        mov        [ecx].iDr7, 155h

                .ELSE

                                push        EXCEPTION_NONCONTINUABLE
                                pop        eax

                .ENDIF
                ASSUME        ECX:NOTHING
                ret
; ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
                .ENDIF
                sub        al, 4
                mov        Counter - Delta[ebp],        al ; DRx 中断计数器
                mov        edx, [ebp+1BAFh]
                and        edx, 0FFFF0000h
                mov        eax, esp
                xor        esp, esp
                mov        esp, eax


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

收藏
免费 9
支持
分享
最新回复 (14)
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
2
啊,缩进还是丢失了
2004-6-6 16:52
0
雪    币: 446
活跃值: (758)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
3
怎么这么短?
晕晕晕,长点嘛~!!!:D
2004-6-6 16:56
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
4
不好整理的说,tE!遍地花指令,还原个源代码都难
2004-6-6 16:58
0
雪    币: 392
活跃值: (909)
能力值: ( LV9,RANK:690 )
在线值:
发帖
回帖
粉丝
5
forgot每次现身都有好东西:p
2004-6-6 17:22
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
6
最初由 cyclotron 发布
forgot每次现身都有好东西:p

过2天可能就没法现身啦
2004-6-6 17:28
0
雪    币: 260
活跃值: (162)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
呵呵 辛苦了
2004-6-6 18:12
0
雪    币: 274
活跃值: (165)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
讲讲Dr6和Dr7的用途吧!
这里这样:
and [ecx].iDr6, 0FFFF0FF0h ; CONTEXT.iDr6 = 0FFFF0FF0h
and [ecx].iDr7, 0DC00h ; CONTEXT.iDr7 = 0DC00h
这里又这样:
and [ecx].iDr6, 0FFFF0FF0h
mov [ecx].iDr7, 155h
2004-6-6 18:16
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
9
最初由 老王 发布
讲讲Dr6和Dr7的用途吧!
这里这样:
and [ecx].iDr6, 0FFFF0FF0h ; CONTEXT.iDr6 = 0FFFF0FF0h
and [ecx].iDr7, 0DC00h ; CONTEXT.iDr7 = 0DC00h
这里又这样:
and [ecx].iDr6, 0FFFF0FF0h
mov [ecx].iDr7, 155h

   |---------------|----------------|
Dr6|                              |BBB                       BBB B |
   |                              |TSD                     3 2 1 0 |
   |---------------|----------------|
Dr7|RWE LEN   ...      RWE LEN    |  G                  GLGLGLGLGL |
   | 3   3    ...      0    0     |  D            E E 3 3 2 21 100 |
   |---------------|----------------|
31                               15                                0

Dr0~3用于设置硬件断点,即在调试器中经常使用的bpm断点,由于只有4个断点寄存器,所以最多只能设置4个bpm断点。Dr7是一些控制位,用于控制断点的方式,Dr6用于显示是哪些引起断点的原因,如果是Dr0~3或单步(EFLAGS的TF)或由于GD置位时访问调试寄存器引起1号调试陷阱的话,则相应设置对应的位。下面对Dr6和Dr7的对应位做一些详细介绍:

调试控制寄存器Dr7:
==========
位0 L0和位1 G0:用于控制Dr0是全局断点还是局部断点,如果G0置位则是全局断点,L0置位则是局部断点。
G1L1~G3L3用于控制D1~Dr3,其功能同上。

LEN0:占两个位,开始于位15,用于控制Dr0的断点长度,可能取值:
                00         1字节
                01  2字节
                10         保留
                11  4字节
RWE0:从第17位开始,占两个位,控制Dr0的断点是读、写还是执行断点或是I/O端口断点:
                00  只执行
                01        写入数据断点
                10        I/O端口断点(只用于pentium+,需设置CR4的DE位)
                11        读或写数据断点
RWE1~3,LEN1~3分别用于控制Dr1~3的断点方式,含义如上。

还有一个GD位:用于保护DRx,如果GD位为1,则对Drx的任何访问都会导致进入1号调试陷阱。即IDT的对应入口,这样可以保证调试器在必要的时候完全控制Drx。

调试状态寄存器Dr6:
=========
该寄存器用于表示进入陷阱1的原因,各个位的含义如下:
B0~B3,如果其中任何一个位置位,则表示是相应的Dr0~3断点引发的调试陷阱。但还需注意的是,有时候不管GiLi如何设置,只要是遇到Drx指定的断点,总会设置Bi,如果看到多个Bi置位,则可以通过GiLi的情况判断究竟是哪个Dr寄存器引发的调试陷阱。
BD置位表示是GD位置位情况下访问调试寄存器引发的陷阱。
BT置位表示是因为TS置位即任务切换时TSS中TS位置1时切到第二个任务时第一条指令时引发的。
BS置位表示是单步中断引发的断点。。。。即EFLAGS的TF置位时引发的调试陷阱。

注意I/O端口断点是586+以上CPU才有的功能,受CR4的DE位的控制,DE为1才有效。(DE是CR4的第3位)。
2004-6-6 18:32
0
雪    币: 260
活跃值: (162)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
佩服佩服! forgot兄资料很全啊
2004-6-6 18:37
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
11
最初由 vcasm 发布
佩服佩服! forgot兄资料很全啊

9GB,整个F盘都是这种东西
2004-6-6 18:41
0
雪    币: 260
活跃值: (86)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
12
最初由 vcasm 发布
佩服佩服! forgot兄资料很全啊

开个ftp共享共享,我全拖下来
2004-6-6 21:34
0
雪    币: 109
活跃值: (36)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
13
最初由 pll621 发布

开个ftp共享共享,我全拖下来


pll621把你的shell共享啊!:D
2004-6-6 21:39
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
14
最初由 pll621 发布

开个ftp共享共享,我全拖下来

把我机器拖垮了,好多代码是[NOT FREE]地呀:D :D :D
2004-6-6 21:40
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
2004-10-10 12:35
0
游客
登录 | 注册 方可回帖
返回
//