真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

unicorn解決OLLVM字符串混淆通用方法是什么,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

成都創(chuàng)新互聯(lián)公司主營(yíng)寧洱網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,手機(jī)APP定制開發(fā),寧洱h5微信小程序定制開發(fā)搭建,寧洱網(wǎng)站營(yíng)銷推廣歡迎寧洱等地區(qū)企業(yè)咨詢

AndroidNativeEmu 在面對(duì)沒(méi)有加殼的 so 還是挺好用的,不過(guò)遇到加殼的 so,就會(huì)力不從心的,需要 dbg 才行。

解決字符串混淆思路,其實(shí)和 frida 讀取混淆字符串方法一樣,在內(nèi)存中字符串是被解密狀態(tài)的,所以在內(nèi)存中拿就可以了, 而且 Unicorn 提供了 unicorn.UC_HOOK_MEM_WRITE 來(lái) hook 操作內(nèi)存中的數(shù)據(jù)

干貨代碼如下:

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
# 加載預(yù)設(shè) 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 需要設(shè)置為 true
emulator.mu.hook_add(unicorn.UC_HOOK_MEM_WRITE, UC_HOOK_MEM_WRITE)  # 準(zhǔn)備 UC_HOOK_MEM_WRITE 回調(diào)解決字符串加密
"""
讀出代碼,并將被加密的字符串修改回去
"""
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  # 加載基質(zhì)
    if base <= i <= (base + lib_module.size):  # 利用加載地址判斷
        offset = i - base - 0x1000  # 并不是連續(xù)加載,是文件中的偏移
        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文件地址 運(yùn)行后就會(huì)導(dǎo)出解密后的 so
注意事項(xiàng):

  • 有的時(shí)候so有交叉調(diào)用,無(wú)法直接解密,需要hook住調(diào)用函數(shù),來(lái)解決異常

關(guān)于unicorn解決OLLVM字符串混淆通用方法是什么問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。


網(wǎng)站題目:unicorn解決OLLVM字符串混淆通用方法是什么
文章位置:http://weahome.cn/article/jgjsjj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部