帮助解析resources.arsc?

dju*_*nny 5 php resources parsing android

我正在尝试解析resources.arsc文件中包含的资源,如问题中所述.我知道该androidmanifest.xml文件标识了.arsc文件中的资源.我已成功设法解析.arsc文件的标题,我无法弄清楚如何自己解析资源.

有人可以帮我弄清楚如何解析.arsc文件中包含的资源吗?

到目前为止我的解析代码:

<?php

$doc = fopen('resources.arsc', 'r+');


for($i=1;$i<10;$i++){
    $res[$i] = _unpack('V', fread($doc, 4));
}


for ($i = 0, $j = $res[6]; $i <= $j; $i++)  {
    $word = fread($doc, 4);
    $stroffs[] = _unpack('V', $word);
}


$strings = array();

$curroffs = 0;
foreach($stroffs as $offs){
    //read length
    $len = _unpack('v', fread($doc, 2));

    //read string
    if($len>0){
        $str = fread($doc, $len*2);
    }else{
        $str = '';
    }
    //null
    $wd = fread($doc, 2);
    //utf-16le
    $strings[] =  mb_convert_encoding($str, 'gbk', 'UTF-16LE');

    //curr offset
    $curroffs += ($len+1)*2 + 2;
}


$tpos = ftell($doc);

read_doc_past_sentinel($doc);

//fseek($doc, $tpos + $tpos % 4);

$i = 0;

$xmls = $strings;

print_r($xmls);

//------------------------------------
//and then...somebody konw format or continue parse?
//------------------------------------


function read_doc_past_sentinel(&$doc){
    $pos = ftell($doc);
    $count= 0;
    while($word = fread($doc, 4)){
        if(_unpack('V', $word)==-1)break;
    }

    $n = 1;
    if ($count < $n){
        while($word = peek_doc($doc, 4)){
            if(_unpack('V', $word) != -1)break;
            fread($doc, 4);
            $n++;
            if(isset($count) && $count >= $n)break;
        }
        echo 'skip '.$n.' chars<br />';
    }

}

function peek_doc(&$doc, $size){
    $data = fread($doc, $size);
    fseek($doc, ftell($doc)-$size);
    return $data;
}



function _unpack($m, $b){
    //if(!$b)return '';
     $res = unpack($m, $b);
    return $res[1];
}
?>
Run Code Online (Sandbox Code Playgroud)

hac*_*bod 5

这是一个相当复杂的二进制文件.你需要的方式更多的代码比对分析它.:)

我的建议是使用与平台相同的代码 - 即此处的ResTable和相关类:

frameworks/base/include/utils/ResourceTypes.h frameworks/base/libs/utils/ResourceTypes.cpp

请注意,ResourceTypes.h还具有资源表的完整结构的定义(用于解析它的类).

您也可以使用aapt工具.这有许多选项可以解析.apk中与资源相关的数据:

aapt d[ump] [--values] WHAT file.{apk} [asset [asset ...]]
  badging          Print the label and icon for the app declared in APK.
  permissions      Print the permissions from the APK.
  resources        Print the resource table from the APK.
  configurations   Print the configurations in the APK.
  xmltree          Print the compiled xmls in the given assets.
  xmlstrings       Print the strings of the given compiled xml assets.
Run Code Online (Sandbox Code Playgroud)

如果您希望这些命令无法提供其他数据,请考虑修改frameworks/base/tools/aapt中的工具代码以添加内容以解析您想要的内容.此工具使用ResTable来解析资源.