程序分析 - task3

流程分析

程序使用了大量的GetLastError来混淆,没太见过这种玩法的,得去查一下,不过去完混淆的代码图如下很清晰。


start函数的内容为:

image-20191030101736384


write_file函数内容为:

image-20191030102117507


主程序中两个关键函数的大致内容就是,在运行的时候先修改一些不太重要的资源文件(图标等),之后向系统目录释放文件syste2.dll,文件内容来自于程序自身部分0x00408E18,文件内容未被加密,可以直接dump下来分析。

之后拼接命令Rundll32 {{system_path}}\syste2.dll Export并创建新进程运行。


主程序之后会拼接字符串{{system_path}}\system.exe并且判断自身和这个文件是否相同,不相同则覆盖


释放的dll中直接看到Export是个导出函数,Rundll32运行的应该就是这个函数,函数内容如下图

image-20191030153200037

一共有3个函数,其中第一个函数里面是初始化一个比较大的结构体,也可以说是数组吧,存放了很多动态加载的dll基地址,和很多函数的地址,我在这里选择创建结构体来看,这样好看一点,就是可能花费的时间较多


image-20191030153347845

image-20191030153539684

在第一个函数里通过check_sum检查摘要是否和需要的函数相同的方式来获取所需要的所有API,保存到一个结构体中,整个结构体大概是这样的

00000000 func_struct     struc ; (sizeof=0xCC, mappedto_1)
00000000                                         ; XREF: sub_10002C90/r
00000000                                         ; sub_10002D10/r
00000000 LoadLibraryA    dd ?
00000004 GetProAddress   dd ?
00000008 FreeLibrary     dd ?
0000000C lstrcpyA        dd ?
00000010 lstrcatA        dd ?
00000014 lstrlenA        dd ?
00000018 lstrcmpiA       dd ?
0000001C HeapAlloc       dd ?
00000020 GetProcessHeap  dd ?
00000024 HeapFree        dd ?
00000028 WinExec         dd ?
0000002C GetSystemDirectoryA dd ?
00000030 CreateMutexA    dd ?
00000034 CreateThread    dd ?
00000038 WaitForSingleObject dd ?
0000003C Sleep           dd ?
00000040 wsprintfA       dd ?
00000044 GetModuleFileNameA dd ?
00000048 OpenMutexA      dd ?
0000004C GetVersionExA   dd ?
00000050 LoadLibraryExA  dd ?
00000054 GetModuleHandleA dd ?
00000058 OpenSCManagerA  dd ?
0000005C OpenServiceA    dd ?
00000060 ControlService  dd ?
00000064 DeleteService   dd ?
00000068 CloseServiceHandle dd ?
0000006C CreateServiceA  dd ?
00000070 StartServiceA   dd ?
00000074 DeviceIoControl dd ?
00000078 CreateFileA     dd ?
0000007C CloseHandle     dd ?
00000080 WriteFile       dd ?
00000084 SetFileAttributesA dd ?
00000088 SetFilePointer  dd ?
0000008C CopyFileA       dd ?
00000090 DeleteFileA     dd ?
00000094 MoveFileExA     dd ?
00000098 MoveFileA       dd ?
0000009C SetSystemCursor dd ?
000000A0 LoadCursorA     dd ?
000000A4 CopyIcon        dd ?
000000A8 Wininet_base    dd ?
000000AC User32_base     dd ?
000000B0 Advapi32_base   dd ?
000000B4 field_B4        dd ?
000000B8 InternetOpenA   dd ?
000000BC InternetOpenUrlA dd ?
000000C0 InternetReadFile dd ?
000000C4 InternetCloseHandle dd ?
000000C8 RegCreateKeyA   dd ?
000000CC func_struct     ends

在初始化的过程中还会有一种异或解密字符串的函数,不过不是特别重要就没单独说了


image-20191030153642604

这是第二个函数的主要内容,大概是:提升自己的权限,检查是否多开,没多开的情况下才运行这个函数的条件判断体里面的代码。


sub_10002DB0函数

image-20191030153808292

会先休眠一段时间,之后进入while 1的死循环,方便驻留系统

image-20191030153905552

之后运行会去请求网址:http://ddl.87yhf.com/10/count.txt,并且通过返回内容解析出exe的下载地址并下载,最后运行。


函数体里的第二个函数具有如下功能:

image-20191030154037505

sub_10001810函数中,程序会释放两个文件AutoRun.infAutoRun.vbs(每个磁盘都释放,不止一个盘)

image-20191030154221231

image-20191030154242353

接下来有个不太能理解的操作,程序往每个磁盘都复制了system.exe,AutoRun病毒都是在system运行的时候运行的吗?


接下来的函数里:

image-20191030154503575

InternetOpenUrlA的方式向注册表写入自启动项,这用法着实比较神奇,没见过,不过应该没理解错。

同时这个程序也会驻留系统进程


dll的最后一个函数是freelibrarys,作用是释放动态加载的链接库。

总结

我太菜了