本实例可以通过app.any.run获取:https://app.any.run/tasks/0feaad68-539d-4ef8-9090-f4e59e4d0c61/样本家族名称:Ransomeware/ParadiseMD5:3e94ad15587dc71173bbd10bda5d56e4在IDA第一次解析PE文件时,往往会首先会咨询我们使用什么配置。它会默认忽略Load resources选项,该选项可以为我们提供更多信息,应当手动勾选。进入OEP按住空格键即可删除图形化界面从而切换到反汇编界面。从OEP处反汇编处可以看到病毒连续调用两个call指令。进入第一个call指令,看到熟悉的fs:[0x30]和相关的模块名,可以判断该函数和动态获取API有关。仔细观察这段函数,可以发现病毒将一段4字节16进制数据和模块基址作为参数传入了sub_401ca0。该函数返回的值存入一个全局变量地址dword_406004。接下来每个加载dll相关的操作都和dword_406004函数相关,所以基本可以确定sub_401ca0函数用于根据模块基址和函数hash动态获取API地址。查看dword_406004地址处数据发现为未知内存,则证实了dword_406004存储动态获取API地址。修改参数名和函数名,使用交叉引用X快捷键产看hash参数被引用位置。找到hash引用上方调用了一个函数,而且紧接着会将返回值eax与hash参数进行比较,所以猜测sub_4016f0为hash运算相关的函数。进入函数查看基本可以确定在进行hash运算。接下来返回第一个函数起始位置向下浏览代码。发现有大量将数据存入临时变量的行为。其中有一些ida无法解析的数据,以offset开头。双击进入可以看到一些全局数据。继续向下观察,可以看到病毒又在根据hash动态获取API的操作,而且每次传入的hash都是通过esi中取出,由此我们很容易联想到,病毒将输入按照一定规律连续存储在栈内,并通过循环获取不同的参数,最终将获取的API存储在ecx指向的内存。所以可以确定上面图中数据为要获取的hash值。由此我们也理解了第一个函数是用来动态解析API的。返回入口点代码变得更加直观。我们继续向下观察代码,我们可以发现有很多call指向一个全局变量地址。这种代表间接调用IAT处函数。但是当我们点击该函数会发现IDA无法解析API。因为病毒自己构造了自己的IAT,需要我们动态对IAT表进行修复。首先在动态解析API函数地点设置断点。启动IDA的动态调试功能,我是用的被接管调试器为Windbg。(也可以选择远程调试,全凭大家喜好)在病毒填充IAT位置设置断点。并让程序跑起来直到断住。断住后继续向下执行一条,让导入表被EAX填充。然后打开一个新的反汇编窗口。通过新的反汇编窗口查看IAT表。可以看到API数据已经动态填充到了IAT表中.接下来选择API的地址,按下O快捷键,让IDA解析出符号名。了解重新解析IAT的方法后,我们只需要在动态获取API函数的ret指令下断点,让其自动解析。执行到ret指令查看IAT表内存,已经填充完毕。我们可以通过手动解析来验证一下是否填充完整。接下来我们需要记录IAT表的起始地址和结束地址。
然后选择Edit->Universal Unpacker Manual Recounstruct通用脱壳插件。分别填写OEP、代码节起始位置和结束位置、IAT表起始位置和结束位置。修复IAT完成后可以看到IDA已经解析了所有IAT表中的API符号。接下来我们就可以终止调试了。结束调试后使用Rebase program。将IDB的基址重新定向回0x00400000。可以看到IDA已经可以解析病毒构造的IAT表中API地址。
01175FA8
01176014
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
实都 棒棒 !!好技巧
顾何 干货,感谢分享
rdbjx 好好学习