Hyabcd 发表于 2015-8-10 16:05

论坛样本分析之随机密码敲竹杠分析

   最近论坛频现敲竹杠病毒样本,更甚的是密码随机的敲竹杠,原帖地址http:/ww.52pojie.cn/thread-394757-1-1.html,http://www.52pojie.cn/thread-397114-1-1.html。花了断断续续几天时间把他的加密算法原理逆了出来。表示元气大伤{:301_972:},虚拟机克隆了好几个才完成整个逆向工作,这病毒太可怕,一中电脑就锁,没办法只好克隆虚拟机把旧的移除用新的来继续工作。废话不多说,开始谈谈分析过程。
    首先加载病毒,发现加的强壳,想脱还是有点困难的。不过病毒是易语言写的,根据易语言特点找到GetVersion函数,下断f9直接跑。断下来也意味着代码解压完毕,这时候进入真正的程序内容。

接下来先看看这个病毒到底干了哪些坏事。首先先创建一堆注册表项。并自己设置新值。这么做导致所有格式文件的打开方式都为该病毒设置的方式,于是到这里所有格式文件都无法打开。

然后同样对注册表进行改动,添加一个DisableTaskMgr,让用户无法打开任务管理器。

然后同样添加一个noDesktop键值来隐藏桌面所有图标,添加一个noviewcontextmenu键值来禁止右键菜单。

   这些就是该病毒在加锁前做的一些操作。还有通过驱动隐藏自身在这就不多提。接下来来分析最为关键的加密部分。
通过单步分析可以发现在地址401ec3处对用户名进行一次加密处理,得出四位密码,并将它作为参数传递到402021处进行加密运算获得密码。所以程序的关键点在于这四位密码是如何生成的,这时候就得倒着走,往回跟。先进入401ec3一步步跟到密码产生处,发现密码存储在12fd80这段地址中,为32位md5密码。

往前回溯,可以发现这段地址在经过43a640这个函数之后才发生变化,该函数的参数为ecx,数值恒为6F 41 95 40。

因为ecx值恒定,于是继续跟ecx,通过一步步地址间数值传递发现该数值固定在地址15e6c8,并且是在经过40121f处的call之后才被传入此地址,于是进入该call探个究竟。继续跟发现该值产生于428881处的call,而在这个call中发现几个系统api。

在428800内发现的DeviceIoControl非常重要,他的参数为smart_rcv_drivedata,也就是获取硬盘信息,数据窗口跟随发现如下数据
可以看出这是硬盘序列号,结合该贴内容http://www.52pojie.cn/thread-264955-1-1.html以及后面所发现的加密方法可以得出这是通过机器码进行加密而达到一机一码的效果,因此不同机子上测试出来的密码是不同的。
不过在这之外又发现一个疑点,就是od重新加载后所产生的密码与之前的并不相同,推测可能使用随机码来进行加密。根据易语言随机码产生算法的汇编(8B 4C 24 0C 56 8B 41 08 85 C0 75 04 33 F6 EB 0E 8B 01 33 D2 85 C0 0F 9C C2 4A 23 D0 8B F2 8B 41
14 85 C0 75 07 B8 FF FF FF 7F EB 0D)在程序中查找二进制字符串,果然找到了这个地方。
通过跟随所产生的随机数可以发现随机数被绑定在通过序列码产生的密码之后一起作为ecx内的数据并作为43a640的参数进行加密算法。

由此可以看出,其实连作者都无法破解出密码,因为密码是通过随机数产生的。具体步骤是通过随机数和硬盘序列号作为参数产生32位MD5密码,取密码前四位作为参数再进行一次md5运算得出最终32位md5密码。取该密码前六位作为管理员账户的密码,具体的就不多说,看这里。http://www.52pojie.cn/thread-397406-1-1.html
个人感觉该病毒作者可能是拿到了一种通过获取硬盘序列号来产生密码的敲竹杠病毒源码,想再加大点破坏程度用了随机数来做参数,结果中毒的用户是无法知道密码是多少而作者也是不知道的,所以病毒破坏性非常强。
下面附上IDA分析得出加密算法内容。
int __thiscall sub_43A640(int this, int a2)
{
int result; // eax@1
int v3; // esi@1
int v4; // edx@1
int v5; // eax@1
unsigned int v6; // eax@1
unsigned int v7; // ecx@1
unsigned int v8; // edx@1
unsigned int v9; // eax@1
int v10; // edi@1
unsigned int v11; // ecx@1
int v12; // eax@1
unsigned int v13; // edx@1
int v14; // ecx@1
unsigned int v15; // edi@1
int v16; // edx@1
unsigned int v17; // eax@1
int v18; // edi@1
unsigned int v19; // ecx@1
int v20; // eax@1
unsigned int v21; // edx@1
int v22; // ecx@1
unsigned int v23; // edi@1
int v24; // edx@1
signed int v25; // ebx@1
unsigned int v26; // eax@1
int v27; // edi@1
signed int v28; // eax@1
unsigned int v29; // eax@1
unsigned int v30; // ecx@1
int v31; // ebx@1
unsigned int v32; // edx@1
int v33; // ecx@1
unsigned int v34; // edi@1
int v35; // edx@1
unsigned int v36; // eax@1
int v37; // edi@1
unsigned int v38; // ebx@1
int v39; // eax@1
int v40; // ebx@1
unsigned int v41; // eax@1
int v42; // ecx@1
unsigned int v43; // ecx@1
unsigned int v44; // edi@1
int v45; // edx@1
unsigned int v46; // ebx@1
int v47; // edi@1
int v48; // edi@1
unsigned int v49; // edi@1
unsigned int v50; // ecx@1
int v51; // eax@1
unsigned int v52; // edx@1
int v53; // ecx@1
unsigned int v54; // edi@1
int v55; // edx@1
unsigned int v56; // eax@1
int v57; // edi@1
unsigned int v58; // ecx@1
int v59; // eax@1
unsigned int v60; // ecx@1
unsigned int v61; // edx@1
int v62; // ebx@1
unsigned int v63; // edx@1
int v64; // edi@1
unsigned int v65; // eax@1
int v66; // edx@1
unsigned int v67; // eax@1
unsigned int v68; // ebx@1
int v69; // ebp@1
unsigned int v70; // edi@1
int v71; // ebx@1
unsigned int v72; // edx@1
int v73; // ecx@1
unsigned int v74; // eax@1
unsigned int v75; // ebp@1
int v76; // edi@1
unsigned int v77; // ebx@1
unsigned int v78; // ecx@1
unsigned int v79; // eax@1
int v80; // edx@1
unsigned int v81; // edi@1
unsigned int v82; // ebx@1
unsigned int v83; // ecx@1
unsigned int v84; // edx@1
unsigned int v85; // eax@1
int v86; // edi@1
int v87; // ecx@1
int v88; // edx@1
int v89; // edi@1
int v90; // eax@1
int v91; // @1
unsigned int v92; // @1
unsigned int v93; // @1
unsigned int v94; // @1
int v95; // @1
int v96; // @1
int v97; // @1
int v98; // @1
int v99; // @1
int v100; // @1
int v101; // @1
int v102; // @1
int v103; // @1
int v104; // @1
int v105; // @1
int v106; // @1
int v107; // @1
int v108; // @1
int v109; // @1
int v110; // @1
signed int v111; // @1

v3 = this;
v4 = *(_DWORD *)(this + 84);
v5 = *(_DWORD *)(this + 76);
v92 = *(_DWORD *)(this + 80);
v93 = v4;
v91 = v5;
v94 = *(_DWORD *)(this + 88);
sub_43A5F0(&v95, a2, 64);
v6 = v92
   + (((v91 + v95 + (v92 & v93 | v94 & ~v92) - 680876936) << 7) | ((v91 + v95 + (v92 & v93 | v94 & ~v92) - 680876936) >> 25));
v7 = v6
   + (((v94 + v96 + (v6 & v92 | v93 & ~v6) - 389564586) << 12) | ((v94 + v96 + (v6 & v92 | v93 & ~v6) - 389564586) >> 20));
v8 = v7
   + (((v93
      + v97
      + (v6 & (v6
               + (((v94 + v96 + (v6 & v92 | v93 & ~v6) - 389564586) << 12) | ((v94
                                                                           + v96
                                                                           + (v6 & v92 | v93 & ~v6)
                                                                           - 389564586) >> 20))) | v92 & ~v7)
      + 606105819) << 17) | ((v93
                              + v97
                              + (v6 & (v6
                                     + (((v94 + v96 + (v6 & v92 | v93 & ~v6) - 389564586) << 12) | ((v94 + v96 + (v6 & v92 | v93 & ~v6) - 389564586) >> 20))) | v92 & ~v7)
                              + 606105819) >> 15));
v92 = v8
      + (((v92
         + v98
         + (v8 & (v6
                + (((v94 + v96 + (v6 & v92 | v93 & ~v6) - 389564586) << 12) | ((v94
                                                                              + v96
                                                                              + (v6 & v92 | v93 & ~v6)
                                                                              - 389564586) >> 20))) | v6 & ~v8)
         - 1044525330) >> 10) | ((v92
                              + v98
                              + (v8 & (v6
                                       + (((v94 + v96 + (v6 & v92 | v93 & ~v6) - 389564586) << 12) | ((v94 + v96 + (v6 & v92 | v93 & ~v6) - 389564586) >> 20))) | v6 & ~v8)
                              - 1044525330) << 22));
v9 = v6 + v99 + (v92 & v8 | v7 & ~v92) - 176418897;
v10 = v92 + ((v9 << 7) | (v9 >> 25));
v11 = v7 + v100 + (v10 & v92 | v8 & ~v10) + 1200080426;
v12 = v10 + ((v11 << 12) | (v11 >> 20));
v13 = v8 + v101 + (v10 & v12 | v92 & ~v12) - 1473231341;
v14 = v12 + ((v13 << 17) | (v13 >> 15));
v92 = v14
      + (((v92 + v102 + (v14 & v12 | v10 & ~v14) - 45705983) >> 10) | ((v92 + v102 + (v14 & v12 | v10 & ~v14) - 45705983) << 22));
v15 = v10 + v103 + (v92 & v14 | v12 & ~v92) + 1770035416;
v16 = v92 + ((v15 << 7) | (v15 >> 25));
v17 = v12 + v104 + (v16 & v92 | v14 & ~v16) - 1958414417;
v18 = v16 + ((v17 << 12) | (v17 >> 20));
v19 = v14 + v105 + (v16 & v18 | v92 & ~v18) - 42063;
v20 = v18 + ((v19 << 17) | (v19 >> 15));
v92 = v20
      + (((v92 + v106 + (v20 & v18 | v16 & ~v20) - 1990404162) >> 10) | ((v92
                                                                        + v106
                                                                        + (v20 & v18 | v16 & ~v20)
                                                                        - 1990404162) << 22));
v21 = v16 + v107 + (v92 & v20 | v18 & ~v92) + 1804603682;
v22 = v92 + ((v21 << 7) | (v21 >> 25));
v23 = v18 + v108 + (v22 & v92 | v20 & ~v22) - 40341101;
v24 = v22 + ((v23 << 12) | (v23 >> 20));
v25 = ~(v22 + ((v23 << 12) | (v23 >> 20)));
v26 = v20 + v109 + (v22 & v24 | v92 & ~(v22 + ((v23 << 12) | (v23 >> 20)))) - 1502002290;
v27 = v24 + ((v26 << 17) | (v26 >> 15));
v28 = ~(v24 + ((v26 << 17) | (v26 >> 15)));
v111 = v28;
v29 = v27
      + (((v92 + 1236535329 + v110 + (v27 & v24 | v22 & v28)) >> 10) | ((v92
                                                                     + 1236535329
                                                                     + v110
                                                                     + (v27 & v24 | v22 & v28)) << 22));
v30 = v22 + v96 + (v29 & v24 | v27 & v25) - 165796510;
v31 = v29 + (32 * v30 | (v30 >> 27));
v32 = v24 + v101 + (v31 & v27 | v29 & v111) - 1069501632;
v33 = v31 + ((v32 << 9) | (v32 >> 23));
v34 = v27 + v106 + (v29 & v33 | v31 & ~v29) + 643717713;
v35 = v33 + ((v34 << 14) | (v34 >> 18));
v36 = v29 + v95 + (v31 & v35 | v33 & ~v31) - 373897302;
v37 = v35 + ((v36 >> 12) | (v36 << 20));
v38 = v31 + v100 + (v37 & v33 | v35 & ~v33) - 701558691;
v39 = v105 + ((v37 + (32 * v38 | (v38 >> 27))) & v35 | v37 & ~v35);
v40 = v37 + (32 * v38 | (v38 >> 27));
v41 = v40 + (((v33 + v39 + 38016083) << 9) | ((unsigned int)(v33 + v39 + 38016083) >> 23));
v42 = v110 + (v37 & v41 | v40 & ~v37);
v43 = v41 + (((v35 + v42 - 660478335) << 14) | ((unsigned int)(v35 + v42 - 660478335) >> 18));
v44 = v37 + v99 + (v40 & v43 | v41 & ~v40) - 405537848;
v45 = v43 + ((v44 >> 12) | (v44 << 20));
v46 = v40 + v104 + (v45 & v41 | v43 & ~v41) + 568446438;
v47 = 32 * v46 | (v46 >> 27);
v91 = v45 + v47;
v48 = (v45 + v47) & v43 | v45 & ~v43;
v49 = v91 + (((v41 + v109 + v48 - 1019803690) << 9) | ((v41 + v109 + v48 - 1019803690) >> 23));
v50 = v43 + v98 + (v45 & v49 | v91 & ~v45) - 187363961;
v51 = v49 + ((v50 << 14) | (v50 >> 18));
v52 = v45 + v103 + (v91 & (v49 + ((v50 << 14) | (v50 >> 18))) | v49 & ~v91) + 1163531501;
v53 = v51 + ((v52 >> 12) | (v52 << 20));
v91 = v53
      + (32 * (v91 + v108 + (v53 & v49 | v51 & ~v49) - 1444681467) | ((v91 + v108 + (v53 & v49 | v51 & ~v49) - 1444681467) >> 27));
v54 = v49 + v97 + (v91 & v51 | v53 & ~v51) - 51403784;
v55 = v91 + ((v54 << 9) | (v54 >> 23));
v56 = v51 + v102 + (v53 & v55 | v91 & ~v53) + 1735328473;
v57 = v55 + ((v56 << 14) | (v56 >> 18));
v58 = v53 + v107 + (v91 & (v55 + ((v56 << 14) | (v56 >> 18))) | v55 & ~v91) - 1926607734;
v59 = v57 + ((v58 >> 12) | (v58 << 20));
v60 = v59
      + (16 * (v91 + v100 + (v59 ^ v57 ^ v55) - 378558) | ((v91 + v100 + (v59 ^ v57 ^ (unsigned int)v55) - 378558) >> 28));
v61 = v55 + v103 + (v60 ^ v59 ^ v57) - 2022574463;
v62 = v60 + ((v61 << 11) | (v61 >> 21));
v63 = v57 + v106 + (v60 ^ v59 ^ (v60 + ((v61 << 11) | (v61 >> 21)))) + 1839030562;
v64 = v62 + ((v63 << 16) | (v63 >> 16));
v65 = v59 + v109 + (v60 ^ v64 ^ v62) - 35309556;
v66 = v64 + ((v65 >> 9) | (v65 << 23));
v67 = v66 + (16 * (v60 + v96 + (v66 ^ v64 ^ v62) - 1530992060) | ((v60 + v96 + (v66 ^ v64 ^ v62) - 1530992060) >> 28));
v68 = v62 + v99 + (v67 ^ v66 ^ v64) + 1272893353;
v69 = v67 + ((v68 << 11) | (v68 >> 21));
v70 = v64 + v102 + (v67 ^ v66 ^ v69) - 155497632;
v71 = v69 + ((v70 << 16) | (v70 >> 16));
v72 = v66 + v105 + (v67 ^ v71 ^ v69) - 1094730640;
v73 = v71 + ((v72 >> 9) | (v72 << 23));
v74 = v73 + (16 * (v67 + v108 + (v73 ^ v71 ^ v69) + 681279174) | ((v67 + v108 + (v73 ^ v71 ^ v69) + 681279174) >> 28));
v75 = v69 - 358537222 + v95 + (v74 ^ v73 ^ v71);
v76 = v74 + ((v75 << 11) | (v75 >> 21));
v77 = v76
      + (((v71 + v98 + (v74 ^ v73 ^ v76) - 722521979) << 16) | ((v71 + v98 + (v74 ^ v73 ^ v76) - 722521979) >> 16));
v78 = v77 + (((v101 + (v74 ^ v77 ^ v76) + 76029189 + v73) >> 9) | ((v101 + (v74 ^ v77 ^ v76) + 76029189 + v73) << 23));
v79 = v74 + v104 + (v78 ^ v77 ^ v76) - 640364487;
v80 = v78 + (16 * v79 | (v79 >> 28));
v81 = v80
      + (((v76 + v107 + (v80 ^ v78 ^ v77) - 421815835) << 11) | ((v76 + v107 + (v80 ^ v78 ^ v77) - 421815835) >> 21));
v82 = v81
      + (((v77 + v110 + (v80 ^ v78 ^ v81) + 530742520) << 16) | ((v77 + v110 + (v80 ^ v78 ^ v81) + 530742520) >> 16));
v83 = v78 + v97 + (v80 ^ v82 ^ v81) - 995338651;
v92 = v82 + ((v83 >> 9) | (v83 << 23));
v84 = v80 + v95 + (v82 ^ (v92 | ~v81)) - 198630844;
v91 = v92 + ((v84 << 6) | (v84 >> 26));
v94 = v91
      + (((v81 + v102 + (v92 ^ (v91 | ~v82)) + 1126891415) << 10) | ((v81 + v102 + (v92 ^ (v91 | ~v82)) + 1126891415) >> 22));
v85 = v82 + v109 + (v91 ^ (v94 | ~v92)) - 1416354905;
v86 = (v85 << 15) | (v85 >> 17);
v93 = v94 + v86;
sub_4529F0(&v92, v94 + v86, v94, v92 + ((v84 << 6) | (v84 >> 26)), v100, 21, -57434055);
sub_4529F0(&v91, v92, v93, v94, v107, 6, 1700485571);
sub_4529F0(&v94, v91, v92, v93, v98, 10, -1894986606);
sub_4529F0(&v93, v94, v91, v92, v105, 15, -1051523);
sub_4529F0(&v92, v93, v94, v91, v96, 21, -2054922799);
sub_4529F0(&v91, v92, v93, v94, v103, 6, 1873313359);
sub_4529F0(&v94, v91, v92, v93, v110, 10, -30611744);
sub_4529F0(&v93, v94, v91, v92, v101, 15, -1560198380);
sub_4529F0(&v92, v93, v94, v91, v108, 21, 1309151649);
sub_4529F0(&v91, v92, v93, v94, v99, 6, -145523070);
sub_4529F0(&v94, v91, v92, v93, v106, 10, -1120210379);
sub_4529F0(&v93, v94, v91, v92, v97, 15, 718787259);
sub_4529F0(&v92, v93, v94, v91, v104, 21, -343485551);
v87 = v93;
v88 = *(_DWORD *)(v3 + 84);
v89 = v92 + *(_DWORD *)(v3 + 80);
*(_DWORD *)(v3 + 76) += v91;
*(_DWORD *)(v3 + 80) = v89;
v90 = *(_DWORD *)(v3 + 88);
*(_DWORD *)(v3 + 84) = v87 + v88;
result = v94 + v90;
*(_DWORD *)(v3 + 88) = result;
return result;
表示已眼花{:301_983:}

Hyabcd 发表于 2015-8-22 21:17

hack528 发表于 2015-8-22 16:30
只能跑OD解锁了? 中这样的? 有没有提取的工具啊

od也只能看到加密算法,因为每次密码都不一样你用od调试的时候就和你中毒时密码不同了。要解决这问题最好的方法还是进pe系统去除掉登陆的操作

minisys 发表于 2015-9-6 14:06

似曾相识的感觉,随机密码,发送到指定邮箱,清空发送记录,之前也见过一个,,加了驱动(那货自己说的加了驱动),,记事本打开,搜了administrator,在那附近看到一个邮箱,,还有明文账号密码,,登陆进去什么都没发现,最后不了了之

conosc 发表于 2015-8-10 16:11

占个位,给楼主一个支持~

Nian 发表于 2015-8-10 16:14

{:301_992:}腻害哦!

zxwanghongyi 发表于 2015-8-10 16:15

扔火眼完事

anywhere 发表于 2015-8-10 16:16

这算法 我也是醉了!

崽崽呦 发表于 2015-8-10 16:47

Hyabcd 发表于 2015-8-11 15:10

zxwanghongyi 发表于 2015-8-10 16:15
扔火眼完事

火眼确实能看出他有哪些破坏功能,不过就是密码的产生还是需要OD才看得出{:301_1003:}

zxwanghongyi 发表于 2015-8-11 15:50

Hyabcd 发表于 2015-8-11 15:10
火眼确实能看出他有哪些破坏功能,不过就是密码的产生还是需要OD才看得出

如果用的是net用户admin什么的这个命令tx的哈勃杀毒可以看出,跟火眼差不多

Hyabcd 发表于 2015-8-11 16:19

zxwanghongyi 发表于 2015-8-11 15:50
如果用的是net用户admin什么的这个命令tx的哈勃杀毒可以看出,跟火眼差不多

对的,哈勃可以看出来,不过由于它是随机的导致每次运行产生的密码都不一样这个比较蛋疼{:301_983:}

hack528 发表于 2015-8-22 16:30

只能跑OD解锁了? 中这样的? 有没有提取的工具啊
页: [1] 2
查看完整版本: 论坛样本分析之随机密码敲竹杠分析