首页
社区
课程
招聘
又灌水-反(调试/跟踪/脱壳) 技术集锦
发表于: 2004-5-27 14:50 14433

又灌水-反(调试/跟踪/脱壳) 技术集锦

2004-5-27 14:50
14433

反(调试/跟踪/脱壳) 技术集锦
kongfoo/2004.4.18-5.27

  具体代码就不贴了,知道原理就可以写出代码。一些是实践所得,一些是别人的成果,也
都收集在一起了。解密、加密这个攻防战好像和传统作战的攻防战不同,防的一方能用的技术
远远多于攻的一方。

  1)花指令
  很无聊的技巧,但也有一定作用:隐藏指令,干扰分析。

  2)花循环
  无用循环,让跟踪者浪费时间,心烦。

  3)时间比较
  经典的反跟踪技巧,单步跟踪比连续执行的时间长很多。

  4)父进程检查
  被调试器加载后父进程就不是通常的Explorer.exe。

  5)检查调试器
  Windows本身就提供一些API可以用来检查调试器是否存在。如IsDebuggerPresent/NtQueryInformationProcess。
另外还有CreateFile/PEB(和IsDebuggerPresent一样)等方法检查调试器。

  6)动态加/解密代码
  干扰分析。把执行过的代码重新加密可以防止跟踪者翻看代码。

  7)IAT加密
  防止ImpREC等工具的自动脱壳修复,加大脱壳难度。

  8)指令摘取
  有很多方式,从OEP处摘取指令,随机摘取一段指令等,加大脱壳难度。摘取的指令还可变形处理。

  9)CALL处理
  根据CALL指令本身特点,让其先CALL进壳的空间,加大脱壳难度。

  10)自调试
  对于一个程序,Windows只允许这个程序被一个调试器调试,基于此,采用双进程或多进程方式,
自已调试自己,加大跟踪难度。另外,通过设置某中断地址,使程序发生某中断时执行程序中的中断
处理代码,进行解码、指令摘取等动作,加大跟踪难度。

  11)异常处理机制
  人为产生异常,改变程序流程或在异常处理时进行解码,加大跟踪难度。常见的异常有内存存取
错误异常,中断异常(INT3/单步/其它中断等),非法指令,非法EIP等。

  12)多线程的运用
  利用被调试程序所有线程会被挂起的特点,达到干扰跟踪的目的。一,用多线程改变程序流程:在
线程中修改主线程代码,如果被单步跟踪线程将不会运行,流程也就不对了。二,用多线程解码:同理,
线程不能运行解码也就不能进行。

  13)反SMC
  用Timer/线程不断地将敏感的内存空间的属性设置成只读,可以防止被打补丁。

  14)CRC校验
  代码被修改之后CRC检验值就不同了。

  15)破坏调试环境
  破坏调试寄存器内容,破坏中断处理地址或自己接管中断处理等,从根本上反调试。

  16)反进程转存
  将某个不会用到的代码空间设置成NO_ACCESS,LordPE等工具dump到这个空间时就
会异常而dump不了啦。

  17)监视键盘
  监视F7、F9就够了。

  18)固定屏幕
  在壳运行期间把屏幕固定,跟踪者看都不看到,当然跟不了。

  19)破坏异常处理环境
  用SetUnhandledExceptionFilter破坏异常处理环境,使调试器无法捕捉程序产生的异常。

  20)调试父进程
  利用调试函数的特点,即被调试进程会被挂起的特点,反单步跟踪。

  21)Arm的CC保护,CopyMem-II保护
  把所有跳转改成CC,父进程检测到INT3中断时查表改EIP去到正常的位置。
  CopyMem-II就是把自己复制到另一块内存中去运行,哪么dump的时候就麻烦些啦。

  22)反attach分析
  执行过的代码就破坏掉,防止attach分析。另外,生成一个指明不能用调试器的进程之后本
身进程直接退出,可防attach。(NT系统有效)

  23)指令预取
  利用CPU会预读取指令的特点,干扰单步跟踪。如:
      mov word ptr [@@],20cdh
    @@:
      nop
      nop
  正常情况下CPU预读了2个nop,而不会执行INT 20(cd20),但单步跟踪下来就不同了。

  24)写代码时的反调试
  对加壳选项的不同而生成不同的代码,这样可以有效地防止脱壳机的patch。只用标志位
来判断是否加密IAT是很危险的。

  25)随机存放敏感数据
  如果用jmp OEP的方式去OEP,并且代码位置是固定的,哪么写脱壳机时OEP就随手可得了,
所以使代码不定长,或把敏感数据隐藏起来是很好的对策。另外一些壳运行时要用的原程序的
参数放在程序里面比一堆地放在壳后面更安全得多。

  26)反汇编
  把自己作为一个指令解释器,反汇编自身代码并解释执行,这样就可以防止指令被改。

  软件设计的复杂性比单纯的反调试技巧更有效。加密算法的运用更是有力的反脱壳措施。
anti技巧的安排也很重要,比如子程序里面放anti代码要更好些,因为跟踪者要先过双进程
这一关;解码前设置anti dump比解码后设置更好些,因为解码后立即用LordPE的话anti dump
就形同虚设了。

  还有很多反调试技术是我未能收集到的,跟贴吧:)


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

收藏
免费 10
支持
分享
最新回复 (24)
雪    币: 279
活跃值: (375)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
2
Good.
补:
1、Hook Api,防止api下断
2、编写驱动程序,接管int1,int3等实现反跟踪
2004-5-27 17:53
0
雪    币: 371
活跃值: (790)
能力值: ( LV12,RANK:570 )
在线值:
发帖
回帖
粉丝
3
lordor兄的WinPE进展如何了?:)
2004-5-27 23:02
0
雪    币: 279
活跃值: (375)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
4
进展极慢,现在在忙别的事
2004-5-28 09:19
0
雪    币: 227
活跃值: (130)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
例子?
2004-5-28 20:00
0
雪    币: 241
活跃值: (21)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
指令预取我试了几次,好象就没成功过。
你们试成功了吗?
2004-5-28 22:32
0
雪    币: 260
活跃值: (162)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
最初由 hying 发布
指令预取我试了几次,好象就没成功过。
你们试成功了吗?


指令预取现在好像已经不能作为反跟踪手段了  在DOS时代可行  现在根本没用
2004-5-29 00:08
0
雪    币: 260
活跃值: (162)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
其实反跟踪 反调试 可以用多进程间相互解码控制eip跳转 然后里面用上楼主的一些方法  这样也许事半功倍
2004-5-29 00:20
0
雪    币: 227
活跃值: (130)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
指令预取必须在RING 0级才能实现!具体的看XPROTECTOR
2004-5-29 01:42
0
雪    币: 371
活跃值: (790)
能力值: ( LV12,RANK:570 )
在线值:
发帖
回帖
粉丝
10
没成功。
我觉得这跟CPU的设计有关。
=======整理自《intel系统微处理器结构,编程和接口大全》=========
386工作在流水线方式下时,CPU在当前指令执行完成前预读一条指令。
486加入cache机制,但同一cache同时存放数据或指令。Pentium的cache
每个8K,分别用于数据缓存和指令缓存。
===============================================================
CPU的指令预取的目的是提高指令执行效率,但当指令发生改变时缓存里
旧的指令就应丢弃,否则将会造成混乱。
我想CPU的指令预取技术刚开始时没有注意到程序会自己改代码的情况,
(正常情况下代码段是不可改的)所以没有比较、更新指令流的措施,
所以就有了利用这种机制反跟踪的技术。随着CPU指令预取技术的成熟,
(cache匹配)这种情况就不存在了。(如果xpr在ring0能控制cache的
控制寄存器使cache不更新指令流(禁止cache匹配)又另当别论了)
猜测一下,讨论讨论:D
2004-5-29 10:07
0
雪    币: 260
活跃值: (162)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
我也在0环做过测试 好像行不通  也许是需要禁止cache匹配才能行的通
2004-5-30 00:01
0
雪    币: 227
活跃值: (130)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
你在驱动中测试过?
2004-5-30 06:04
0
雪    币: 260
活跃值: (162)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13
最初由 iceplus 发布
你在驱动中测试过?


我只是在以前的驱动中加入了几条汇编测试  :(  好像无效
其实不要驱动,直接编写DOS程序测试效果应该也一样,可惜我没有纯DOS启动盘,不好测试
2004-5-30 10:08
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
14
预取指令现在应该是无效的,我用SEH自调试,监视一段指令,还是挂了。
2004-5-30 14:39
0
雪    币: 227
活跃值: (130)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
绝对是有效的,用SOFTICE跟踪进XPROTECTOR的驱动就可以感受到了!
2004-5-30 17:04
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
16
厉害,可以用si进去……pfpf
2004-5-30 17:37
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
你也可以跟一下,当你遇到jmp eip的时候就证明它确实有效:D
2004-5-31 08:58
0
雪    币: 213
活跃值: (96)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
18
设置了PE位以后,还需要通过执行JMP指令来清除处理器指令预取队列。在80386中,使用指令前总是先将其从内存中取出,并且进行解码和寻址。然而,当进入保护模式以后,预取指令信息(它还处于实地址模式)就无效了。使用JMP指令的目的就是强迫处理器放弃无效的信息。
?????????????????????????????????????????????????????????
2004-5-31 18:43
0
雪    币: 227
活跃值: (130)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
说得好
2004-6-1 11:25
0
雪    币: 371
活跃值: (790)
能力值: ( LV12,RANK:570 )
在线值:
发帖
回帖
粉丝
20
最初由 云重 发布
设置了PE位以后,还需要通过执行JMP指令来清除处理器指令预取队列。在80386中,使用指令前总是先将其从内存中取出,并且进行解码和寻址。然而,当进入保护模式以后,预取指令信息(它还处于实地址模式)就无效了。使用JMP指令的目的就是强迫处理器放弃无效的信息。
?????????????????????????????????????????????????????????

Pentium采用分支预测逻辑来减少由于分支导致的时间消耗。由于当遇到一个分支指令(反指短转移或近转移)时,CPU在分支地址处进行了指令预取,因而减少了时间消耗。这些指令被装入指令cache,因而当执行分支时,指令就已经存在了......摘自书上。
云重兄提到的是CPU在从实模式转变到保护模式时利用JMP指令改CS寄存器同时消除旧的预取指令,而关于“当进入保护模式以后,预取指令信息(它还处于实地址模式)就无效了”并不是说CPU处于保护模式后不进行指令预取,只是在实模式预取的指令无效了,JMP之后CPU就会重新预取指令。
2004-6-1 14:53
0
雪    币: 227
活跃值: (130)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
这在操作系统课程中是讲得比较多的。有切换代码如下:
;-------------------------------------------------------------
; MicroP is now in "Protected (safe sex?) mode" :)
;-------------------------------------------------------------
; jump far to selector1:system32 to clear pipeline ,etc
; and to load CS segment with the correct selector
;-------------------------------------------------------------
        db        67h
        DB        66h
        DB        0EAh                        ; jump to protected mode selector
        DD        00008E00h                ; offset to system32
        DW         0008                        ; selector
楼上这位讲得真清楚
2004-6-1 17:18
0
雪    币: 216
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
要是每种技术举一个例子就好了!
2004-9-1 23:30
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
收藏
2004-10-17 19:34
0
雪    币: 155
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
支持继续讨论
2004-10-17 21:27
0
雪    币: 228
活跃值: (119)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
25
cache 中发生修改的时候会不会触发CPU的dirty 位而强制需要刷新cache  ?
2005-12-13 16:35
0
游客
登录 | 注册 方可回帖
返回
//