总结:这是一个HTTP的后门,以安装(-in)||移除(-re)||配置(-c)为目的运行此程序时, 必须指定abcd为最后一个参数. 安装时他会把自身拷贝到%SYSTEMROOT%\WINDOWS\system32目录下,并创建一个自启动服务来保证其可持续性. 安装之后, 该后门会从注册表中得到服务配置信息, 并向远程服务器发送HTTP/1.0 GET请求,根据请求的返回值,解析成参数,指导恶意软件的行为--共有五种:SLEEP UPLOAD DOWNLOAD CMD NOTHING.
此五种分别对应的行为是:睡眠指定时间, 连接远程服务器得到内容并保存到本地, 从本地文件读取内容发送到远程服务器, 在本机上执行CMD命令并将结果发送到远程主机, 什么都不做
使用peid查看:
用IDA分析:
下面开始标志位检测, 使用了fs:[0x30]得到了PEB地址,
之后判断processheap中的某个标志:
再之后找到NtGlobalFlag,必须不为0x70:
接下来判断参数个数,根据参数个数不同进行不同操作:
如果参数是一个,那么走左边,否则右边.
左边:调用sub_401100:
在sub_401100中,再次执行了上述的三个判断,过了之后,打开注册表项
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft \XPS: 注意Microsoft后有空格
调用成功之后访问名为"Configuration"的项的值
此API成功后返回ERROR_SUCCESS(0)
所以成功后sub_401100返回1,否则返回0
继续:
loc_4035cb调用了:
进入sub_402c40中后:
再次重复了那三个标志位检测,之后:
此循环就是左边支路的最后一个循环,如果这里退出了,那么此次程序执行结束.
可以知道sub_4014B0和sub_402880必须返回0,那么这个循环才能继续下去
进入sub_4014b0:
同样地进行了三个标志位的检测:之后打开HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft \XPS
访问configuration的值, 值存储在局部数组中,之后把这个值分部分拷贝到a1,a3,a5,a7处,猜想这个值之间有3个空格,那么分成四段,就刚好解析:
设4段值为XX YY ZZ KK
那么接下来的调用就是:
说明kk应该是秒数的字符串,用于指定线程睡眠时间
进入sub_402880后再次进行了标志位检测,之后:
在sub_402650中,v14得到了一个字符串,这字符串用于后边的比较,
可以看出这字符串是个命令,用于选择执行恶意代码:
命令有:SLEEP,UPLOAD,DOWNLOAD,CMD,NOTHING
v14使用了strtok来分割字符串,例如sleep时字符串应该是
"SLEEP 10"
这样v2就是10,atoi将v2转换成整数传入sleep实现了睡眠,同理
UPLOAD命令的格式应该是:UPLOAD port filename
DOWNLOAD命令的格式应该是:DOWNLOAD port filename
CMD命令的格式应该是: CMD port command
上述分隔符asc_40c0d8是一个unicode的空格, asc_40c0bc是一个unicode的"`"符号
接下来走右边
v10是传入的最后一个参数,sub_402d70必须返回非零
进入sub_402d70:
可以知道最后一个参数长度为4,第一个字节的值为97(a),第二个字节的值为98,第三个字节的值为99,第四个字节的值为100, 转换成字符就是abcd,所以最后一个参数必须是abcd
接下来相当于参数1的switch:
如果字符串相等那么_mbscmp返回0,依据这逻辑,最内层括号内应该是argv[1]为"-cc"的情况:
此时参数个数必须为3.
之后调用sub_4014b0从注册表中获取配置字符串并解析
:之后调用sub_403939按格式
aKSHSPSPerS text "UTF-8", 'k:%s h:%s p:%s per:%s',0Ah输出到控制台
如果argv[1]是"-c",那么参数必须有7个
进入sub_4011D0:
这段代码将argv[2]~arg[5]拼成一个字符串并将注册表中的
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft \XPS中Configuration的值设置为拼好的数据.
也就是说-c命令是设置配置的.
如果argv[1]是-re,那么
当参数是3个的时候,此时argv[0]是EXE名,argv[1]是-re,argv[2]是abcd
之后进入sub_402e70:
获取了当前模块完整路径文件名,并将文件名分离出来放入a1中,也就是v8
之后进入sub_4032c0, 这个模块主要就是删除指定服务,删除文件,将其完全移除.
如果参数是4个,那么argv[2]是要移除的服务名
如果argv[1]是-in,那么
当参数是3个,也就是没有指定服务名时,获取模块文件名作为服务名;否则使用指定的服务名来创建服务. 服务名后连接上' Manager Service'
于sub_402f40中, 并将自身拷贝到system32目录下, 初始化configuration的值...
所以-in是安装此恶意程序.