<progress id="yueoz"><code id="yueoz"><xmp id="yueoz">

      1. 吾愛破解 - LCG - LSG |安卓破解|病毒分析|www.13ee.cn

         找回密碼
         注冊[Register]

        QQ登錄

        只需一步,快速開始

        搜索
        查看: 799|回復: 2
        上一主題 下一主題

        [Android 原創] dex文件格式------string_ids解析

        [復制鏈接]
        跳轉到指定樓層
        樓主
        紫諾不離 發表于 2020-6-22 21:38 回帖獎勵

        授人與魚不如授人與漁,作為初學者,最重要的是學會查看官方文檔,自主學習。

        首先放上google官方文檔對dex解釋的鏈接,里面相當詳細的介紹了dex的格式的組成。

        https://source.android.google.cn/devices/tech/dalvik/dex-format#header-item

        上一篇文章解析了map_list,今天來解析dex中的字符串,老規矩,先來看官方文檔的介紹。

        header_item中對字符串描述的只有這三句

        1、string_ids_size記錄了字符串的數量

        2、string_ids_off記錄了字符串從文件開頭到字符串標識的偏移量

        3、該偏移量(如果為非零值)應該是到 string_ids 區段開頭的偏移量。

        那么string_ids是什么呢?

        從dex完整格式中可以看到有這么一個結構
        string_ids string_id_item[] 字符串標識符列表。這些是此文件使用的所有字符串的標識符,用于內部命名(例如類型描述符)或用作代碼引用的常量對象。此列表必須使用 UTF-16 代碼點值按字符串內容進行排序(不采用語言區域敏感方式),且不得包含任何重復條目。

        看到這里就很明顯了,string_ids是一個string_id_item格式的數組,string_ids_size記錄了此數組的數量,string_ids_off記錄了從文件開頭到此數組的偏移量。

        string_id_item格式

        string_data_off //uint  從文件開頭到此項的字符串數據的偏移量。該偏移量應該是到 data 區段中某個位置的偏移量,且其中的數據應采用下文中“string_data_item”指定的格式。 沒有偏移量對齊要求。

        string_id_item只是一個四字節的偏移量,沒必要定義一個結構體。

        接下來看看string_data_item格式:

        utf16_size  uleb128//   此字符串的大;以 UTF-16 代碼單元(在許多系統中為“字符串長度”)為單位。也就是說,這是該字符串的解碼長度(編碼長度隱含在 0 字節的位置)。
        data    ubyte[] //一系列 MUTF-8 代碼單元(又稱八位字節),后跟一個值為 0 的字節。請參閱上文中的“MUTF-8(修改后的 UTF-8)編碼”,了解有關該數據格式的詳情和討論。

        淺析

        utf16_size記錄了字符串的大小,格式是uleb128,uleb128是一個不固定的長度,c語言中并沒有能表示這種變化長度的類型,(不知道uleb128是什么的,去官方文檔或者我的第一篇文章看一下),再來看第二個data的格式是 ubyte[],并且后跟一個值為 0 的字節,而char*正好是以0來結尾的,而char*通過每個字節轉換正好可以解析出utf16_size的值和占用的字節。

        轉換uleb128函數

        //返回長度
        WORD getLEB128Lenght(char* str)
        {
            //初始化長度為1
            WORD index = 1;
          //如果值為0,返回長度
            if (*str)
            {
              // 如果值不為0,查看最高位是否為1
                while (*str++ & 0x80)
                {
                //長度++
                    ++index;
                }
            }
            return index;
        }
        
        //返回值,此處比之前改進了一下,因為我發現進位時會因為寬度問題導致數值錯誤
        WORD LEB128toInt(char* str)
        {
            DWORD value = 0;
            WORD index = 0;
            if (*str)
            {
                do {
                //*str & 0X7F是吧最高位設置為0
                    DWORD m = (*str & 0X7F) << (index * 7);
                    value += m;
                    ++index;
        
                } while (*str++ & 0x80);
            }
            return value;
        }

        解析字符串

        //此處我選擇寫一個函數,因為后面用到的地方太多了。
        //第一個參數是dex_header結構體  之前有說怎么獲取,這里不提
        //第二個參數是指向string_id_item地址的指針  文件開始的地址加上string_ids_off中的偏移
        //第三個參數是找的是第幾個string_data_item  取值范圍1到string_ids_size直接
        char* getString(PIMAGE_DEX_HEADER IpParameter , LPDWORD virtualAddress_string,DWORD index)
        {
        //通過取值得到地址的偏移 *(virtualAddress_string + index),再加上文件開始的地址,
        
            char* str = (char*)((DWORD)IpParameter + *(virtualAddress_string + index));
            //計算字符串長度所占的字節數
            DWORD n = getLEB128Lenght(str);
            //返回正確的字符串首地址
            return str + n;
        }
        

        c語言解析0結尾的字符串用%s,puts之類的都可以。

        免費評分

        參與人數 2吾愛幣 +8 熱心值 +2 收起 理由
        qtfreet00 + 7 + 1 歡迎分析討論交流,吾愛破解論壇有你更精彩!
        xiaoerer + 1 + 1 熱心回復!

        查看全部評分

        發帖前要善用論壇搜索功能,那里可能會有你要找的答案或者已經有人發布過相同內容了,請勿重復發帖。

        沙發
        xiaoerer 發表于 2020-6-22 21:56
        下載鏈接呢。。
        3#
         樓主| 紫諾不離 發表于 2020-6-23 08:00 |樓主
        您需要登錄后才可以回帖 登錄 | 注冊[Register]

        本版積分規則 警告:本版塊禁止灌水或回復與主題無關內容,違者重罰!

        快速回復 收藏帖子 返回列表 搜索

        RSS訂閱|小黑屋|聯系我們|吾愛破解 - LCG - LSG ( 京ICP備16042023號 | 京公網安備 11010502030087號 )

        GMT+8, 2020-7-20 20:42

        Powered by Discuz!

        Copyright © 2001-2020, Tencent Cloud.

        快速回復 返回頂部 返回列表
        快三开奖结果