讨论病毒调试技术
病毒调试技术跟一般的解密或者逆向分析过程类似,但是由于病毒独有的破坏性,因此决定了调试时候的一些特殊特。
如果你有一台专门的机器供你虐待,那你可以略过本文不提;
如果你自认为可以用VM对付各种病毒,你也可以略过本文不提,直到有一天某xx病毒检测VM并对此做出反应;
下面仅仅讨论一般的病毒调试时候需要注意的事项。
1、
如果仅仅出于学习目的,可以找一些经典的病毒进行分析,既可以学习东西,也可以在万一分析不出来的时候请出AV将其杀掉;
2、
将病毒文件备份,防止AV不甚将正在分析的样本处理掉;
3、
修改病毒文件后缀名为不可执行文件后缀,比如 *.a之类,可以防止不甚将病毒运行,也可以在一定程度上防止AV误处理;
4、
建议采用IDA等先对病毒文件进行分析,看看是文件感染病毒或者是网络传播病毒。有些病毒进行了处理,可以防止IDA分析,对于这种情况,不妨采用下面的方法:
用IDA载入文件的时候采用Binary File模式;
修正loading offset参数;
载入以后跳转到入口点,按 C 键进行分析。
5、
对于加壳的文件,尽量采用静态脱壳,如果动态脱,可以手工。当心动态脱壳机将病毒运行;
6、
动态调试时候小心谨慎,防止不甚将病毒运行,为此可以在调试时候对一些敏感API函数下断点,比如CreateFile,send函数等,这样即使不甚将病毒运行,也可以防止病毒修改本地文件,或者进行网络传播;
7、
初次分析时候以分析病毒功能为主,对数据的细节处理可以暂且不管。比如说注意病毒对注册表、文件、网络的操作,从而大体知道病毒感染、传播、破坏功能;
8、
并非所有病毒都用asm编写,很多病毒采用MFC或者ATL或者其他进行编写,因此病毒里面很多call对我们来说是冗余无用的。而新手不明故里,往往见call就进,这样反而浪费精力。比如下面这个病毒,载入后停在入口点:
00415478 P2P-Wo>/$ 55 push ebp
...............
0041549A │. 57 push edi
0041549B │. 8965 E8 mov dword ptr ss:[ebp-18],esp
0041549E │. FF15 D4B04200 call dword ptr ds:[<&KERNEL32.GetVersion>] ; KERNEL32.GetVersion
...............
004154CF │. 6A 01 push 1
004154D1 │. E8 FD2D0000 call P2P-Worm.004182D3
004154D6 │. 59 pop ecx
...............
004154DD │. E8 C3000000 call P2P-Worm.004155A5
004154E2 │. 59 pop ecx
004154E3 │> E8 64150000 call P2P-Worm.00416A4C
004154E8 │. 85C0 test eax,eax
004154EA │. 75 08 jnz short P2P-Worm.004154F4
004154EC │. 6A 10 push 10
004154EE │. E8 B2000000 call P2P-Worm.004155A5
...............
004154F9 │. E8 12560000 call P2P-Worm.0041AB10
004154FE │. FF15 64B14200 call dword ptr ds:[<&KERNEL32.GetCommandLineA>] ; [GetCommandLineA
从GetVersion到GetCommandLineA函数中间的n多xxx函数,对我们来说是关系不大的,基本都是进行初始化,因此没必要跟进去。对付这些就是直接执行到GetCommandLineA,因此有些病毒需要获取commandline,如果没有这个,可以拦截在GetModuleHandle或者别的常用初始化函数。
9、
该备份的备份,做好偷鸡不成蚀把米的准备。
上面只是针对常用的情况,如有不对请酌情处理。
病毒调试技术跟一般的解密或者逆向分析过程类似,但是由于病毒独有的破坏性,因此决定了调试时候的一些特殊特。
如果你有一台专门的机器供你虐待,那你可以略过本文不提;
如果你自认为可以用VM对付各种病毒,你也可以略过本文不提,直到有一天某xx病毒检测VM并对此做出反应;
下面仅仅讨论一般的病毒调试时候需要注意的事项。
1、
如果仅仅出于学习目的,可以找一些经典的病毒进行分析,既可以学习东西,也可以在万一分析不出来的时候请出AV将其杀掉;
2、
将病毒文件备份,防止AV不甚将正在分析的样本处理掉;
3、
修改病毒文件后缀名为不可执行文件后缀,比如 *.a之类,可以防止不甚将病毒运行,也可以在一定程度上防止AV误处理;
4、
建议采用IDA等先对病毒文件进行分析,看看是文件感染病毒或者是网络传播病毒。有些病毒进行了处理,可以防止IDA分析,对于这种情况,不妨采用下面的方法:
用IDA载入文件的时候采用Binary File模式;
修正loading offset参数;
载入以后跳转到入口点,按 C 键进行分析。
5、
对于加壳的文件,尽量采用静态脱壳,如果动态脱,可以手工。当心动态脱壳机将病毒运行;
6、
动态调试时候小心谨慎,防止不甚将病毒运行,为此可以在调试时候对一些敏感API函数下断点,比如CreateFile,send函数等,这样即使不甚将病毒运行,也可以防止病毒修改本地文件,或者进行网络传播;
7、
初次分析时候以分析病毒功能为主,对数据的细节处理可以暂且不管。比如说注意病毒对注册表、文件、网络的操作,从而大体知道病毒感染、传播、破坏功能;
8、
并非所有病毒都用asm编写,很多病毒采用MFC或者ATL或者其他进行编写,因此病毒里面很多call对我们来说是冗余无用的。而新手不明故里,往往见call就进,这样反而浪费精力。比如下面这个病毒,载入后停在入口点:
00415478 P2P-Wo>/$ 55 push ebp
...............
0041549A │. 57 push edi
0041549B │. 8965 E8 mov dword ptr ss:[ebp-18],esp
0041549E │. FF15 D4B04200 call dword ptr ds:[<&KERNEL32.GetVersion>] ; KERNEL32.GetVersion
...............
004154CF │. 6A 01 push 1
004154D1 │. E8 FD2D0000 call P2P-Worm.004182D3
004154D6 │. 59 pop ecx
...............
004154DD │. E8 C3000000 call P2P-Worm.004155A5
004154E2 │. 59 pop ecx
004154E3 │> E8 64150000 call P2P-Worm.00416A4C
004154E8 │. 85C0 test eax,eax
004154EA │. 75 08 jnz short P2P-Worm.004154F4
004154EC │. 6A 10 push 10
004154EE │. E8 B2000000 call P2P-Worm.004155A5
...............
004154F9 │. E8 12560000 call P2P-Worm.0041AB10
004154FE │. FF15 64B14200 call dword ptr ds:[<&KERNEL32.GetCommandLineA>] ; [GetCommandLineA
从GetVersion到GetCommandLineA函数中间的n多xxx函数,对我们来说是关系不大的,基本都是进行初始化,因此没必要跟进去。对付这些就是直接执行到GetCommandLineA,因此有些病毒需要获取commandline,如果没有这个,可以拦截在GetModuleHandle或者别的常用初始化函数。
9、
该备份的备份,做好偷鸡不成蚀把米的准备。
上面只是针对常用的情况,如有不对请酌情处理。