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í)。