对抗父进程检测的两种方法
说明:本方法适用于中断在程序入口处!
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期)