一種簡單實用的ollvm反混淆的方案與源碼

我是一名從事反欺詐&風控&設備指紋相關的工作,最近對ollvm的如何逆向的問題進行了學習與思考。
ollvm是一個開源免費的so混淆工具,對于逆向的小白來說簡直是災難性的存在。
這個例子是超簡單,我想每個人都可以學會跟掌握,

先上案例看看效果

我使用ollvm混淆了
libmyapplication4.so(附加),這個例子是針對test3()方法進行反混淆
ollvm的混淆打滿

1

SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -mllvm -fla -mllvm -bcf -mllvm -bcf_loop=3 -mllvm? -sub")

1

2

3

4

5

6

7

8

9

10

11

void test3(){

????bool a= false;

????if(!a){

????????std::string hello1 = "Hello from C++1";

????}

????__android_log_print(ANDROID_LOG_VERBOSE,"sanbalog","testlog %s","abc");

????bool b= false;

????if(!b){

????????std::string hello1 = "Hello from C++b";

????}

}

將libmyapplication4.so拖進ida,ida方法中搜索test3

ollvm混淆后的流程圖如下?

對應的按F5 返混淆的結果如下,代碼沒法看,總共兩百多行?使用基于unidbg開發的反ollvm 反混淆后的流程圖如下:

?按F5反匯編代碼如下:

相關的unidbg代碼在附件中,放到開源的unidbg中運行即可。接下來我講講原理吧。

原理篇

首先講講網上開源的跟一些前輩的處理方案,網上的處理方案比較復雜,大體流程如下:
1 收集代碼塊,這個代碼塊包含cesl指令向左還有向右收集一遍,收集代碼塊可以使用unidbg,hook代碼塊并對應執行對應方法,從而將代碼塊集合收集到
2 利用ollvm虛假代碼塊的特征將虛假代碼塊進行過濾,
3 將真實的代碼塊串聯起來。寫入so

我也跟著做了一遍,發現第1步非常容易出錯,一旦出錯某些代碼塊就沒有執行到,得到的結果是代碼出現丟失。那么腳本的兼容性就很難。
第2步,網上的前輩針對虛假代碼塊過濾也是寫了一大堆代碼,想理解起來也是比較麻煩,而且效果也不佳。
針對以上問題,讓問題變得更簡單兼容性更好,我的改進如下:
1 我直接執行一遍,將所有的代碼塊收集起來,不管它cesl指令。這里有個非常關鍵的地方是,真實的代碼塊只會執行一遍,如果如果代碼塊集合中已經存在,則不要添加進去,否則導致的結果是代碼丟失
2 根本不需要對虛擬代碼塊進行過濾,反混淆后,我們將真實執行的代碼塊串聯了起來,它們在F5逆向之后,并不會產生干擾代碼。其實最終的目的不就是為了看源碼嗎
最后如何將代碼塊串起來可能很多初學者無法理解。其實原理很簡單
將收集的代碼塊進行迭代,取當前的代碼塊最后一條指令地址,取下個代碼塊首個指令地址,算出跳轉過去要跳幾個自己,源碼中有,然后將當前代碼塊的最后一條執行改為B 跳轉

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/14652.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/14652.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/14652.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

RustGUI學習(iced/iced_aw)之擴展小部件(二十五):如何使用tab部件來創建tab多頁面切換?

前言 本專欄是學習Rust的GUI庫iced的合集,將介紹iced涉及的各個小部件分別介紹,最后會匯總為一個總的程序。 iced是RustGUI中比較強大的一個,目前處于發展中(即版本可能會改變),本專欄基于版本0.12.1. 概述 這是本專欄的第二十五篇,主要講述tab頁面切換部件的使用,會結…

[linux] bash中的單引號(‘)和雙引號(“)

在命令行中,單引號()和雙引號(")在某些情況下會有不同的效果,尤其是在涉及bash變量和特殊字符的解析時。在你給出的兩個命令中: ps -ef|grep "tokenize"|grep -v grep|awk {print $2} 和 ps -ef|grep "tokenize"…

PCL點云邊界提取——源碼解析

文章目錄 一、概述二、PCL邊緣檢測源碼定位過程1、初始化2、檢查輸入點云是否稠密3、迭代處理每個點4、輸出三、修改后的過程調用一、概述 在PCL中集成了一個非常經典的點云邊緣檢測算法,這個算法也在 PCL點云邊界提取這篇博客中講解了。該文章只介紹了AC算法的原理及接口調用…

hook中useContext到底怎么用

語法: somecontext createContext(defaultValue); 作用: 避免了組件嵌套太深, 頂層變量層層傳遞的麻煩. 如何消費頂層數據 第一步: 用createContext聲明一個context上下文變量 import { createContext } from react;export const GlobalContext createContext({} as any);…

面試問題小結

說說你的項目,從里面學到啥了(隨便說) CAS 線程池 的各個方面 線程咋創建(4種方式) 說一下聚集索引和非聚集索引 50w男 50w女 ,在B樹中咋存儲的(類似下面的圖,變通一下就行了&a…

本是夢中人,常作花下客。心中自往來,知我有幾個。

我們總是喜歡拿“順其自然”來敷衍人生道路上的荊棘坎坷,卻很少承認,真正的順其自然, 其實是竭盡所能之后的不強求, 而非兩手一攤的不作為。 一花凋零荒蕪不了整個春天, 一次挫折也荒廢不了整個人生。 多年后&#x…

近臨算法(個人總結版)

背景 近鄰算法(Nearest Neighbor Algorithm)是一種基本但非常有效的分類和回歸方法。最早由Fix和Hodges在1951年提出,經過幾十年的發展和改進,已成為數據挖掘、模式識別和機器學習領域的重要工具。近鄰算法基于相似性原則&#x…

通過el-tree自定義渲染網頁版工作目錄,實現鼠標懸浮顯示完整名稱、用icon區分文件和文件夾等需求

目錄 一、通過el-tree自定義渲染網頁版工作目錄 1.1、需求介紹 1.2、使用el-tree生成文檔目錄 1.2.1、官方基礎用法 ①效果 ②代碼: 1.2.2、自定義文檔目錄(實現鼠標懸浮顯示完整名稱、用icon區分文件和文件夾) ①效果(直接效…

find 幾招在 Linux 中高效地查找目錄

1. 介紹 在 Linux 操作系統中,查找目錄是一項常見的任務。無論是系統管理員還是普通用戶,都可能需要查找特定的目錄以執行各種操作,如導航文件系統、備份數據、刪除文件等。Linux 提供了多種命令和工具來幫助我們在文件系統中快速找到目標目…

淺談后端整合Springboot框架后操作基礎配置

boot基礎配置 現在不訪問端口8080 可以嗎 我們在默認啟動的時候訪問的是端口號8080 基于屬性配置的 現在boot整合導致Tomcat服務器的配置文件沒了 我們怎么去修改Tomcat服務器的配置信息呢 配置文件中的配置信息是很多很多的... 復制工程 保留工程的基礎結構 抹掉原始…

樸素貝葉斯+SMSSpamCollections

1. 打開 Jupyter 后,在工作目錄中,新建一個文件夾命名為 Test01 ,并且在文件夾中導入數據 集。在網頁端界面點擊 “upload” 按鈕,在彈出的界面中選擇要導入的數據集。然后數據集出現 在 jupyter 文件目錄中,此時…

Vue.js Promise 與 async/await 的比較

在現代 Web 開發中,異步操作是不可避免的。在處理異步數據獲取時,開發人員通常會使用 Promise 或 async/await。雖然兩者都可以實現相同的功能,但它們在代碼風格、可讀性和錯誤處理等方面有所不同。本文將對這兩種方法進行比較,并…

初識Qt:從Hello world到對象樹的深度解析

Qt中的對象樹深度解析 Hello world1.圖形化界面創建命令行式創建在棧上創建在堆上創建為什么傳文本需要QString,std::string不行嗎?那為什么要傳入this指針?為什么new后不用顯示調用delete函數呢,不會造成內存泄漏問題嗎&#xff…

python:__class_getitem__使用以及cached_property源碼分析

python:__class_getitem__使用以及cached_property源碼分析 1 前言 Python中如何模擬泛型類型? 當使用類型標注時,使用 Python 的方括號標記來形參化一個 generic type 往往會很有用處。 例如,list[int] 這樣的標注可以被用來表…

深入 OpenFeign:探索緩存、QueryMap、MatrixVariable 和 CollectionFormat 的高級用法以實現優雅的遠程調用

免費多模型AI網站,支持豆包、GPT-4o、谷歌Gemini等AI模型,無限制使用,快去白嫖👉海鯨AI 一、OpenFeign簡介 OpenFeign 是一個聲明式的 HTTP 客戶端,它使得我們可以通過簡單的注解和接口定義來調用遠程 HTTP 服務。與傳統的 HTTP …

K8S集群再搭建

前述:總體是非常簡單的,就是過程繁瑣,不過都是些重復的操作 master成員: [controller-manager, scheduler, api-server, etcd, proxy,kubelet] node成員: [kubelet, proxy] master要修改的配置文件有 1. vi /etc/etcd/etcd.conf # 數…

Mokito的一些API

Mockito是一個Java單元測試框架,它允許開發者創建和配置模擬對象(mock objects),以便在隔離的環境中測試代碼,尤其是當實際對象難以構造或其行為不確定時。下面是一些核心的Mockito API及其使用場景和代碼示例。 基礎…

wordpress教程視頻 wordpress教程網盤 wordpress教程推薦wordpress教程網

WordPress,作為一款強大且靈活的開源內容管理系統,已成為許多網站開發者與運營者的首選。其強大的功能、豐富的插件以及易于上手的特點,使得無論是初學者還是專業開發者都能輕松構建出個性化的網站。然而,對于初學者來說&#xff…

JUnit5標記測試用例

使用場景: 通過Tag對用例分組: 環境分組:測試環境、預發布環境階段分組:冒煙用例版本分組:V1.1、V1.2 Tag標記用例: 設置標簽根據標簽執行 結合Maven執行結合測試套件執行 設置標簽: 通過T…

NER 數據集格式轉換

NER 數據集格式 格式一 某些地方的數據和標簽拆成兩個文件了 sentences.txt 如 何 解 決 足 球 界 長 期 存 在 的 諸 多 矛 盾 , 重 振 昔 日 津 門 足 球 的 雄 風 , 成 為 天 津 足 壇 上 下 內 外 到 處 議 論 的 話 題 。 該 縣 一 手 抓 農 業…