查看导入表,调用了创建服务的函数以确保计算机重启后继续运行
回到ida上的main函数
该函数是程序此时促使服务启动的一环
接着调sub_401040函数,该过程先获取一个HGL345的句柄,然后调用函数打开了一个互斥量,若获取到了句柄,直接exitProcess退出进程,否则跳转到loc_401064
loc_401064,首先便是创建互斥量,保证统一时刻只有一个实例在运行,这里和上面的openMutex呼应,如果只爱Open之前已经获取到了“HGL345”互斥量句柄,就代表程序已经在运行了,就会退出,如果没有就下个过程调用 CreateMutexA创建互斥量。
接下来OpenSCManagerA打开操作服务句柄,GetCurrentProess获取当前进程句柄,GetModuleFilename获取当前运行程序路径,然后压入ecx最后作为参数传入CreateServiceA来创建服务。
调用一系列,会赋值esi 14h,即循环20次
lpStartAddress是线程创建的起始位置,双击跳转有网络行为,因此,结合起来,程序会不断启用线程来访问url,程序执行之后,创建服务,进而启动线程下载url,可能会对服务器性能造成一定损失。
首先注意OleInitialize,应该是创建了COM对象
看main,coCreateInstance在本地创建了COM对象,查看IID和clsid判断程序使用什么COM功能
iid:D30C1551-CDAF-11D0-8A3E-00C04FC9E26E,对应IWebBrowser2,
clsid:0002DF01-0000-0000-C000-000000000046,对应Internet Explorer
然后会访问一个网页,该网页应当是广告网页,显示网页后,即停止程序
静态:
string分析,调用了Lab07-03.dll,另外有个迷惑点,,kernel132.dll,用1代替了l
关注另一些导入函数,有操作文件映射到内存、搜索目录和复制文件的操作。
有Lab07-03.dll的字符没有LoadLibrary或者GetProcAddress等函数,表明程序在执行过程中没有加载DLL
关注DLL的可疑字符
有exec可能执行文件,sleep程序睡眠以及一个IP地址,可能存在网络连接行为,查看导出表是空的
表明程序只能被LoadLibrary函数来载入
继续用IDA分析DLL
看DLLmain,有个奇怪的字符串,然后打开互斥量来检测程序在同一时间运行的唯一性,然后可以看到建立一个socket连接,访问的是以及写入的固定IP和端口号80(0x50h)
一般socket连接的connect指令后还会存在send或者recv指令,继续看下一个子过程,可以看到send了一个Hello指令,如果发送失败,直直接跳转到loc_100010E9结束socket连接
再分析recv指令,recv接受网络数据,计算接受到数据长度,若长度为0,则跳回hello指令,若数据长度大于0,使用strncmp比较存储在buf的指令和sleep对比,若不相等,跳回hello,若相等,回调sleep函数让程序睡眠60s并跳转到exec指令代码
exec一般来说即执行命令或程序,这段汇编表明程序首先照例对比exec指令正确,然后压入了许多的参数来调用CreateProcessA创建进程,这里关注CommandLine,全局搜索看它最初被定义在哪,最后发现在程序的DLLmain被定义。
0FFBh是4091,即CommandLine在缓冲区中可以保存5个字节的东西,CreateProcess利用这个参数来创建进程
分析EXE,开头会比较命令行中输入的参数是否是2个,若不是立即退出程序,说明程序需要正确的指令
继续往下看,打开了Kernel32.dll和Lab07-03.dll,暂时不知道做了什么编辑操作
下面是一串很长的偏移计算代码,重点关注有windows API的部分,可以看到在过程中有一处调用了4017D4这个子过程,存在几个CloseHandle,表示文件经过了一系列的编辑,然后程序把Lab07-03.dll复制到了System32目录下的Kernel132.dll,以此混淆隐藏自己
这就解释了Lab07-03.dll是怎么加载到目标机器上的问题
继续往下翻,一个目录字符串,看下loc_401806做了什么
结合FindFirstFile函数,猜测应当是在C:\下检索文件,目标应当是传入的已经被IDA智能重命名的lpFileName,
后面还有许多文件路径中会出现的字符串
结合最后调用的stricmp,应当是对比传入的lpFileName,
然后是一个查找下一个文件,无条件跳转和异常关闭查找
综上分析,在这个程序段,程序应当是在搜索整个文件系统中以.exe为结尾的文件
接着往下看,需要知道要找exe,注意到在结束之前调用了一个sub_4010a0
除了创建文件并将文件映射到内存之外,还调用了IsBadReadPtr函数,这是验证调用进程是否具有对指定内存范围的读取有访问权限,应当也是检查出错与否类指令
往下翻,检查string是不是Kernel32.dll
有几个没见过的指令,repne scasb和rep movsd,在功能上相当于strlen和memcpy,注意到这里传入了个编译
点进去,是刚刚之前出现过的复制到System32下的kerne132.dll
综上我们知道,程序首先在全盘下找到.exe结尾的文件,检索文件是不是包含kernel32.dll,然后使用Kerne132.dll代替.exe本来要加载的kernel32.dll,而后通过DLL执行相关命令的目的。