广告安装包恶意样本分析
目标
对特定安装包文件进行逆向:
1、搞清楚该类型安装包具体名称。
2、搞清楚该安装包的内部信息存储结构,尝试解析存储结构中字段的含义并使用结构体实现相关定义。
3、搞清楚该安装包内嵌文件的存储方式,以及如何还原出内嵌文件。
4、在2,3步的基础上通过代码实现该类型安装包的解包程序(输出包内部信息,甚至于可以还原出包内的内嵌文件)。
工具使用
IDA32 OD(工具在x64window7虚拟机中运行出现问题) Virus total样本检测网站 windows7 64位虚拟机
火绒对病毒进行了判断为Trojan/Generic!258124441FE9E3AC类型病毒 表示该样本存在有木马
winmain主函数分析
关键函数(NsResGetBuff)
函数使用了windowsAPI
GetModuleHandleW
检索指定模块的模块句柄。 模块必须已由调用进程加载
HMODULE GetModuleHandleW(
[in, optional] LPCWSTR lpModuleName//加载的模块的名称 (.dll 或 .exe 文件)
);
FindResourceW
确定具有指定类型和名称的资源在指定模块中的位置
HRSRC FindResourceA(
[in, optional] HMODULE hModule,//其可移植可执行文件或随附的 MUI 文件包含资源的模块的句柄。如果此参数为NULL,则该函数将搜索用于创建当前进程的模块
[in] LPCSTR lpName,//资源的名称
[in] LPCSTR lpType//资源类型
);
LoadResource
检索可用于获取指向内存中指定资源的第一个字节的指针的句柄
HGLOBAL LoadResource(
[in, optional] HMODULE hModule,//其可执行文件包含资源的模块的句柄
[in] HRSRC hResInfo//要加载的资源的句柄
);
SizeofResource
DWORD SizeofResource(
[in, optional] HMODULE hModule,//其可执行文件包含资源的模块的句柄
[in] HRSRC hResInfo//资源的句柄
);
LockResource
检索指向内存中指定资源的指针
LPVOID LockResource(
[in] HGLOBAL hResData//要访问的资源的句柄
);
FreeResource
减少(减一)已加载资源的引用计数。当引用计数达到零时,资源占用的内存被释放
BOOL FreeResource(
[in] HGLOBAL hResData//资源的句柄
);
汇编 cdq
和eax和edx有关系,将eax的最高位复制到edx的每一位,一般使用于除法运算之前。在eax=80000000时,可以将edx设为FFFFFFFF。
定位关键代码
代码安装资源部分,窗口部分的资源设置不是关键部分(不进行重点分析)
在winmain主函数中进行动态调试,在主函数完成窗口参数设置后,主程序会唤起这个窗口,点击改窗口的立即安装就会跳转到一个主程序中未被调用的新类中(CNsInstaller),在进行安装的同时会调用这个类的(CNsInstaller::GetSetupInfo)。
https://support.microsoft.com/en-au/topic/how-to-manually-remove-programs-from-the-add-remove-programs-list-49494159-d215-07b2-e4c7-050457b38352
CNsInstaller类中的函数 CheckComponent函数中的GetSetupInfo函数获取系统路径和一些安装需要的信息(查看注册表中的信息)
该函数在sub_129CBF0中被调用 该函数中调用CNsInstaller::StartInstall函数
函数CNsInstaller::ExtractFile
这个v3是由Json::StaticString::c_str函数返回的一个字符串路径(C:\Program File(x86)\Meiqia\uninst.exe)
CNsInstaller::ExtractFile 再次被调用为103.ico安装资源
CNsInstaller::ExtractFile 再次被调用为chorme_100_percent.pak安装资源(软件素材文件包)
CNsInstaller::ExtractFile 再次被调用为chorme_200_percent.pak安装资源(软件素材文件包)
CNsInstaller::ExtractFile 再次被调用为d3dcomplier_47.dll安装资源
CNsInstaller::ExtractFile 再次被调用为ffpeg.dll安装资源
CNsInstaller::ExtractFile 再次被调用为icudt1.dat安装资源
CNsInstaller::ExtractFile 再次被调用为libcrypto-3.dll安装资源
CNsInstaller::ExtractFile 再次被调用为libEGL.dll安装资源
CNsInstaller::ExtractFile 再次被调用为libGLESv2.dll安装资源
CNsInstaller::ExtractFile 再次被调用为LICENSE.electron安装资源
CNsInstaller::ExtractFile 再次被调用为LICENSES.chromium.html安装资源
CNsInstaller::ExtractFile 再次被调用为安装资源C:\Program File(x86)\Meiqia\locals\af.pak
C:\Program File(x86)\Meiqia\locals\am.pak
C:\Program File(x86)\Meiqia\locals\ar.pak
C:\Program File(x86)\Meiqia\locals\bg.pak
后续还会安装大量资源,文件夹安装了一下文件.
其中Meiqi.exe文件的
CNsinstaller类的作用是主要是为了释放安装包中的内嵌资源,执行逻辑为首先执行CNsInstaller::StartInstall函数,函数的内部逻辑是进行多次函数是否执行的判断。首先判断CNsInstaller::CheckEVIP函数(函数内部对创建窗口的资源进行了检查是否释放返回了对加密的检查,不是关键的执行资源释放函数忽略 该函数的返回值为CNsCode::CheckEVIP函数与CNsCode和CNsNet和CNsEncrypt类有使用)是否执行成功(不成功就会直接执行退出窗口,这个函数实际执行的时候没有影响)。判断后执行CNsInstaller::CheckSafeMsg()函数。进行Src资源的判断,判断结束后会进行一个CNsThread::StartThread 函数的执行。
这个函数的内部使用了CreateThread函数,也就是说这个函数会创建一个线程并且起始地址为CNsInstaller::InstallThread,这个函数开启了一个新的线程并且执行CNsInstaller::InstallThread函数。
CNsInstaller::InstallThread函数内部执行了CNsInstaller::InstallFunc函数(函数的功能为释放安装包中的内嵌文件) CNsInstaller::InstallFunc中存在CNsInstaller::ExtractFile函数进行文件的释放。
CNsInstaller::ExtractFile函数中存在函数_NsWriteFile函数进行文件的内存写入。
_NsWriteFile函数的内部结构,函数执行后会在指定的缓冲区的位置进行内存的写入,Meiqia文件夹的内容是由这个函数进行写入的。在文件夹中会被写入一个Meiqi.exe文件,这个文件存在代码的写入.