某CCC-BASE的逆向

背景

很早之前就已经分析过一遍,一直放在。今天突然又看到了,放着也是放着,索性拿出来分享一下,很多东西的细节省略了,这里只是谈及用到了什么技术,具体细节需要自己去学习;这里的版本是22-03-14,时间比较久了,有些可能说的不全,可能和你的分析有差别,以你的为准。

分析

为了方便描述,这里就从驱动入口开始,去掉敏感信息,初始化MJ函数。之后初始化了一个事件。后面会创建了一个符号连接,之后会提到。

 这样就有了两个符号连接,这里称为A和B,A是用来初始化的,B是用来获取各个信息。来看看A中有什么东西(通信数据被加密,可逆,这里省略),内容很多,挑感兴趣的说一下。

反调试

每次通信时会检测的东西,前提是打开反调试。获取debugport、检测peb、queryprocess 1f、ticketcount是否大于5000,检测到之后结束被调试的进程

顺便分离内核调试

初始化各种数据

api初始化,获取各个函数的地址

 ssdt/shadowssdt、pagelist、gTimerHashTable、lasspid、crsspid、以及win32k的某些偏移(对窗口、绘制等东西不熟,所以这里获取到的某些结构,我也不知道是什么)、ptebase等一些数据。

获取物理内存的使用和vad的偏移,以及获取ssdt表的各个函数

 初始化系统线程,每十秒执行一次

枚举受保护进程的FreezeCount

 20一次的枚举debugport、threadhinden、检测内核线程、以及和时间相关的东西

 

 30s一次的内核调试器分离,vm代码中有SharUserData的相关检测、以及KdRefreshDebuggerNotPresent,检测到bugcheck蓝屏

 其他功能

进程、线程、dll回调、ob都注册了,看看检测了什么东西。

时间检测

 vt和SharUserData检测

 mapping检测

 shellcode检测,和mdl有关,这里先看一看

 一些不常见检测

intelPT和nmi中断相关的blog在分析之后也看到过,不过比我当时分析的更详细,更具体,这里简单描述一下,这两个功能的目的都是中断下来检测当前的rip是否在收保护的进程中操作,如果是这里会保存下来,给你标记下来。

https://bbs.pediy.com/thread-273980.htm

https://bbs.pediy.com/thread-274613.htm

 hook 0e是的,它真的还在,不过做的方式是替换页表,而且在kpti开启的情况下会蓝屏,具体可以参考看雪的blog,这里就是给一个假的cr3,记录访问这个cr3的进程,好消息是17763不支持(难道是有什么难言之隐,就算没有,也只有在不支持内核页表隔离的系统上跑)

 MiTrackPtesAborted、MiDeadPteTrackerSListHead、MmTrackPtes mdlmapping映射检测,简单来说就是当mapp结束之后会插入到MiDeadPteTrackerSListHead链表,这里会开一个线程去检测这里面的数据

其他地方的线程暂停检测 

检测线程的栈信息

 当前计算机信息收集获取ataport.sys、storport.sys、CLASSPNP.sys、ndis、scsi等一些计算机网络、串口、文件的驱动,调用他们并获取计算机的信息,这里需要注意的是只支持19041一下的版本,瞧不起我19041以上的用户?这里的信息可以通过符号路径B获取到对应的数据

 还有很多接口,这里就不一一列举了。

符号链接B的接口

这里也列举几个有意思的接口,其中有几个可以利用的接口,mdlread,以及内核内存读,这里没有写。

 以及很多接口

 这里选两个受害者出来看看,第一个是取消apc,通过将ethread下的SchedulerApc直接ret的方式取消apc的调用

 第二个是调整当前进程的vad属性,参考blog​​​​​​​可以看看

 其实里面还有很多内容,有兴趣的可以自己去学习学习。

### 如何正确停止或关闭 ACE-BASE 服务 要正确停止或关闭基于 ACE(Advanced Communication Environment)框架构建的服务或程序,通常需要遵循特定的设计模式和机制来确保资源被安全释放并终止运行中的线程或进程。以下是关于如何实现这一目标的具体说明: #### 关闭逻辑的核心概念 ACE 提供了一种优雅的方式用于管理生命周期结束时的操作,例如清理资源、关闭文件描述符以及断开网络连接等。这可以通过调用 `handle_close()` 方法完成,该方法会触发一系列操作以逐步销毁对象实例及其依赖项[^1]。 具体而言,在子类化自 `ACE_Event_Handler` 的处理程序中重写 `handle_close()` 函数可以定义具体的退出行为。当某个事件发生或者显式请求关闭时,这个函数会被自动调用。它不仅负责执行必要的清理工作还可能涉及通知其他组件当前状态的变化情况。 对于更复杂的场景比如长时间持有锁之后再解锁的情况,则需注意时间间隔控制以免影响性能表现。如下代码片段展示了这种情形下的调试信息记录过程[^2]: ```cpp if (diff_msec > ACE_ALLOWED_SLACK) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("Acquire fails time reset test\n"))); ACE_DEBUG((LM_DEBUG, ACE_TEXT("Diff btw now and returned time: %d ms\n"), diff.msec())); } // Simulate holding the lock for some period. ACE_OS::sleep(ACE_Time_Value(0, (ACE_OS::rand() % 1000) * 1000)); evt.signal(); ``` 另外值得注意的是,默认情况下除非特别配置否则任何未经许可尝试访问受限功能的行为都将遭到拒绝。如果希望更改此项策略可通过适当调整配置参数达成目的,例如下面的例子设置了默认允许所有服务/命令权限[^3]: ```plaintext user = lol { default service = permit; } ``` 综上所述,为了妥善地停运一个基于ACE架构的应用程序应当考虑以下几个方面: - 实现定制版的 `handle_close()` 来适配实际需求; - 考虑并发环境下的同步问题并通过合理手段加以解决; - 根据业务特性灵活运用各类辅助工具如定时器等等;最后别忘了审查安全性设定防止意外暴露敏感接口给未经授权方使用。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值