周末时拿到一个病毒样本,代码解在壳申请的内存。
解码比较复杂,N线程通过EVENT同步解代码。而且貌似使用了自校验的值作解码参数,我本想在WaitForSingleObject后面下断,线程解完代码就自动断在主线程的,可是这样做就导致解出来的代码是错的。同样SETEVENT和EXITTHREAD也试过了。最后没办法,带壳运行,看到程序在注入IE之后自动退出了,我就直接在EXITPROCESS下断。
代码从14B000开始的。我DUMP下来之后,加上PE头,把基址改成这个显示无法启动程序。
尝试改NOTEPAD的基址,10000000可以,400000也可以,改成14B000就不行,系统提示无法启动。
另外IMPORTREC只能在EXE被分配的内存空间中取IAT。
暂时的解决方法用OD写了个脚本,把IAT的符号都提出来。然后用IDC写了个脚本,把相应地址的调用直接改名为函数名。可是这样做出现另外一个问题就是IDA的图表功能无法正常使用(正常时能显示某个CALL调用了什么API)。也不知道是不是我脚本写得不好,大家帮忙看看。希望大大们能给一点脱壳的思路。
#include <idc.idc>
static main() {
auto Sbuffer,ea,zcount,filehandle;
filehandle = fopen("D:\out.txt","r"); 我把OD提取的函数名保存在OUT.TXT中了。
for (ea = 0x14bcb0; zcount != 2; ea = ea + 4){ 不同的DLL之间的函数地址由一个为0的DWORD分隔,所以写了一个循环,连续两个DWORD为0则结束重命名
if (Dword(ea) !=0){
Sbuffer = readstr(filehandle);
MakeNameEx (ea,Sbuffer,SN_AUTO );
zcount = 0;
}
else{
zcount = zcount + 1;
}
}
fclose(filehandle) ;
}
[培训]科锐逆向工程师培训第53期2025年7月8日开班!