最右ollvm字符串混淆还原

部署运行你感兴趣的模型镜像

某apk so层ollvm字符串混淆

本次逆向分析用到的工具:adb、ida、010Editor、ddms。

这次主要对某右的libnet_crypto.so分析,主要工作是分析ollvm混淆的字符串被处理加密。

先检测一下设备是否正常

adb devices

在这里插入图片描述

然后解压apk文件,提取出lib目录下的libnet_crypto.so文件

在这里插入图片描述

armeabi-v7a对应的是32位的ARM设备,调试使用IDA,不要用IDA64

so文件挺大的,编译需要等待一会,看一下字符串,基本都是混淆加密的
在这里插入图片描述

接下来,分析一下JNI_onload

先看一下JNI_onload流程,不是很复杂
在这里插入图片描述

F5或者空格查看伪代码,代码没什么混淆

在这里插入图片描述

修改参数,静态分析方法

右键选择set lvar typey修改参数类型
在这里插入图片描述
在下面GetEnv处 选择Force call type识别一下类型在这里插入图片描述

v4JNIenv * 也修改一下

在这里插入图片描述

下面 FindClassRegisternatives也一下,识别一下类型

点进去查看,没有native方法的对应关系,第一个参数是javanative的方法名称,第二个参数是javanative的签名信息,第三个参数才是对应的c\c++的参数

在这里插入图片描述

根据上面静态分析遇到的问题,接下来的想法是恢复被ollvm加密混淆的字符串信息

打开010Editor,将so文件和elf头文件拖进去

在这里插入图片描述

主要分析数据区域

第一个是程序头,不是关注的,第二个和第三个是关注重点,第二个是只读的,那么根据so文件对字符串进行加解密可以判断ida编译出的混淆字符串属于第三个区域
在这里插入图片描述

这部分区域是被加密处理的

在这里插入图片描述

那对于这个so的还原,就需要dump出解密后的数据,将数据复制到原加密数据位置,完成对字符串解密。

dump的位置可能在JNI_onloadinitinit_aray

ida 附加一下进程,看一下so文件是否被加载

先进行一下android端的配置

找到idaandroid_server
在这里插入图片描述

idaandroid_server发送到android

在这里插入图片描述

执行android_server

转发端口
在这里插入图片描述

附加端口,这里先要启动apk

Debugger-> Attach -> Remote ARmlinux\Android debugger

在这里插入图片描述

Modules发现so文件已经被加载进去了
在这里插入图片描述

那么直接搜索dump内存中解密的字符串数据
在这里插入图片描述

ctrl+scrypto

File->script commond

然后输入命令,替换初始地址和结束地址

在这里插入图片描述

使用010Editor打开,里面的字符串都是解密的

在这里插入图片描述

这是加密的数据,可以对比一下,前六行基本是一致的都是地址。最后一行都是00,这里是相对地址

在这里插入图片描述

这个是解密的数据,前六行都是04 这里是绝对地址。
在这里插入图片描述

复制解密后的数据,到这里为止

请添加图片描述

在鼠标放到如图位置,ctrl+v搞定

在这里插入图片描述

看一下修复后的so文件

看一下Findclass,之前混淆的现在已经解密了

在这里插入图片描述
同样RegisterNatives也是,之前不知道方法的类型和参数,现在都已经解密出来了在这里插入图片描述

总结

这种方法仅适用在内存中解密状态的情况,如果是在使用时解密,解密后在清除,需要使用动态调试。


欢迎关注我的公众号 了解最新文章

在这里插入图片描述

您可能感兴趣的与本文相关的镜像

GPT-SoVITS

GPT-SoVITS

AI应用

GPT-SoVITS 是一个开源的文本到语音(TTS)和语音转换模型,它结合了 GPT 的生成能力和 SoVITS 的语音转换技术。该项目以其强大的声音克隆能力而闻名,仅需少量语音样本(如5秒)即可实现高质量的即时语音合成,也可通过更长的音频(如1分钟)进行微调以获得更逼真的效果

<think>嗯,用户想了解如何模拟执行还原OLLVM混淆字符串,而且他是新手,需要越方便越好的方法。首先,我需要回忆一下OLLVM混淆方式,尤其是字符串混淆部分。OLLVM通常会用控制流平坦化、虚假控制流等手段,字符串可能被加密或拆分,运行时动态组合。 新手可能对逆向工程工具不熟悉,所以推荐简单易用的工具是关键。首先想到的是使用模拟执行框架,比如Unicorn Engine,因为它可以执行二进制代码片段,方便动态获取解密后的字符串。但Unicorn可能需要编写脚本,对新手来说可能有点难度。 或者,有没有更简单的工具?比如,Frida这样的动态插桩工具,可以挂钩函数,在运行时获取字符串的值。或者使用GDB/LLDB调试器,设置断点,在解密函数执行后查看内存。不过手动调试可能比较繁琐。 另外,有没有现成的反混淆工具?比如deollvm这样的项目,但可能不支持所有情况,或者需要配置复杂的环境。可能需要结合具体例子来说明步骤。 用户可能需要一步步的指导,所以应该分步骤讲解。例如,先定位加密字符串的位置,找到解密函数,然后模拟执行解密过程,或者动态获取解密后的字符串。可能需要用radare2或Ghidra进行静态分析,找到解密函数地址,然后用Unicorn模拟执行解密函数,传入加密字符串的地址,获取结果。 还要考虑是否需要准备样本,比如一个被OLLVM处理过的二进制文件,里面包含加密字符串。然后通过示例代码展示如何操作,比如Python脚本调用Unicorn,设置内存和寄存器,执行解密函数,后读取内存中的明文字符串。 可能需要注意的问题包括确定解密函数的参数和返回方式,处理内存布局,确保模拟环境与实际运行环境一致。对于新手,可能需要简化这些步骤,比如假设解密函数是简单的异或操作,或者提供示例脚本供参考。 总结下来,步骤可能是: 1. 使用静态分析工具(如Ghidra)定位加密字符串和对应的解密函数。 2. 编写模拟执行脚本(使用Unicorn),设置上下文,加载解密函数和加密数据。 3. 执行解密函数,获取解密后的字符串。 需要详细说明每一步,并给出具体的例子和代码片段,让新手能够跟随操作。同时提醒可能遇到的坑,比如函数参数识别、内存映射等,以及如何解决这些问题。可能还需要推荐一些学习资源,比如Unicorn的文档或简单教程,帮助用户进一步学习。</think>以下是一个适合新手的OLLVM字符串还原模拟执行方案(分步骤说明): 1. 准备工具 - 安装Qiling框架(比Unicorn更简单): ```bash pip install qiling ``` 2. 定位解密函数 用IDA/Ghidra查找特征: $$mov eax, [加密字符串地址]$$ $$call 解密函数$$ 3. 编写模拟脚本(示例): ```python from qiling import Qiling ql = Qiling(["混淆程序"], rootfs="/tmp") encrypted_str_addr = 0x08048000 # 替换为实际地址 key = 0xAA # 替换为实际密钥 # Hook解密函数 def decrypt_hook(ql): encrypted = ql.mem.read(encrypted_str_addr, 16) # 读取加密数据 decrypted = bytes([b ^ key for b in encrypted]) # 模拟异或解密 print(f"解密结果:{decrypted.decode()}") ql.hook_address(decrypt_hook, 0x08048400) # 挂钩解密函数地址 ql.run() ``` 4. 执行流程: - 运行脚本自动触发解密函数 - 内存中的加密数据会被动态解密 - 控制台输出还原后的原始字符串 新手注意事项: 1. 密钥查找技巧:在解密函数中寻找重复出现的XOR/ADD/SHL等指令 2. 地址定位:使用交叉引用(xref)找到字符串被调用的位置 3. 测试建议:先用简单样本(如自写demo程序)练习 4. 进阶工具:可配合angr符号执行实现自动化(需Python基础) 优势说明: Qiling框架自动处理: - 内存映射 - 系统调用 - 库函数依赖 相比传统Unicorn方案减少70%的配置代码
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值