avatar

目录
OceanLotus Encryptor

OceanLotus Encryptor

样本大小22MB,大的有点离谱,查看资源发现资源内有很多内容,但是直接看不出来

代码经过混淆,在IDA中甚至不能识别到Main函数,后来发现是一个自写的壳,在OD动态调试中发现很多混淆和无意义的指令,exe会将修改后的自身拷贝到%temp%目录下,并CreteProcess创建子进程,格式为:%temp%[random].tmp –-splash[parentpath] [0-9a-f]{64},这里的创建子进程特征与360发布的OceanLotus Encryptor十分类似。

在创建的子进程BC8B.tmp断下

与父进程一样,修改某一片内存的属性并将内容动态修补为代码,父进程和子进程的代码一致

判断程序运行的参数,当参数为空或者没有参数–splash时,会直接退出进程,这里是反调试的其中一部分,当直接启动子进程时会直接退出程序不触发行为

在调试过程中,发现用OD调试子进程时,会出现CreateFile父进程程序时,CreateFile函数的参数没有截断,将程序运行的参数当作的文件名的一部分去调用,导致CreateFile出错,程序不能运行。

红色的地方从20 00修改为00 00,截断后可以正常执行后续步骤,不过还是没明白为何直接双击运行时,子进程的CreateFile参数是正确的文件名,但是OD调试的时候会出现把运行参数当作文件名的一部分的情况。

检测父进程的文件是否存在:

从文件资源中,提取ResourceName为0x65的资源,资源大小为:0x42B5

将获取的资源解密后释放,并重新覆盖原文件,覆盖完成后再调用执行覆盖后的文件,覆盖后为一个加密的.docx文档

接着检测虚拟机,使用指令vpcext 7, 0Bh和后门指令检测EBX == 0x564D5868,判断是否在虚拟机中运行。在实际调试过程中,由于代码中的混淆代码使用jz,jnz来对同一地址进行跳转,导致在调试时检测虚拟机的代码被分开,不知道是我眼神有问题还是这代码真的很恶心,tmd找了半天才找见。

Code
1
2
3
4
5
6
mov EAX, 564D5868h ; VMXh
xor EBX, EBX ; set EBX to anything but 0x564D5868 (in this case 0)
mov CX, 0Ah ; Backdoor command. 10: Get VMware version
mov DX, 5658h ; VX
in EAX, DX ; Read from port VX into EAX
cmp EBX, 564D5868h ; EBX should have the magic number VX is VMware is present.

在过了反虚拟机之后,发现怎么调试都调试不通,仔细反思了一下,整个代码流程都是按照原来的程序流跑的,我唯一改动的一点是前面的参数,将“20”改成了“00”。因为在调试时,内存中的“20”没有将参数截断,导致调用函数CreateFile的时候将随机数作为文件名传入,所以函数调用失败,所以我改成了“00”截断。但是现在程序流不通,我感觉唯一出问题的就是这地方,在Monitor工具将参数拿出来:

在记事本中发现中间是空白,而且将命令直接复制到cmd.exe中运行,CreateFile依然会失败,后来用十六进制工具查看,发现中间是“09”截断

在前面CreateFile之前修改内存中的路径为“09”截断,并且过掉反虚拟机,程序才可以正常跑起来。不过我还是没明白,镜像劫持的子进程,这参数为啥会出现这种问题。

然后会通过传参时的0x80大小的密钥进行解密数据,解密后通过比较解密后的数据是否与“0x12345678”相等,以此判断传入的密钥是否正确。

获取%APPDATA%路径

从Kernel32.dll获取GetProcAddress,获取CreateDirectoryW的地址,并创建路径”C:\Users\sam\AppData\Roaming\Tencent\QQ”。

image-20210512172901611

在该文件夹下释放文件“qq.exe”、“qq.exe.bak”、“qq.exe.dll”,并新建目录Plugin\Com.Tencent.DirectShow\Bundle.rdb

后续等啥时候有空在分析吧,我还是太菜了。

文章作者: Yenn_
文章链接: https://0xdf1001f.github.io/2021/05/08/OceanLotus-Encryptor/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Wei's Blog

评论