分类 信息安全 下的文章

如果图片看不见可以先移步看雪论坛的帖子 https://bbs.pediy.com/thread-265907.htm

0x00 前言

在官网下载UltraISO 软碟通的安装包,一顿操作安装好之后,打开程序之后弹出尚未注册的窗口,输入注册码提示需要重启软件,猜测在打开软件之后会通过某些操作比较输入的注册码。

image-20210205112643381

0x01 寻找注册码验证方式

既然猜测是在程序启动的时候有一些操作验证注册码,不妨使用火绒剑对主程序(UltraISO.exe)进行监控看看它在启动的时候做了什么事情。

通过简单的观察发现了一处可疑注册表读取操作,大胆猜测我们之前输入的注册码就是通过注册表来保存,并且在程序重启的时候进行验证。 image-20210205113707569

用x32dbg和IDA打开UltraISO.exe进行分析,并在x32dbg中对RegOpenKeyA下断点,通过栈回溯结合IDA的反编译结果定位到了读取注册表中注册码的函数。 image-20210205114824635 image-20210205114951562

CTRL+F9跑出这个函数看看后面哪里用到了我们的注册码,在0x0040190C函数里用到了我们输入的Name和Key,这里应该就是验证算法函数了,结合红绡枫叶前辈的帖子UltraISO注册算法&keygen分析虽然地址不同不过汇编代码都是大致相同的,本文的核心还是在破解部分对于验证算法的分析我就不班门弄斧了,可以去看红绡枫叶前辈的分析帖子。

接着F8往下走,遇到一个比较跳转的部分,先让跳转生效看一下效果。 image-20210205115820215

打开依旧还是未注册版本,我们返回去给0x7C8F84下断点看看后面还有哪些地方用到了,接着跳过未注册窗口运行起来,又断在了一个比较跳转地方,在IDA里面的这一条语句也包含了下一个的跳转。 image-20210205120822604 image-20210205120844600

因为我们现在肯定是错误的注册码,所以先以相反的方向执行跳转然后在运行起来看是否注册成功,运气很好这三个跳转修改掉之后就注册成功了。

image-20210205121110411

最后还有一个小坑,上面修改完文件保存会闪退,x32dbg下CreateFileA断点然后栈回溯在结合IDA发现在文件另存为和保存的时候会再次判断注册码。 image-20210205200226375 image-20210205200250741

0x02 总结

总共就是要Patch 4个地方,生成的新应用程序覆盖掉之前的UltraISO.exe就可以了

0x004030A8  74 -> EB
0x00423C61  75 15 -> 90 90 
0x00423C76  74 -> EB
0x0044BBD0   74 -> EB

本程序的验证算法部分还是有难度的,不过结合火绒剑等分析工具破解对于新手试手还是比较友好的,不知道为什么没有遇到网上以前的分析文章遇到的ASPack壳

TLS回调函数反调试技术

0x00 什么是TLS 回调函数

TLS是各线程的独立的数据存储空间,使用TLS技术可在线程内部独立使用或修改进程的全局数据或静态数据,就像对待自身的局部变量一样,多用于线程间同步。
TLS (Thread Local Storage 线程局部存储 )回调函数每当创建/终止进程的线程时会自动调用执行的函数。

void NTAPI TLS_CALLBACK(PVOID DllHandle, DWORD Reason, PVOID Reserved)//回调函数的声明,和DllMain类似

0x01 如何反调试

由于在创建主线程的时候会自动调用TLS回调函数,并且调用的时机早于OEP的执行,所以可以在程序入口点之前在TLS回调函数内部完成对调试器的检测。

反调试Demo代码如下;

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

typedef NTSTATUS(NTAPI* pfnNtQueryInformationProcess)(
    _In_      HANDLE           ProcessHandle,
    _In_      UINT             ProcessInformationClass,
    _Out_     PVOID            ProcessInformation,
    _In_      ULONG            ProcessInformationLength,
    _Out_opt_ PULONG           ReturnLength
    );
const UINT ProcessDebugPort = 7;


typedef NTSTATUS(NTAPI* pfnNtSetInformationThread)(
    _In_ HANDLE ThreadHandle,
    _In_ ULONG  ThreadInformationClass,
    _In_ PVOID  ThreadInformation,
    _In_ ULONG  ThreadInformationLength
    );
const ULONG ThreadHideFromDebugger = 0x11;



//告知连接器使用TLS
#pragma comment(linker, "/INCLUDE:__tls_used")

DWORD isDebuggerPresent = 0;
void NTAPI TLS_CALLBACK1(PVOID DllHandle, DWORD Reason, PVOID Reserved)
{
    if (Reason == DLL_PROCESS_ATTACH) //和DLL类似
    {
        MessageBox(NULL, _T("TLS_CALLBACK 1 函数执行"), _T("提示"), MB_OK);
        //利用NtQueryInformationProcess执行反调试
        HMODULE hNtDll = LoadLibrary(_T("ntdll.dll"));
        pfnNtQueryInformationProcess NtQueryInformationProcess = (pfnNtQueryInformationProcess)GetProcAddress(hNtDll, "NtQueryInformationProcess");
        NTSTATUS status = NtQueryInformationProcess(GetCurrentProcess(), ProcessDebugPort, &isDebuggerPresent, sizeof(DWORD), NULL);

        if (status == 0x00000000 && isDebuggerPresent != 0)
        {
            MessageBox(NULL, _T("Debug!!!"), _T("提示"), MB_OK);
            exit(-1);
        }
    }

}

void NTAPI TLS_CALLBACK2(PVOID DllHandle, DWORD Reason, PVOID Reserved)
{
    if (Reason == DLL_PROCESS_ATTACH)
    {
        MessageBox(NULL, _T("TLS_CALLBACK 2 函数执行"), _T("提示"), MB_OK);

        //利用NtSetInformationThread执行反调试
        HMODULE hNtDll = LoadLibrary(_T("ntdll.dll"));
        pfnNtSetInformationThread NtSetInformationThread = (pfnNtSetInformationThread)GetProcAddress(hNtDll, "NtSetInformationThread");
        NTSTATUS status = NtSetInformationThread(GetCurrentThread(),ThreadHideFromDebugger, NULL, 0);//停止发送关于调试事件的通知
    }

}

int main(void)
{
    MessageBox(NULL, _T("Main函数执行"), _T("提示"), MB_OK);
    return 0;
}

#pragma data_seg(".CRT$XLX")
//存储回调函数地址
PIMAGE_TLS_CALLBACK pTLS_CALLBACKs[] = { TLS_CALLBACK1, TLS_CALLBACK2, NULL };
#pragma data_seg()

0x02 如何反反调试

我们发现直接拖入OD中去,程序自动跑了起来,运行结束就终止了毫无调试的空间,此时就要使用OD上的一个非常好用的插件了 StrongOD 并勾选上 Break on Tls

image-20210119161712692

重新加载程序就会断在TLS回调函数1上了

image-20210119162342923

image-20210119162027803

在根据IDA和OD动静配合解掉反调试

0x03 参考资料

TLS回调函数

Windows平台常见反调试技术梳理(上)

Windows平台常见反调试技术梳理(下)

0x04 TLS反调试实例:

18年网鼎杯第二场 give_a_try

如果图片看不见可以先移步看雪论坛的帖子 https://bbs.pediy.com/thread-264660.htm

样本基本信息

MD5:ae986dd436082fb9a7fec397c8b6e717
SHA1:31a0168eb814b0d0753f88f6a766c04512b6ef03
SHA256:3110f00c1c48bbba24931042657a21c55e9a07d2ef315c2eae0a422234623194

image-20201224203049898

思维导图

image-20201225193828852

行为分析

image-20201224205008067图标和名字伪装成ESET的升级程序,打开火绒剑设置过滤信息后,双击后弹窗提示升级成功,查看火绒剑捕获的动作信息

image-20201224205055495

火绒剑自动高亮了一个行为,这个是把C:\Users\Administrator\AppData\Roaming\目录下的程序加到开机启动项,前面的几步就是把释放的程序放到这个目录下

image-20201224205220083

详细分析

查壳

image-20201224210607192image-20201224211030831

32位程序无壳,在Keygener中发现有Base64和CRC32怀疑程序内有一定的加密措施,拖到IDA中接着分析

导入表分析

通过分析导入表发现有网络连接和文件操作的相关函数,印证了前面火绒剑行为分析的结构,不过很奇怪为什么火绒剑没有监测到网络连接行为

image-20201224211536448
image-20201224211625625

函数分析

WinMain

image-20201224213432292

sub_4011E0(LoadFunc)

进入函数后有一堆加密过的字符串和一堆GetProcAddress函数调用,猜测是动态加载某些函数,具体加载什么函数需要配合动态调试查看

image-20201224213715202

通过在OD中的动态调试发现这个函数就是导入了三个DLL(WININET.dll, urlmon.dll, kernel32.dll)

image-20201224214155723image-20201224214423343

前两个DLL 获取了网络相关函数

image-20201224220903027

kernel32获取了CreateToolhelp32Snapshot和WinExec

sub_403600(CopyMyselfAndBox)

这个函数简单来说就是把自身复制到特定目录,然后设置注册表实现自启动,最后弹窗欺骗用户升级成功已被保护

image-20201225091948396

sub_401580(GetNeInfo)

通过GetAdaptersInfo获取网卡相关信息

image-20201225101029046

GetVolumeInformation获取c盘序列号

image-20201225101135528

如果序列号获取失败就根据时间设置随机数

image-20201225101210701

sub_401770(GetSysInfo)

获取操作系统的相关信息,然后标准Base64编码一下

image-20201225102348387

image-20201225102223806

sub_402790(SetDomain)

把C2服务器的域名信息放置到注册表项SOFTWARE\Microsoft\Windows\CurrentVersion\Screensavers\ScreenRibbonsDomain中

image-20201225121614624

子线程分析

image-20201225122705512

sub_402F30(HTTPRequest)

前半部分先构造HTTP请求包

image-20201225125659487

后面利用先前动态加载的网络链接函数进行HTTP请求

image-20201225125816007image-20201225125903826

因为C2服务器现在无法链接了我就手动修改执行流程让程序以为自己收到了返回包接着执行

image-20201225130107885

后续就是从C2服务器接受数据,然后Base64解码传输的数据,在进行多字节到宽字节的转换

image-20201225130722944

把传输过来的数据经过一系列的运算来到sub_401AA0函数

sub_401AA0

生成一个临时文件名

image-20201225190330663

下面对此前从C2服务器接收到的数据通过“|”分割,依靠动物名字来下达指令,这里就到了样本的核心功能了远程控制

image-20201225190630766

比如:指令名为tiger时执行cmd指令

image-20201225191249012

指令名为monkey时,创建进程执行下载的程序

image-20201225192525182

指令名为fox和cat时会比monkey多一些注册表操作

image-20201225193132219

由于现在C2服务器已经连接不上了,其他一些的指令操作就不在详细分析,功能和我们一般见到的远控都差不多。

总结

这次样本分析总体来说比较常规,难度不算很大只要抓住主要执行脉络都能比较清晰的理解整个程序

参考链接

威胁情报

Kimsuky APT组织利用假冒的ESET安全软件更新程序进行恶意活动

010 Editor v11.0.1逆向破解

0x00 软件概况

使用工具:OD & IDA 7.2
破解平台:win7 x64

软件官网:https://www.sweetscape.com/010editor/
软件作用:010 Editor 是一款专业的文本和十六进制编辑器,其旨在快速轻松地编辑计算机上任何文件的内容。该软件可以编辑文本文件,包括 Unicode 文件、批处理文件、C/C++、XML 等,而在编辑二进制文件中,010 Editor 有很大的优势。

我下载的是32位安装版的程序,64位和便携版的破解方式应该是大同小异的

0x01 逆向分析

​ 安装完程序后简单查看了一下程序使用的DLL发现一大堆QT的DLL,所以传统的使用GetWindowTextW等Win32API对关键函数定位就不能起作用了。

1. 第一步本地验证

在随意输入用户名和注册码之后会出现以“Invalid name or password.”开头的弹窗,就可以通过IDA的交叉引用定位到调用该字符串的函数。image-20201112213723119.png (1139×467)

通过简单的上下翻阅可以发现关键if语句
image-20201112213834892

通过 v14 向上定位到复制的地址
image-20201112214124263

跟进KeyFunc函数,由上方关键if语句知道,如果要进入正确的语句块则 v14 = 0xDB 即 KeyFunc的返回值为0xDB。

使用OD动态调试可知,如果输入错误ebx会等于 0x177
image-20201112215124806

如果我们想要绕过验证则直接在IDA内把0x177的返回值修改为0xDB

image-20201112215508286

然后在Edit -> Patch program -> Apply patches to input file 保存文件
image-20201112215742352

至此我们就通过了第一步的本地验证,重新打开注册界面随意输入用户名和注册码都会通过验证

2. 网络验证

我们在愉快使用一段时间后,可能会重新出现注册码错误的或者提示连接服务器错误的提示,这就得突破网络验证机制了

在此前的关键if语句所在的函数中我们会发现以“Could not contact the webserver.”开头的字符串,往上阅读代码就可以发现网络验证错误打印跳转,结合OD可确定网络验证函数
image-20201112230114413

根据上下逻辑可知当网络验证函数返回正整数时即为通过网络验证

这里是直接把验证CALL给直接NOP掉了,就相当于PASS了网络验证了
image-20201112231543456

还要把此处的判断 nop掉,不然后续会弹窗,影响使用
image-20210422184010834
image-20210422184049912

0x02 总结

总的来说本程序的逻辑是比较清晰的,注册码算法部分本文未具体展开我们只展示了众多破解此程序的其中一种方法,如有错误,还望指正。

0x03 源程序安装包及破解程序

安装包:010EditorWin32
破解程序:010Editor

使用方法:下载俩个程序后,先运行安装程序待安装完成后把破解程序放到安装目录替换源程序

也可以直接使用绿色版(解压即可使用):绿色版

彩虹猫病毒(MEMZ)分析及思维导图

memz1

0x00 基本介绍

​ 彩虹猫病毒是一款MBR类型病毒,中招的用户MBR会被篡改重启后无法正常进入系统只会出现彩虹猫的动画。同时在中招之后用户的鼠标和键盘会间歇性失效,桌面不断出现弹窗并且出现负片效果,鼠标图标会被修改,发出错误提示的声音,诺通过任务管理器关闭MEMZ.exe进程桌面会出现大量弹窗,随后出现蓝屏。

​ 本文仅局限于逆向分析层面,如查壳,行为分析,运行效果分析等未在本文展开,文末会放上个人认为比较好的分析文章以供学习。

image-20201107104238650

0x01 环境及工具

应用程序名称:MEMZ.exe
MD5:19DBEC50735B5F2A72D4199C4E184960
SHA1: 6FED7732F7CB6F59743795B2AB154A3676F4C822
工具: IDA Pro 7.0 & OD&die
分析环境:VMware Workstation Pro 15 + Win7 x64

0x02 逆向分析

image-20201107110433438

程序中的函数很少我们只要把握大体执行流程,通过简单分析总共分为三大部分:

1. 初次运行执行流程

通过 GetCommandLineW 函数获取命令行参数,如果命令行无参数则为初次运行。

image-20201107105158378

弹出俩个弹窗对用户进行提醒,如果都选择确认病毒就正式运行

image-20201107105405242

创建了5个命令行参数为/watchdog的进程和一个命令行参数为/main的进程

image-20201107105907751

至此初次运行流程就已经结束了,接下来分析命令行参数为/watchdog的进程执行了什么

2. /watchdog

此模块创建了一个线程和名为“hax”的窗口,线程的回调函数稍后分析,先来看看windows窗口的消息处理函数

image-20201107110553380

我们发现消息处理函数只关注两个窗口关闭消息,如果捕获到了窗口关闭消息则触发 RandomBoxAndOverWindows 函数,那我们接下来就得分析该函数做了什么事情

image-20201107110820241

RandomBoxAndOverWindows

首先我们发现该函数创建了20个线程

image-20201107111312096

StartAddress

这个线程回调函数设置了消息钩子,对窗口创建进行挂钩让窗口出现的位置随机

image-20201107111409918
image-20201107111823503

弹窗的内容

image-20201107112051845

DestroyWindows

通过GetProcessAddress 获取 RtlAdjustPrivilege和NtRaiseHardError函数的地址,如果获取成功则先用RtlAdjustPrivilege函数提权如何使用NtRaiseHardError制造蓝屏;如果有一个获取失败则启动备用方案使用ExitWindowsEx 函数强制关机。

至此WndProcess消息回调函数就分析结束了,接下来回过头分析先前的线程回调函数

image-20201107113011378

ProtectSelf

循环创建进程快照,然后和自身路径进行比较,有相同的计数器就加1,假如有病毒进程被关闭了本次循环的计算器数值会小于上一次,就会进入RandomBoxAndOverWindows 函数,出现大量弹窗并引起蓝屏。

image-20201107113845506

3. /main

​ 接下来的操作就是本病毒最核心的部分了,对MBR的操作以及让电脑出现总总异常,这里放一个对MBR的介绍,简单的说就是早期系统的一个系统引导代码,从Win8开始以后的系统基本上都不在使用MBR分区做为系统引导了,都开始使用GPT分区了。

​ 将程序内的硬编码拷贝到申请的堆内存中去,然后再写入MBR区域,写入成功就弹出note.txt

image-20201107120243489

​ 然后就循环创建10个线程,线程函数都在405130处

image-20201107121218901
image-20201107121236491

​ 每个线程的功能都不相同,具体的功能都是由某个特定的API来实现的,相对来说是比较好分析的,这里就不具体展开了,就直接上思维导图里的图片了

image-20201107121529657

至此三大模块都分析完毕

0x03 总结

此病毒的分析还是比较顺利的,没有遇到什么反调试,对于病毒本身还是具有局限性的只能应用在使用MBR分区的操作系统中。在github上有人写出了源码,将在下面的参考文章中放出

0x04 参考文章

MEMZ源码参考

彩虹猫病毒的逆向