技巧学习

技巧学习

对于一个刚刚入门病毒分析的小白来说,去学习一些优秀的病毒分析文章,按照文章中的步骤自己动手做一遍,可以学到很多东西。

有幸翻阅到一篇非常优秀的勒索病毒分析文章:https://segmentfault.com/a/1190000017124513

下面是跟着文章自己动手学习一些技巧的记录

0x01 脱壳

​ 脱壳的方法有很多,这里使用到的脱壳方法是最基础的单步跟踪法。单步跟踪法就是利用OD的单条指令执行功能,从壳的入口一直执行到OEP,最终通过这个OEP将原程序dump出来。当然,在单步跟踪的时候需要跳过一些不能执行到的指令。
  使用单步跟踪法追踪OEP的常见步骤:
  1、用OD载入待脱壳文件,如果出现压缩提示,选择“不分析代码”;
  2、向下单步跟踪,实现向下的跳转;
  3、遇到程序往上跳转的时候(包括循环),在回跳的下一句代码上单击并按键盘上的“F4”键跳过回跳指令;
  4、OD中的绿色线条表示跳转没有实理,不必理会,红色线条表示跳转已经实现;
  5、如果刚载入程序的时候,在附近有一个CALL指令,那么就要按键盘上的“F7”键跟进这个CALL内,不然程序很容易运行起来;
  6、在跟踪的时候,如果执行某个CALL指令后就运行,一定要按键盘上的“F7”键进入这个CALL之内再单步跟踪;
  7、遇到在popad指令下的远转移指令时,要格处注意,因为这个远转移指令的目的地很可能就是OEP。 反正除了虚拟机壳,总会有个jmp jz retn call之类的远跳转,跳到入口点,要想办法接近那里,并断在那里。

​ 脱壳这个东西,真的要自己脱一脱才能有点感觉。

0x02 dump傀儡进程

​ 这个勒索病毒会在Sleep后创建一个傀儡进程来进行加密文件等操作。1trees提供了两种方法来获取到这个傀儡可执行文件。在这里复现第一种。

​ 这个勒索病毒分了9次来WriteProcessMemory,记录下这九次的参数:

lpBaseAddrlpBuffernSize
100400000013ebabc400
200401000013ebebc13c00
300415000013ffabc6c00
40041C000014066bc6a00
5004250000140d0bc200
6004260000140d2bc1400
7004280000140e8bc11b
8004290000140eabc11b
90042A0000140ecbc11b

根据1trees大佬文章中的提示:使用OD脚本的dma来dump这9段。

Tips:dma指令:"dma start,size,path"

编写的OD脚本如下:

dma 013ebabc,400,"C:\dmp\1"
dma 013ebebc,13c00,"C:\dmp\2"
dma 013ffabc,6c00,"C:\dmp\3"
dma 014066bc,6a00,"C:\dmp\4"
dma 0140d0bc,200,"C:\dmp\5"
dma 0140d2bc,1400,"C:\dmp\6"
dma 0140e8bc,11b,"C:\dmp\7"
dma 0140eabc,11b,"C:\dmp\8"
dma 0140ecbc,11b,"C:\dmp\9"

使用方法:打开OD插件中的ODbgScript,打开脚本文件执行即可。执行后会在C:\dmp目录下得到如下9个文件:

1074633-20181216111837111-1590145338.png

1是PE头部,其他的都是是加载后的节区dump,所以要利用PE头部信息,组装节区。随便使用一个PE编辑器,将1拖入,查看节区信息:

1074633-20181216111845041-265107563.png

使用WinHex创建一个空的文件,然后根据上图中的RawOffset将文件2-9添加到空文件中(不要忘了将文件1也要添加进去,文件1的RawOffset是0)。

0x03 IDA Python去除花指令

​ 将dump出来的傀儡进程脱壳之后,拖入IDA pro后F5发现没啥反应,原来是有花指令(一种干扰静态分析的技巧)。1trees大佬是使用IDA python解决这个问题的。

​ 花指令如下:

1074633-20181216111814083-803519100.png

1trees大佬的去除花指令的代码如下,其结果是将上图中0x40623A到0x40623E的6个字节全替换为0x90(nop指令)。

def patch_junkcode(addr):
    data = list(get_bytes(addr,4))
    if(ord(data[0]) == 0x75 and ord(data[1]) == 0x5 and ord(data[2]) == 0x74 and ord(data[3]) == 0x3):
            for i in range(4,10):
                patch_byte(addr+i,0x90)
base = 0x401000
len = 0x414C00 - base
for i in range(len):
    patch_junkcode(base+i)
print 'Finished!'

​ 我稍微改了改,我是将从0x40622C到0x406240的22个字节全部nop掉。这样F5的"效果"会更好。

def patch_junkcode(addr):
    data = list(get_bytes(addr,4))
    if(ord(data[0]) == 0x75 and ord(data[1]) == 0x5 and ord(data[2]) == 0x74 and ord(data[3]) == 0x3):
            for i in range(0,22):
                patch_byte(addr-10+i,0x90)
base = 0x401000
len = 0x414C00 - base
for i in range(len):
    patch_junkcode(base+i)
print 'Finished!'

​ 运行IDA python的方法如下,首先alt+f9打开Recent Script子窗口。在子窗口中右击选中Insert添加python脚本文件。随后脚本文件出现在Recent Script子窗口中,双击即可运行了。

​ 运行后start处的代码如下:

1074633-20181216111909127-1144335496.png

​ 光标点中这个函数内,按p键(Create Function)

1074633-20181216111919338-1083876674.png

​ 再按F5即可出现:

1074633-20181216111927917-373161124.png

转载于:https://www.cnblogs.com/amaza/p/10125948.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值