首页
社区
课程
招聘
对抗父进程检测的两种方法[原创]
发表于: 2006-6-3 22:51 5173

对抗父进程检测的两种方法[原创]

2006-6-3 22:51
5173
对抗父进程检测的两种方法

说明:本方法适用于中断在程序入口处!

1、前言
在调试病毒和加密壳时,常常会遇到反跟踪的干扰,父进程检测即是常见的一种反跟踪技术。为了对付此种技术,有人提出了一些方法,如修改父进程名、跟踪调试修改跳过检测等,笔者经过分析试验,找到了两种行之有效的办法。需要说明的是,文中操作系统平台是win98 sp2。
2、插入中断法
本方法的思想是,在文件的入口处植入中断代码(比如INT 3),然后运行调试器(如softice或trw2000等)对相应中断(如INT 3)设置断点,退出调试器界面。正常运行我们要调试的文件,由于我们已经提前在INT 3下断,程序运行后就会中断在入口处,调试器获得了控制权,清除断点,把程序首字节修改回原值,再将EIP恢复为入口处的值即可调试运行。因为程序是系统加载运行的,它的父进程是Explorer,和调试器没任何关联,这就从根本上解决了父进程检测问题。具体步骤如下:1、运行w32dasm无极修改版V3.0,打开我们要修改的文件,将光标停在程序入口代码处,选择菜单“编辑――Hex编辑”(也可以单击右键,在弹出的菜单中选择Hex编辑),会弹出一个修改窗口,将第一字节的值记下以备后用,并将其修改为CC(即INT 3的机器码),点击“应用”按钮,然后点击“关闭”按钮退出。注意,修改后的文件名是在源文件名后加一下画线,比如,若源文件名是ABC.EXE,则修改后的文件名是ABC .EXE。对于有些加密壳程序,w32dasm无法直接修改,这时可以用相关工具(如lordpe)找到程序入口点,经过地址换算,再用磁盘工具(如winhex)修改入口点的代码,具体方法此处不再赘述;2、运行调试器(如trw2000),下命令I3HERE ON设置断点,然后下命令G退出;3、双击要调试的程序,程序被拦截下来;4、用前面记下的值恢复程序的首字节,下命令I3HERE OFF关闭断点,再把EIP恢复为入口处的值,然后就可以调试程序了。中断处的示例代码如下(此时EIP=401189):
0187:004011820     JMP      NEAR [00401070]
0187:00401188      INT3    ;中断处,运行前需要恢复原值
0187:00401189      ADD      AL,13
0187:0040118B      INC      EAX
0187:0040118C      ADD      AL,CH
0187:0040118E      DB       F0
0187:0040118F      DB       FF
0187:00401190      DB       FF
0187:00401191      INC      DWORD [EAX]
恢复后的正常代码如下(此时EIP恢复为401188):
0187:00401182     JMP      NEAR [00401070]
0187:00401188     PUSH     DWORD 00401304;程序入口点
0187:0040118D    CALL     `MSVBVM60!ThunRTMain`

3、拦截系统调用法
本方法的基本思想是,系统把应用程序加载到内存并做好必要的初始化工作后,总要把控制权交给要运行的程序,只要能找到转移控制权之前的代码并在那里下断,调试器获得控制权后单步运行,就能找到程序的入口处。怎么样才能找到转交控制权的系统代码呢?我们知道,系统把控制权转给应用程序的基本方法有三种:1、调用法(call语句);2、压栈返回法(push和ret语句);3、跳转法(jmp语句等)。无论采用哪种方法,应用程序和系统有一个链条不能断裂,那就是堆栈,只要知道应用程序在入口点处的堆栈值,顺藤摸瓜,就能找到控制权转移处。实际方法如下:运行调试器(trw2000等),下faults off命令关闭错误检测。再用该调试器随便加载一个应用程序,调试器界面弹出,停在程序入口处,观察此时的ESP= 63FE3C,[63FE3C]= BFF8B86C,对BFF8B867处的代码进行反汇编,代码如下:
0187:BFF8B8520    PUSH     EAX
0187:BFF8B853     PUSH     DWORD 0500
0187:BFF8B858    CALL     BFF8181C
0187:BFF8B85D    MOV      DWORD [EBP-04],00
0187:BFF8B864    MOV      EAX,[EBP-2C]
0187:BFF8B867    CALL     BFF74399    ;此处调用
0187:BFF8B86C    MOV      [EBP-28],EAX
0187:BFF8B86F    JMP      SHORT BFF8B88B
0187:BFF8B871    PUSH     DWORD [EBP-14]
0187:BFF8B874    CALL     `KERNEL32!UnhandledExceptionFilter`

下断点bp bff8b867,退出trw界面和应用程序,再运行一个程序,程序中断下来,按f8键进入,代码如下:
0187:BFF74399      CMP      EAX,80000000
0187:BFF7439E      JNC      BFF743B5
0187:BFF743A0      BTR      WORD [FS:1C],01
0187:BFF743AA     JNC      BFF743B5
0187:BFF743AC     PUSHF   
0187:BFF743AD     OR       DWORD [ESP],0100
0187:BFF743B4     POPF   
0187:BFF743B5     JMP      EAX    ;跳到应用程序入口

按f10键单步跟踪,将由jmp eax 语句跳到程序的真正入口,清除断点,就可以调试应用程序了。由于应用程序是系统加载运行的,它的父进程是Explorer,和调试器无关,不怕任何形式的父进程检测。
4、结束语
前面介绍了两种反击父进程检测的基本方法,第一种方法需要修改应用程序,稍嫌麻烦,特别是一些加密壳程序更是如此;第二种方法不需要修改源程序,系统转移控制权的代码的地址也很稳定,只要查找一次地址,就可以守株待兔,反复在那里设置断点张网以待,以本法可以多次使用,达到一劳永逸的效果。

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

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 222
活跃值: (26)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
2
支持。
思路很好。。。
2006-6-4 10:18
0
雪    币: 200
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
3
好文章啊!谢谢东方弘朋友!

建议把本文设为精华!
2006-6-6 18:18
0
游客
登录 | 注册 方可回帖
返回
//