Android逆向分析源码中资源代码还原小工具

一般情况下,我们采用apktool(xml资源)+dex2jar+JDGui(jar to java)反编译Android apk之后的代码中,涉及到资源索引的信息全部替换成了十进制的数字。

如何将这些数字还原成为原始的资源索引形式呢?

  1. public g(Context paramContext)  
  2. {  
  3.   super(paramContext);  
  4.   b(2130903088);  
  5.   this.b = ((FirModule)this.k.N().a("fir_module"));  
  6.   int[] arrayOfInt = new int[2];  
  7.   arrayOfInt[0] = 2131427902;  
  8.   arrayOfInt[1] = 2131427901;  
  9.   a(arrayOfInt);  
  10.   f(1);  
  11.   f(2);  
  12. }  

我们希望得到如下形式的代码:

  1. public g(Context paramContext)  
  2. {  
  3.   super(paramContext);  
  4.   b(R.layout.fir_info_page);  
  5.   this.b = ((FirModule)this.k.N().a("fir_module"));  
  6.   int[] arrayOfInt = new int[2];  
  7.   arrayOfInt[0] = R.string.commended_apps;  
  8.   arrayOfInt[1] = R.string.person_info;  
  9.   a(arrayOfInt);  
  10.   f(1);  
  11.   f(2);  
  12. }  

可读性就非常高了。

下面讲述如何做到这个功能:

 b(2130903088);中的数字转换为16进制以后,是0x7f030030,通过手工在R.java中搜索我们可以找到:

        public static final int fir_info_page=0x7f030030;

因此在相应的地方替换为对应的资源索引就可以了,处于layout class之下,因此是 R.layout.fir_info_page 。

好了,原理很简单,接下来我们编写一个perl脚本来批量做这个事情,具体代码如下:

  1. #!/usr/bin/perl  
  2. #注意事项:  
  3. #复制一份 R.java在该文件所在目录  
  4. #第一个参数为:需要处理的源代码目录路径  
  5.   
  6. use strict;  
  7.   
  8. use File::Find;  
  9.   
  10. my $from_str;  
  11. my $to_str;  
  12. my $resource;  
  13. my $init_folder = $ARGV[0];  
  14.   
  15. if (not -d $init_folder)  
  16. {  
  17.   print "目录:$init_folder不存在.\n";  
  18. print "$0 <source_folder>\n";   
  19.   exit;  
  20. }  
  21.   
  22. #读取R.java中的所有文本  
  23. my $k_file = "R.java";  
  24. open my $k ,"< $k_file" or die "couldn't open $k_file\n";  
  25. my @keywords = <$k> ;  
  26. close $k;  
  27.   
  28.   
  29. #遍历每行数据  
  30. for my $line (@keywords)  
  31. {  
  32.   #print "$line";  
  33.   
  34.   #先解析内部class类型:id/style/xml/arrays等  
  35.   #public static final class style {  
  36.   if ($line =~ /public\sstatic\sfinal\sclass\s(\w+)\s\{/)  
  37.   {  
  38.      $resource = $1;  
  39.   }  
  40.   else  
  41.   {  
  42.     #如果格式如下,则解析出来  
  43.     #public static final int MarketPanelTheme=0x7f0c0076;  
  44.     if ($line =~ /public\sstatic\sfinal\sint\s(\w+)=(\w+)\;/)  
  45.     {  
  46.       #print "keywords:$1 <-- $2\n";  
  47.       $from_str = oct $2; #16进制转化为10进制  
  48.       $to_str = "R\.$resource\.$1";  
  49.       print "$from_str --> $to_str\n\n";  
  50.       find(\&CallBackMe, $init_folder );  
  51.     }  
  52.   }  
  53. }  
  54.   
  55. print "Well Done.\n";  
  56.   
  57. sub CallBackMe  
  58. {  
  59.  my $fullpath = $File::Find::name;  
  60.   
  61.  if(-d $fullpath)  
  62.  {  
  63.       print "[Dir] $fullpath\n";  
  64.  }  
  65.  else  
  66.  {  
  67.    print "[File] $fullpath\n";  
  68.    if($fullpath =~ /\.java$/i)  
  69.    {  
  70.      if($fullpath =~ /$k_file/i)  
  71.      {  
  72.         #ignore it  
  73.         print "Ignored $k_file\n";  
  74.      }  
  75.      else  
  76.      {  
  77.        #replace text  
  78.        print "Replacing $from_str with $to_str in $fullpath\n";  
  79.        ReplaceString($fullpath, $from_str,$to_str);  
  80.      }  
  81.    }  
  82.  }  
  83. }  
  84.   
  85. #Replacing $from with $to in $file  
  86. sub ReplaceString  
  87. {  
  88.   my $file = shift @_;  
  89.   my $from = shift @_;  
  90.   my $to = shift @_;  
  91.   
  92.   open my $fh ,"< $file" or die "couldn't open $file\n";  
  93.   my @lines=<$fh>;  
  94.   close $fh;  
  95.   foreach my $l (@lines)  
  96.   {  
  97.     $l=~s/$from/$to/g;  
  98.   }  
  99.   #print "@lines\n";  
  100.   #write back  
  101.   open my $out , "> $file" or die "couldn't write $file";  
  102.   foreach my $l (@lines)  
  103.   {  
  104.      print $out $l;  
  105.   }  
  106.   close $out;  
  107. }  
这款APK反编译工具(ApkToolkit)拥有编译、反编译、签名等功能,对于经常DIY安卓软件的朋友来说,是必不可少的工具。能够支持WIN7系统,但是这款安卓apk反编译工具暂不支持WIN8系统。 APK 反编译工具 ApkToolkit 中文版APK 反编译工具 ApkToolkit 中文版 功能介绍 1、反编译.apk 对.apk文件进行反编译。 2、重建.apk 根据反编译.apk得到目录重建.apk文件。 3、签名.apk 对.apk文件进行签名。 4、优化.apk 对.apk文件进行优化。 5、framework-res.apk工具 实现framework-res.apk的安装和管理。 6、.apk转.jar 将.apk文件转换为.jar文件。 7、.dex转.jar 将.dex文件转换为.jar文件。 插件版本: Java版本:1.7.0_60 Aapt版本:0.2 Apktool版本:2.0.0-dirty Dex2Jar版本:translator-0.0.9.15 使用说明 1、反编译.apk 拖拽【XXX.apk】程序到”反编译.apk”按钮前的输入区,点击”反编译.apk”按钮, 会在文件【XXX.apk】的同级目录下生成文件夹【XXX】。 2、重建.apk 把第一步得到的文件夹【XXX】拖拽到”重建.apk”按钮前面的输入区,点击”重建.apk”按钮, 会在文件夹【XXX】的同级目录下生成未签名的程序【XXX.R.apk】。 3、签名.apk 把第二步得到的程序【XXX.R.apk】拖拽到”签名.apk”按钮前的输入区,点击”签名.apk”按钮, 会在文件【XXX.R.apk】的同级目录下生成已经签名好的程序【XXX.RS.apk】。 4、优化.apk 把第三步得到的程序【XXX.RS.apk】拖拽到”优化.apk”按钮前的输入区,点击”优化.apk”按钮, 会在【XXX.RS.apk】的同级目录下生成已经优化好的程序【XXX.RSO.apk】。 5、framework-res.apk工具 拖拽【XXX.apk】文件到”安装”按钮前的输入区,点击”安装”按钮,会生成相应的apk,编译对某 些APK程序的反编译和重建。 点击”查看”,即可在资源管理器中看到已经安装的framework-res.apk,可对其进行管理或删除。 6、.apk转.jar 拖拽【XXX.apk】文件到”.apk转.jar”按钮前的输入区,点击”.apk转.jar”按钮, 会在文件【XXX.apk】的同级目录下生成文件【XXX_dex2jar.jar】。 7、.dex转.jar 拖拽【XXX.dex】文件到”.dex转.jar”按钮前的输入区,点击”.dex转.jar”按钮, 会在文件【XXX.dex】的同级目录下生成文件【XXX_dex2jar.jar】。 注意事项 1、使用环境:首先必须安装JDK 6/7。 2、使用“反编译.apk”功能时,路径中不能出现任何中文字符或全角字符! 3、使用“重建.apk ”功能时,路径中不能出现任何中文字符或全角字符!
Apk Easy Tool 是一个轻量级的 GUI 应用程序,使您可以管理,签名,编译和反编译正在使用的应用程序的 APK 文件。APK Easy Tool 完全免费,可用于商业和非商业用途。请注意:此工具不是为新手准备的,而是为那些懒于使用 CMD 的人提供的更快的任务 APK 反编译工具 APK Easy Tool 中文多语免费版 APK 反编译工具 APK Easy Tool 中文多语免费版 Apk Easy Tool 特色: 反编译/编译 分解和编译 APK,DEX 和 JAR 文件,并带有 SPACE,符号和德语,丹麦语,瑞典语等字符支持。 签名 APK/JAR 文件的签名和 ZipAligning。 提取/压缩 APK 以 7z 压缩级别 0-9 提取并压缩 APKAPK 信息 使用A apt Dump Badge 显示带有图标的 APK 信息并链接到 Play 商店 框架 安装框架并管理框架路径。 日志输出 查看您的日志以查找错误。 选项 更改工具,反编译,编译,签名和 zipalign 的选项。选项:Java 堆,Apktool 版本,apksigner 版本,目录,Java 路径,Windows 资源管理器集成,Retainer 窗口位置等 所有选项和文本框均保存为 config.xml,并在启动时加载。 主菜单上的快速选项。 拖放 将 APK,DEX,JAR 文件和“反编译”文件夹拖放到按钮上以执行操作。 Apktool.jar 版本选择 可以在选项上切换到其他版本的 apktool.jar 在“ Apktool”文件夹中添加其他 apktool.jar 捷径 4个按钮可打开反编译的 APK,编译的 APK,提取的 APK 和压缩的 APK 的工作目录 跳转列表快捷方式 Windows 资源管理器集成 只需右键单击 APK 文件并选择以下选项,即可执行操作,反编译或编译 APK,DEX 和 JAR 文件,Zipalign APK,检查对齐,签名 APK 和安装 APK。 要求: -Windows 7 或以上 -.NET Framework 4.7.2 或更高版本 -Java 8 或 JDK 8 无关紧要
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值