网创优客建站品牌官网
为成都网站建设公司企业提供高品质网站建设
热线:028-86922220
成都专业网站建设公司

定制建站费用3500元

符合中小企业对网站设计、功能常规化式的企业展示型网站建设

成都品牌网站建设

品牌网站建设费用6000元

本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...

成都商城网站建设

商城网站建设费用8000元

商城网站建设因基本功能的需求不同费用上面也有很大的差别...

成都微信网站建设

手机微信网站建站3000元

手机微信网站开发、微信官网、微信商城网站...

建站知识

当前位置:首页 > 建站知识

unicorn解决OLLVM字符串混淆通用方法是什么

unicorn解决OLLVM字符串混淆通用方法是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

成都创新互联公司主营宁洱网站建设的网络公司,主营网站建设方案,手机APP定制开发,宁洱h5微信小程序定制开发搭建,宁洱网站营销推广欢迎宁洱等地区企业咨询

AndroidNativeEmu 在面对没有加壳的 so 还是挺好用的,不过遇到加壳的 so,就会力不从心的,需要 dbg 才行。

解决字符串混淆思路,其实和 frida 读取混淆字符串方法一样,在内存中字符串是被解密状态的,所以在内存中拿就可以了, 而且 Unicorn 提供了 unicorn.UC_HOOK_MEM_WRITE 来 hook 操作内存中的数据

干货代码如下:

import logging
import sys
import os
import unicorn
import struct
from androidemu.emulator import Emulator
sys.path.append(os.path.abspath(os.path.dirname(os.path.dirname(__file__))))
logging.basicConfig(
    stream=sys.stdout,
    level=logging.DEBUG,
    format="%(asctime)s %(levelname)7s %(name)34s | %(message)s"
)
logger = logging.getLogger(__name__)
emulator = Emulator(vfp_inst_set=True)  # 初始化模拟器
# 字符串解密
so_file = "test/test.so"
modify_map = {}  # 接收字典
def UC_HOOK_MEM_WRITE(mu, _type, address, size, _value, user_data):
    byte_array = struct.pack("I", value)[:size]
    modify_map[address] = byte_array
    return
# 加载预设 so
emulator.load_library("example_binaries/libdl.so", do_init=False)
emulator.load_library("example_binaries/libc.so", do_init=False)
emulator.load_library("example_binaries/libstdc++.so", do_init=False)
emulator.load_library("example_binaries/libm.so", do_init=False)
lib_module = emulator.load_library(so_file, do_init=True)  # do_init 需要设置为 true
emulator.mu.hook_add(unicorn.UC_HOOK_MEM_WRITE, UC_HOOK_MEM_WRITE)  # 准备 UC_HOOK_MEM_WRITE 回调解决字符串加密
"""
读出代码,并将被加密的字符串修改回去
"""
with open(so_file, 'rb') as f:
    content = f.read()
print(modify_map)
for i in modify_map:
    value = modify_map[i]
    base = lib_module.base  # 加载基质
    if base <= i <= (base + lib_module.size):  # 利用加载地址判断
        offset = i - base - 0x1000  # 并不是连续加载,是文件中的偏移
        content = content[:offset] + value + content[offset + len(value):]
down_file = so_file + ".fix"
with open(down_file, 'wb') as df:
    df.write(content)
    print('写出完毕', down_file)

**
修改 so_file = so文件地址 运行后就会导出解密后的 so
注意事项:

  • 有的时候so有交叉调用,无法直接解密,需要hook住调用函数,来解决异常

关于unicorn解决OLLVM字符串混淆通用方法是什么问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注创新互联行业资讯频道了解更多相关知识。


分享文章:unicorn解决OLLVM字符串混淆通用方法是什么
本文来源:http://bjjierui.cn/article/jgjsjj.html

其他资讯