chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

ollvm|Android字符串加密淺析

哆啦安全 ? 來源:小道安全 ? 作者:小道安全 ? 2022-11-29 09:08 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

背景

字符串加密是一個非常傳統(tǒng)的代碼保護方案,在Android的逆向過程中會涉及到Java代碼和CC++代碼,通常在對APP做逆向過程中第一步一般就是反編譯后查看代碼中是否有包含一些可以作為突破口分析的字符串信息。

作為開發(fā)者一般應用中的字符串信息都是保存相對敏感的信息,字符串一般信息會保存著如客戶端和服務端通信信息,操作文件相關信息。

04a97cec-6f71-11ed-8abf-dac502259ad0.png

(so部分的字符串加密)

04bbe418-6f71-11ed-8abf-dac502259ad0.png

(java部分的字符串加密)

由于字符串信息中存儲著很多關鍵的信息,因此在做逆向的過程中從字符串入手可以猜測、分析定位出一些關鍵的加解密算法、關鍵的邏輯結構。因此字符串也是一種提高被靜態(tài)逆向分析的一個很重要的門檻。

字符串信息的加密的影響只到靜態(tài)的逆向分析這一步,字符串信息信息在實際業(yè)務運行過程中必然需要進行對字符串的操作,那這個就涉及到了對加密字符串的解密過程。這個運行態(tài)也就是在對app進行利用動態(tài)調(diào)試分析過程中都是赤裸裸的展現(xiàn)出來。這是時候字符串的加密就顯得蒼白無力了。因此可以通過反調(diào)試和字符串加密這兩者的入門的動態(tài)和靜態(tài)方式結合,稍微提高代碼的安全性。

字符串加密算法基礎

所謂字符串加密技術是指將一個信息(或稱明文)經(jīng)過加密鑰匙及加密函數(shù)轉(zhuǎn)換,變成無意義的密文,而接收方則將此密文經(jīng)過解密函數(shù)、解密鑰匙還原成原字符串。

字符串加密免不了采用加解密的算法,加解密算法的加解密方式和加解密強度直接決定了被攻破的時間成本。

字符串加密算法有簡單的異或方式;通用的AES、DES、RSA、Base64、MD5散列函數(shù)等等;相對有難度的自實現(xiàn)加解密算法、冷門的加解密算法。

不過一般情況下,作為開發(fā)者一般不太可能自己去造輪子寫加解密算法,一般都是直接就套用網(wǎng)絡上穩(wěn)定的、標準的加解密算法。其實如果從相對安全性來說,可以找那些冷門的加解密算法用于保護字符串。這樣相對網(wǎng)絡公開資料比較少,并且分析的人相對比較少,分析起來時間成本就相對比較高。

下面就分析下so文件加密用的比較多的字符串加密是怎么實現(xiàn)的。

ollvm字符串加密原理

Ollvm中字符串加密的公開版本有很多個版本,并且每個版本功能實現(xiàn)雖然大同小異,但是各個版本也各有缺點。

這些缺點有:

1.無法加密字符串數(shù)組;

2.無法加密unicode編碼和非const的字符串數(shù)組;

3.無法加密全局char和wchar字符串常量和結構體變量。

基于以上原因,實現(xiàn)自己定制修改字符串加密功能代碼就顯得很重要了。

下面就分析下ollvm中基于某版本字符串加密的實現(xiàn)和調(diào)用

Ollvm項目中,字符串加密實現(xiàn)主要功能在項目存儲在如下的路徑中

聲明和實現(xiàn)的代碼

ollvmincludellvmTransformsObfuscationStringObfuscation.h

ollvmlibTransformsObfuscationStringObfuscation.cpp

初始化隨機數(shù)因子和調(diào)用字符串加密

ollvmlibTransformsIPOPassManagerBuilder.cpp

添加編譯StringObfuscation.cpp文件

ollvmlibTransformsObfuscationCMakeLists.txt

CMakeLists.txt配置要編譯的StringObfuscation.cpp文件

04d610b8-6f71-11ed-8abf-dac502259ad0.png

下面的聲明的靜態(tài)全局變量,主要是為了實現(xiàn)編譯時候識別 -mllvm -sobf指令的標識,全局開關通過參數(shù)來判斷是否要開啟字符串加密。

04e483b4-6f71-11ed-8abf-dac502259ad0.png

隨機數(shù)因子的初始化。

050a5ea4-6f71-11ed-8abf-dac502259ad0.png

在populateModulePassManager 函數(shù)中,新增掛載新的pass代碼,這樣就可以根據(jù)全局開關來判斷是否啟用當前pass。

051e8636-6f71-11ed-8abf-dac502259ad0.png

StringObfuscation.h文件分析

這個函數(shù)就聲明了createStringObfuscation函數(shù),看起來非常簡單,這個函數(shù)也就是這個字符串加密的關鍵函數(shù)。

05570c40-6f71-11ed-8abf-dac502259ad0.png

StringObfuscation.cpp文件分析(基于Armariris版本的字符串加密)

這個版本的加密效果:可加密所有類型的ANSI, UNICODE字符串常量, 但是無法加密字符串數(shù)組, 因為字符串數(shù)組的全局符號名不是.str開頭。

這個文件中主要有字符串加密函數(shù)和字符串解密函數(shù)2個函數(shù)組成的。

0560ac1e-6f71-11ed-8abf-dac502259ad0.png

上文截圖代碼根據(jù).str和.str.名稱判斷是否為字符串,并且過濾掉特定區(qū)段:Llvm.metadata,__objec_methname不進行字符串加密。

056f13da-6f71-11ed-8abf-dac502259ad0.png

上面截圖中的代碼,可以看到字符串加密的就是進行簡單的字符串異或加密。

057dd30c-6f71-11ed-8abf-dac502259ad0.png

用于往字符串加密的程序插入以“.datadiv_decode+隨機數(shù)”為結構的加密函數(shù),用于實現(xiàn)對字符串進行加密處理。

防止破解者能夠快速識別是基于ollvm實現(xiàn)的字符串加密,可以重點修改下這個函數(shù)的實現(xiàn)和“.datadiv_decode+隨機數(shù)”的特征。

有了以上的關鍵調(diào)用和流程,那么就可以基于以上的流程和規(guī)則進行做字符串加密功能的定制實現(xiàn)了,可以通過添加一些邏輯代碼加強字符串加密的強度。

ollvm字符串加密后表現(xiàn)

1.直接用標準的ollvm的字符串加密,在字符串信息和導出函數(shù)中和init_arrayq區(qū)段會存在.datadiv_decode,這種采用的是一個字節(jié)和一個字節(jié)進行隨機異或的加密方式。

數(shù)據(jù)都存儲在數(shù)據(jù)段中,程序運行前就是初始化的時候就將加密的字符串全部解密出來,等待著使用。

058ad692-6f71-11ed-8abf-dac502259ad0.png

05c1f83e-6f71-11ed-8abf-dac502259ad0.png

05cc03e2-6f71-11ed-8abf-dac502259ad0.png

2.通過基于ollvm的源代碼,簡單修改定制olllvm的源碼,將解密函數(shù)名字修改成為非標準的,但是這種的字符串加密在init_array區(qū)段中依然會有展示,只不過展示的是非標準的函數(shù)信息。這種加密也是通過疑惑的方式進行加密。

字符串數(shù)據(jù)都存儲在數(shù)據(jù)段中,程序運行起來后就是初始化時候,就一次性全部將字符串解密。

05d9687a-6f71-11ed-8abf-dac502259ad0.png

3.通過基于ollvm的源代碼進行定制,字符串信息都存儲在.bss區(qū)段中,程序運行初始化的時候并沒有進行做解密,只有在程序運行使用到那里才會解密到那里。其它的沒使用的字符串是沒有進行解密的。

05e3a2cc-6f71-11ed-8abf-dac502259ad0.png

小結

從字符串成為破解者第一道門檻的的痛點,在到字符串加密僅是為了提高破解者靜態(tài)分析的成本的大背景下進行,全文大篇幅的主要是以ollvm這個項目中的字符串加密為主線進行展開的,展開的方向主要以加密的實現(xiàn)原理和加密后的表現(xiàn)形式。

對ollvm字符串的解密相信是對大家來說比字符串加密是更感興趣,篇幅有限先以字符串加密進行簡單做下原理性的分析,后面再分享ollvm字符串解密。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Android
    +關注

    關注

    12

    文章

    3980

    瀏覽量

    132368
  • JAVA
    +關注

    關注

    20

    文章

    2992

    瀏覽量

    114824
  • 字符串
    +關注

    關注

    1

    文章

    594

    瀏覽量

    22901

原文標題:ollvm|Android字符串加密淺析

文章出處:【微信號:哆啦安全,微信公眾號:哆啦安全】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    字符串的表示

    字符串的表示  隨著計算機在文字處理與信息管理中的廣泛應用, 字符串已成為最常用的數(shù)據(jù)類型之一, 許多計算機中都提供字符串操作功能, 一些計算機還給出讀寫字
    發(fā)表于 10-13 17:11 ?3364次閱讀
    <b class='flag-5'>字符串</b>的表示

    C語言教程之字符串加密和解密

    C語言教程之字符串加密和解密,很好的C語言資料,快來學習吧。
    發(fā)表于 04-25 15:49 ?0次下載

    什么是復制字符串?Python如何復制字符串

    連續(xù)幾篇文章都在寫 Python 字符串,這出乎我的意料了。但是,有的問題,不寫不行,特別是那種靈機一動想到的問題,最后你發(fā)現(xiàn),很多人根本不懂卻又誤以為自己懂了。那就繼續(xù)刨根問底,探究個明白吧
    發(fā)表于 11-25 10:32 ?3329次閱讀

    strtok拆分字符串

    大家好,我是驚覺,今天聊聊字符串。字符串的使用場景非常之多,人機交互和雙機通信都會用到。比如:通過串口向單片機發(fā)送指令,以執(zhí)行操作或配置參數(shù)。單片機讀取傳感器數(shù)據(jù),數(shù)據(jù)格式是字符串。一般GPS數(shù)據(jù)
    發(fā)表于 01-13 15:46 ?8次下載
    strtok拆分<b class='flag-5'>字符串</b>

    2.2 python字符串類型

    2.2 python字符串類型 1. 如何定義字符串? 字符串是Python中最常用的數(shù)據(jù)類型之一。 使用單引號或雙引號來創(chuàng)建字符串,使用三引號創(chuàng)建多行
    的頭像 發(fā)表于 02-17 17:08 ?1790次閱讀

    字符串函數(shù)重寫練習

    字符串函數(shù)重寫練習:字符串比較、字符串拼接、字符串查找、字符串拷貝、內(nèi)存比較、內(nèi)存拷貝、內(nèi)存初始化、內(nèi)存比較、二維數(shù)組定義及基本使用、位運算
    的頭像 發(fā)表于 05-05 15:02 ?2394次閱讀

    字符串操作

    labview字符串操作
    發(fā)表于 06-28 15:09 ?2次下載

    C語言總結_字符串全方位練習

    C語言字符串全方位練習,涉及知識點:字符串解析、大小寫判斷、字符串插入、字符串刪除、字符串排序、字符串
    的頭像 發(fā)表于 08-14 09:41 ?2110次閱讀

    一文詳解JavaScript字符串

    JavaScript字符串是原始值。此外,字符串是不可變的。這意味著如果你修改一個字符串,你總是會得到一個新的字符串。原始字符串不會被改變。
    的頭像 發(fā)表于 12-08 16:36 ?1647次閱讀

    python字符串有哪些特定方法

    python字符串序列操作也適用于列表和元組。 python字符串還有獨有方法,即字符串對象的函數(shù),其他對象不可調(diào)用,只有字符串對象可調(diào)用。
    的頭像 發(fā)表于 02-23 15:02 ?1110次閱讀

    淺析python字符串模式匹配

    python字符串可以通過re模塊的模式匹配來處理文本。
    的頭像 發(fā)表于 02-23 15:04 ?2663次閱讀

    C語言字符串的引用方式

    在C語言程序中,字符串是存放在字符數(shù)組中的。 2. 用字符數(shù)組存放一個字符串,可以通過數(shù)組名和下標引用字符串中的一個
    的頭像 發(fā)表于 03-10 14:57 ?2507次閱讀

    字符串的相關知識

    TCL 中的數(shù)據(jù)類型只有一種:字符串。這些字符串可以是字母、數(shù)字、布爾值、標點符號等特殊字符的組合。在某些特殊命令的作用下,字符串可以向其他數(shù)據(jù)類型轉(zhuǎn)換。下面將系統(tǒng)的講解或回顧下
    的頭像 發(fā)表于 03-29 11:41 ?1574次閱讀

    labview字符串如何轉(zhuǎn)換為16進制字符串

    在LabVIEW中,將字符串轉(zhuǎn)換為16進制字符串是一個常見的需求,尤其是在處理數(shù)據(jù)通信和硬件接口時。LabVIEW提供了多種方法來實現(xiàn)這一轉(zhuǎn)換,包括使用內(nèi)置函數(shù)、編寫VI(Virtual
    的頭像 發(fā)表于 09-04 15:54 ?6597次閱讀

    字符串字符數(shù)組的區(qū)別

    在編程語言中,字符串字符數(shù)組是兩種基本的數(shù)據(jù)結構,它們都用于存儲和處理文本數(shù)據(jù)。盡管它們在功能上有一定的重疊,但在內(nèi)部表示、操作方式和使用場景上存在顯著差異。 1. 內(nèi)部表示 字符串 字符串
    的頭像 發(fā)表于 01-07 15:29 ?1510次閱讀