恶意代码实战-Lab07

image-20230227122744893

查看导入表,调用了创建服务的函数以确保计算机重启后继续运行

image-20230227131157743

回到ida上的main函数

image-20230227132849031

该函数是程序此时促使服务启动的一环

image-20230227132745110

接着调sub_401040函数,该过程先获取一个HGL345的句柄,然后调用函数打开了一个互斥量,若获取到了句柄,直接exitProcess退出进程,否则跳转到loc_401064

image-20230227133133431

loc_401064,首先便是创建互斥量,保证统一时刻只有一个实例在运行,这里和上面的openMutex呼应,如果只爱Open之前已经获取到了“HGL345”互斥量句柄,就代表程序已经在运行了,就会退出,如果没有就下个过程调用 CreateMutexA创建互斥量。

接下来OpenSCManagerA打开操作服务句柄,GetCurrentProess获取当前进程句柄,GetModuleFilename获取当前运行程序路径,然后压入ecx最后作为参数传入CreateServiceA来创建服务。

image-20230227140927518

调用一系列,会赋值esi 14h,即循环20次

image-20230227142756994

lpStartAddress是线程创建的起始位置,双击跳转有网络行为,因此,结合起来,程序会不断启用线程来访问url,程序执行之后,创建服务,进而启动线程下载url,可能会对服务器性能造成一定损失。

image-20230227143117726

image-20230227122812671

首先注意OleInitialize,应该是创建了COM对象

image-20230227143525167

看main,coCreateInstance在本地创建了COM对象,查看IID和clsid判断程序使用什么COM功能

image-20230227144113496

iid:D30C1551-CDAF-11D0-8A3E-00C04FC9E26E,对应IWebBrowser2,

image-20230227145601582

clsid:0002DF01-0000-0000-C000-000000000046,对应Internet Explorer

image-20230227145633606

然后会访问一个网页,该网页应当是广告网页,显示网页后,即停止程序

image-20230227151354630

image-20230227122825713

静态:

string分析,调用了Lab07-03.dll,另外有个迷惑点,,kernel132.dll,用1代替了l

image-20230227212655833

关注另一些导入函数,有操作文件映射到内存、搜索目录和复制文件的操作。

image-20230227212959413

有Lab07-03.dll的字符没有LoadLibrary或者GetProcAddress等函数,表明程序在执行过程中没有加载DLL

关注DLL的可疑字符

image-20230228130119628

有exec可能执行文件,sleep程序睡眠以及一个IP地址,可能存在网络连接行为,查看导出表是空的

image-20230228130426891

表明程序只能被LoadLibrary函数来载入

继续用IDA分析DLL

看DLLmain,有个奇怪的字符串,然后打开互斥量来检测程序在同一时间运行的唯一性,然后可以看到建立一个socket连接,访问的是以及写入的固定IP和端口号80(0x50h)

image-20230228130712502

一般socket连接的connect指令后还会存在send或者recv指令,继续看下一个子过程,可以看到send了一个Hello指令,如果发送失败,直直接跳转到loc_100010E9结束socket连接

image-20230228131407404

再分析recv指令,recv接受网络数据,计算接受到数据长度,若长度为0,则跳回hello指令,若数据长度大于0,使用strncmp比较存储在buf的指令和sleep对比,若不相等,跳回hello,若相等,回调sleep函数让程序睡眠60s并跳转到exec指令代码

image-20230228132629851

exec一般来说即执行命令或程序,这段汇编表明程序首先照例对比exec指令正确,然后压入了许多的参数来调用CreateProcessA创建进程,这里关注CommandLine,全局搜索看它最初被定义在哪,最后发现在程序的DLLmain被定义。

image-20230228133218135

0FFBh是4091,即CommandLine在缓冲区中可以保存5个字节的东西,CreateProcess利用这个参数来创建进程

分析EXE,开头会比较命令行中输入的参数是否是2个,若不是立即退出程序,说明程序需要正确的指令

image-20230228134023107

继续往下看,打开了Kernel32.dll和Lab07-03.dll,暂时不知道做了什么编辑操作

image-20230228134302430

下面是一串很长的偏移计算代码,重点关注有windows API的部分,可以看到在过程中有一处调用了4017D4这个子过程,存在几个CloseHandle,表示文件经过了一系列的编辑,然后程序把Lab07-03.dll复制到了System32目录下的Kernel132.dll,以此混淆隐藏自己

image-20230228134652864

image-20230228134914024

这就解释了Lab07-03.dll是怎么加载到目标机器上的问题

继续往下翻,一个目录字符串,看下loc_401806做了什么

image-20230228135106445

结合FindFirstFile函数,猜测应当是在C:\下检索文件,目标应当是传入的已经被IDA智能重命名的lpFileName,

image-20230228135201707

后面还有许多文件路径中会出现的字符串

image-20230228135458514

image-20230228135451218

image-20230228135509542

image-20230228135516236

结合最后调用的stricmp,应当是对比传入的lpFileName,

image-20230228135543782

然后是一个查找下一个文件,无条件跳转和异常关闭查找

image-20230228135644735

综上分析,在这个程序段,程序应当是在搜索整个文件系统中以.exe为结尾的文件

接着往下看,需要知道要找exe,注意到在结束之前调用了一个sub_4010a0

image-20230228140217263

除了创建文件并将文件映射到内存之外,还调用了IsBadReadPtr函数,这是验证调用进程是否具有对指定内存范围的读取有访问权限,应当也是检查出错与否类指令

image-20230228140305166

往下翻,检查string是不是Kernel32.dll

image-20230228140514022

有几个没见过的指令,repne scasb和rep movsd,在功能上相当于strlen和memcpy,注意到这里传入了个编译

image-20230228141305532

点进去,是刚刚之前出现过的复制到System32下的kerne132.dll

image-20230228141355348

综上我们知道,程序首先在全盘下找到.exe结尾的文件,检索文件是不是包含kernel32.dll,然后使用Kerne132.dll代替.exe本来要加载的kernel32.dll,而后通过DLL执行相关命令的目的。

发表评论