吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 668|回复: 3
上一主题 下一主题
收起左侧

[PC样本分析] 调试恶意dll注册的windows服务

[复制链接]
跳转到指定楼层
楼主
Payload_82 发表于 2024-4-30 18:59 回帖奖励
使用论坛附件上传样本压缩包时必须使用压缩密码保护,压缩密码:52pojie,否则会导致论坛被杀毒软件等误报,论坛有权随时删除相关附件和帖子!
病毒分析分区附件样本、网址谨慎下载点击,可能对计算机产生破坏,仅供安全人员在法律允许范围内研究,禁止非法用途!
禁止求非法渗透测试、非法网络攻击、获取隐私等违法内容,即使对方是非法内容,也应向警方求助!
本帖最后由 Payload_82 于 2024-4-30 19:09 编辑

好久不分析,进来水个贴。。。
看到一个国外厂商发了报告,其中的样本为dll,是注册系统服务后运行的样本。于是尝试一番找到了调试的方法,记录和分享一下。
报告链接:https://blog.talosintelligence.com/tinyturla-next-generation/

由于dll文件无法独立运行,必须依赖宿主进程,因此需要使用 svchost.exe 承载这个样本dll。经过查看各位前辈的经验以及书籍资料。总结调试过程如下。

1. 创建系统服务

编写程序利用 Win32 API 创建系统服务,可以指定服务组名称,用 sc 创建服务似乎无法指定服务组名称。代码如下,注意编译为与调试样本相匹配的版本:

#include <windows.h>
#include <stdio.h>

int main()
{
        SC_HANDLE schSCManager;
        SC_HANDLE schService;

        // Get a handle to the SCM database.

        schSCManager = OpenSCManager(
                NULL,                                                // Local computer
                NULL,                                                // ServiceActive database
                SC_MANAGER_CREATE_SERVICE);        // full access rights

        if (NULL == schSCManager)
        {
                printf("OpenSCManager failed (%d)\n", GetLastError());
                return 1;
        }

        // Create the service

        schService = CreateService(
                schSCManager,                                // SCM database
                TEXT("test"),                                // name of service
                TEXT("My Sample Service"),        // service name to display
                SERVICE_ALL_ACCESS,                        // desired access
                SERVICE_WIN32_SHARE_PROCESS,// service type: share service
                SERVICE_DEMAND_START,                // start type
                SERVICE_ERROR_NORMAL,                // error control type
                TEXT("C:\\Windows\\System32\\svchost.exe -k MyServiceGroup"),        // path to service's binary
                NULL,                                                // no load ordering group
                NULL,                                                // no tag identifier
                NULL,                                                // no dependencies
                NULL,                                                // LocalSystem account
                NULL                                                // no password
        );

        if (schService == NULL)
        {
                printf("Create Service failed %d\n", GetLastError());
                CloseServiceHandle(schSCManager);
                return 1;
        }
        else printf("Service installed sccuessfully\n");

        CloseServiceHandle(schService);
        CloseServiceHandle(schSCManager);

        return 0;
}

本次调试的样本是64 位的,因此编译为 x64 版本。

用管理员权限运行程序,也可以用x64dbg调试查看运行是否成功。

2. 配置注册表

2.1 创建服务组 MyServiceGroup

在注册表目录 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost 下,创建自己的服务组,单独存放要调试的服务。

右侧创建 多字符串值 ,名称修改为 “MyServiceGroup”,也可以修改为其他自定义的名称,注意区别于系统的服务组即可。

打开新创建的 多字符串值 键,窗口中填写服务名称,例如 test

2.2 设置服务参数

在注册表目录 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\test\ 下,注意这个服务名称 test 是步骤一和步骤二的代码中指定的名称。

创建子项 Parameters 项,右侧新建一个 可扩充字符串值 类型的键,名称为 ServiceDll,值为 DLL 文件路径:C:\test\out.dll

3. 修改函数入口点指令

找到样本的导出函数 ServiceMain 的入口点,修改汇编指令为 EB FE,这个指令的意思是跳转到当前位置,这样就会陷入无限循环,这个时候附加进程后再还原指令,就能从开始位置调试服务了。

注意,不能改成 CC,会导致后续启动服务时启动失败。

使用 PE 工具找到导出函数 ServiceMain 函数的入口点,在文件中的偏移。

修改后将样本文件存放到步骤3 指定的目录下,这里是 C:\test\out.dll

4. 启动服务

注意:先打开 procexp64.exe,为查看新启动的 svchost.exe 进程的 PID 做准备。

用管理员权限启动 cmd,执行 sc 命令启动服务:

5. 用调试器附加 svchost

procexp64.exe 查看新创建的 svchost.exe 进程,鼠标指向该进程后,弹出的浮窗中会显示该进程加载的服务组名称,找到自己创建的 MyServiceGroup 对应的 svchost.exe 进程。

管理员权限打开 x64dbg,附加进程 704,找到 out.dll 的加载基址。

6. 修改入口点

根据内存地址和导出函数 ServiceMain 的 RVA ,计算出实际的 VA 是 7FEF303DD10,跳转到该地址。

在该地址下断点,之后再将 EB FE 修改为正确的指令 48 83 即可。

即可开始正常调试样本了。

请求C2:

参考资料

《深入解析Windows操作系统第6版上册》第4章第2小节 服务

window服务调试(一):winodw服务运行原理

window服务调试(二):调试windows服务方法

使用Windbg&OllyDbg从头调试windows服务

[原创]记录自己调试windows服务的操作

简述:ServiceMain主函数的动态调试

样本(解压密码 52pojie):

267071df79927abd1e57f57106924dd8a68e1c4ed74e7b69403cdcdf6e6a453b.7z (123.52 KB, 下载次数: 7)

免费评分

参与人数 2威望 +1 吾爱币 +21 热心值 +2 收起 理由
Hmily + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
janken + 1 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

沙发
beatone 发表于 2024-5-2 17:56
佩服技术大佬
3#
flyingdancex 发表于 2024-5-2 22:31
4#
殇。默语 发表于 2024-5-3 09:04
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-18 03:02

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表