sublime-text加速apk逆向分析

androguard有sublime-text插件,如若合理使用,可以非常有效的加速apk的逆向分析过程.

androguard的sublime-text安装过程如下:

1. 安装sublime-text

安装过程以及完美破解过程参见:

http://ieroot.com/2013/11/14/1370.html

2.下载androguard之sublime-text插件,参见:

http://code.google.com/p/androguard/downloads/detail?name=ag-st-1.9.zip

3. 将下载的ag-st-1.9.zip 或者其他版本,解压到~/.config/sublime-text-2/Packages目录中.

(

如果是Mac OSX, 将ag-st-1.9.zip解压缩到

~/Library/Application\ Support/Sublime\ Text\ 2/Packages

目录即可

)

插件安装过程至此完成

4.使用方法参见:

http://code.google.com/p/androguard/wiki/RE#Key_Binding

By default the key binding are the following (you can change them if you wish):

  • ctfl+f5: open a APK/DEX/ODEX/AXML/ARSC files
  • f5: switch to Dalvik Bytecodes to source codes, switch to AndroidManifest.xml summary to original xml file
  • ctrl+f6: get callers methods for a method, or read access for a field
  • ctrl+f7: get callees methods for a method, or written access for a field
  • ctrl+f8: reset the plugin

简单了.

命令:

sublime-text classes.dex

打开一个classes.dex

快捷键ctrl+` 加载插件

快捷键esc 退出命令行模式

快捷键ctrl+f5 分析classes.dex

可以看到各个类以及函数以及成员变量

如果想要分析哪个函数,直接在函数名上双击,则另外sublime-text窗口加载显示改函数的bytecode代码.

在bytecode代码窗口按下快捷键f5,则将bytecode反编译为java代码, ctrl+f6,ctrl+f7分别跳出选择popup,供选择该函数的xref_from和xref_to.

快捷键f8, reset plugin.

 

使用经验, androguard命令分析 + sublime-text辅助分析, 实在是非常便利啊.,.

反编译工具jad简单用法

反编译工具jad简单用法
以下假设jad.exe在c:\java目录下
一、基本用法
Usage:    jad [option(s)] <filename(s)>
直接输入类文件名,且支持通配符,如下所示。
c:\java\>jad example1.class
c:\java\>jad *.class
结果是将example1.class反编译为example1.jad。将example1.jad改为example1.java即得源文件。

二、Option -o
不提示,覆盖源文件
三、Option -s
c:\java\>jad -sjava example1.class
反编译结果以.java为扩展名。

四、Option -p
将反编译结果输出到屏幕
c:\java\>jad -p example1.class
将反编译结果重定向到文件
c:\java\>jad -p example1.class>example1.java

五、Option -d
指定反编译的输出文件目录
c:\java\>jad -o -dtest -sjava *.class

命令行选择的列表

-a        – 用JVM字节格式来注解输出
-af       – 同 -a,但是注解的时候用全名称
-clear    – 清除所有的前缀
-b        – 输出多于的括号 (e.g., if(a) { b(); }, default: no)
-d <dir> – 指定输出文件的文件目录
-dead      -试图反编译代码的dead 部分(default: no)
-disass   – 不用用字节码的方式反编译 (no JAVA source generated)
-f        – 输出整个的名字,无论是类还是方法
-ff        -输出类的成员在方法之前 (default: after methods)
-i        – 输出所有的变量的缺省的最初值
-l<num>    – 将strings分割成指定数目的块的字符 (default: no)
-lnc      – 将输出文件用行号来注解 (default: no)
-nl       – 分割strings用新行字符 newline character (default: no)
-nodos    -不要去检查class文件是否以dos方式写 (CR before NL, default: check)
-nocast   – 不要生成辅助文件
-nocode    -不要生成方法的源代码
-noconv    – 不要转换java的定义符 (default: do)
-noctor   – 不允许空的构造器存在
-noinner   -关掉对内部类的支持 (default: turn on)
-nolvt    – 忽略局部变量的表信息
-nonlb     – 不要输出一个新行在打开一个括号之前 (default: do)
-o        – 无需确认直接覆盖输出 (default: no)
-p        – 发送反编译代码到标准输出 STDOUT (e.g., for piping)

 

可见jad主要就是把class文件转为.java文件了。

那么。一个可行的操作流程:

.apk  — dex2jar –> .jar —–unzip—-> 一堆 .class ——jad—–> 一堆.java

 

 

ModifyApkWithDexTool

来自google code .  https://code.google.com/p/dex2jar/wiki/ModifyApkWithDexTool

因为google在我这经常抽风上不去,就先记录到这里,方便查询。

Introduction

Dex2jar have the ability to modify the code of an apk.

  1. It first translate the code from dex to jar.
  2. modify .class files in the jar.
  3. It translate jar back to dex and put into apk
  4. sign the apk, and we done the modification.

for demo, we will modify a apk to let it showing a message when it start.

and you need following components in you PATH. android-sdk,ant,dex2jar,jdk6

Details

got an apk

you need an apk, which you didn’t have the source. Just for demo, we build a simple hello-world apk by running the following command

android create project --name test_apk --path test_apk --package a.b --activity Main --target 1
cd test_apk
ant debug
cd bin

now we got test_apk/bin/test_apk-debug.apk. we can check it by running the apk inside an emulator.

work with dex-tools

Now we got the apk, and It’s time to modify it.

  • Convert the code to a modifiable format.

we can’t modify dex or jar(.class) file directly. dex2jar support to assemble/disassemble .class file from/to jasmin file. so we convert the apk to jar and disassemble it.

# convert classes.dex in test_apk-debug.apk to test_apk-debug_dex2jar.jar
d2j-dex2jar.sh -f -o test_apk-debug_dex2jar.jar test_apk-debug.apk
# verify jar
d2j-asm-verify.sh test_apk-debug_dex2jar.jar
# convert to jasmin format
d2j-jar2jasmin.sh -f -o test_apk_jasmin test_apk-debug_dex2jar.jar
  • edit test_apk_jasmin/a/b/Main.j to show a toast
.method public onCreate(Landroid/os/Bundle;)V
aload 0
aload 1
invokespecial android/app/Activity/onCreate(Landroid/os/Bundle;)V
aload 0
ldc_w 2130837504
invokevirtual a/b/Main/setContentView(I)V

; Toast.makeText(this.getApplicationContext(), "hi", Toast.LENGTH_LONG).show();
aload 0
invokevirtual android/app/Activity/getApplicationContext()Landroid/content/Context;
ldc "hi"
ldc_w 1
invokestatic android/widget/Toast/makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
invokevirtual android/widget/Toast/show()V

return
.limit locals 2
.limit stack 3
.end method
  • repack apk
# build jar
d2j-jasmin2jar.sh -f  -o test_apk_jasmin.jar  test_apk_jasmin/ 
# verify jar
d2j-asm-verify.sh test_apk_jasmin.jar
# convert to dex
d2j-jar2dex.sh  -f -o classes.dex test_apk_jasmin.jar
# make a copy
cp test_apk-debug.apk test_apk-debug-toast.apk
# replace classes.dex in test_apk-debug-toast.apk
zip -r test_apk-debug-toast.apk classes.dex
# sign the apk
d2j-apk-sign.sh -f -o test_apk-debug-toast-signed.apk test_apk-debug-toast.apk
  • run the apk
# uninstall previously apk
adb uninstall a.b
# install
adb install test_apk-debug-toast-signed.apk
# start main activity
adb shell am start -n a.b/.Main

NOTICE

all the above command is for *unix, for windows users, please replace the suffix from .sh to .bat.

and for the zip command, just open the test_apk-debug-toast.apk with winRAR,winZIP or 7z, then drag the classes.dex into it.

ARM参数传递规则

1.       r0,r1,r2,r3,在调用函数时,用来存放前4个函数参数和返回值,r4-r11,r14,在调用函数时必须保存这些寄存器到堆栈当中。如果函数的参数多于4个,则多余参数存放在堆栈当中,即sp,sp+4,sp+8,…依次类推。

 

2.       函数内部通用的入栈出栈代码可以为:

STMFD sp!,{r4-r11,lr}

// body of ASM code

LDMFD sp!,{r4-r11,pc}

如果函数并没有用到那么多的寄存器,则没有必要把所有的寄存器入栈。如果函数要调用子函数,则r0,r1,r2,r3,r12,r14这些寄存器里面值将被改变,必须小心处理这些寄存器,一种可行的方法是,修改被调用子函数的入栈出栈代码为:

STMFD sp!,{r0-r12,lr}

// body of ASM code

LDMFD sp!,{r0-r12,pc}

 

3.       如果函数内部变量太多,这时候要考虑使用堆栈,这是入栈出栈代码可以为:

STMFD sp!,{r4-r11,lr}

SUB sp, sp, #stacksize

// body of ASM code

ADD sp, sp, #stacksize

LDMFD sp!,{r4-r11,pc}

 

4.       如果函数的参数多于4个,则函数内部的参数在堆栈中的位置依入栈出栈代码而定:

STMFD sp!,{r4-r11,lr}

LDR r4,[sp,#36]            //第5个参数在堆栈中的位置

LDR r5,[sp,#40]            //第6个参数在堆栈中的位置

// ……

// body of ASM code

LDMFD sp!,{r4-r11,pc}

 

5.       如果第5个参数是要传递地址,函数调用完以后要使用之前传进去的第5个参数,则要预留更多的堆栈空间。可参考下面代码:

//other C code

butterfly32a_16(x2m[0], x2m[1], *ptr1–, tmpSineTable8m, &rx, &ix);

//other C code

这个C函数总共有6个参数,在调用之前要预留4个堆栈单元。代码如下:

sp_0      EQU      0

sp_1      EQU      sp_0 + 4

var_rx    EQU      sp_1 + 4

var_ix    EQU      var_rx+4

stacksize EQU      var_ix+4

STMFD sp!,{r4-r11,lr}

SUB sp, sp, #stacksize

// other ASM code

 

ADD        r4, sp, #var_rx

ADD        r5, sp,# var_ix

STR         r4, [sp,#sp_0]

STR         r5, [sp,#sp_1]

// assume the r0,r1,r2,r3 are prepared well

BL           butterfly32a_16

 

LDR        r4, [sp, #var_rx]            //r4 is the value of rx

LDR        r5, [sp, #var_ix]            //r5 is the value of ix

 

// other ASM code

ADD sp, sp, #stacksize

LDMFD sp!,{r4-r11,pc}

Linux下文件十六进制查看工具

如转载,请注明出处 Smile

下午突然想到,内存有大端小端,那么磁盘存储有吗?
要看文件的十六进制格式,想了想命令只记起来一个od。。。
od真odd,做了一番功课后,记一记linux下常用的十六进制查看工具。
让我倍感意外的是,utf8编码,一个汉字用3个字节表示,我以前一直以为是2个字节。。。这个要读读相关的标准才知道了。
另外,使用gedit打开文本,编辑后会自动在最末端添上0x0A换行符。

1. od – dump files in octal and other formats
 顾名思义是查看八进制,可以通过指定参数为查看十六进制
 -A 指定左边侧栏显示的地址基数,默认为八进制
 -t 指定输出单元的进制格式和字节数
 -x = -t x2 输出单元为双字节(注意:每单元内排列顺序从左到右为 [高字节|低字节])
 例:
[atom@localhost code]$ od -t x1 txtfile
0000000 74 68 65 20 71 75 69 63 6b 20 66 6f 78 20 6a 75
0000020 6d 70 20 6f 76 65 72 20 6c 61 7a 79 20 64 6f 67
0000040 73 0a
0000042

[atom@localhost code]$ od -A x -t x1 txtfile
000000 74 68 65 20 71 75 69 63 6b 20 66 6f 78 20 6a 75
000010 6d 70 20 6f 76 65 72 20 6c 61 7a 79 20 64 6f 67
000020 73 0a
000022

[atom@localhost code]$ od -A x -x txtfile
000000 6874 2065 7571 6369 206b 6f66 2078 756a
000010 706d 6f20 6576 2072 616c 797a 6420 676f
000020 0a73
000022

2. hexdump – ascii, decimal, hexadecimal, octal dump
 查看十六机制的首选工具。
 -c 每单元以字节为单位,显示出对应的ASCII码
 -C 每单元以字节为单位,同时显示十六机制和ASCII码
 例:
[atom@localhost code]$ hexdump -c txtfile
0000000   t   h   e       q   u   i   c   k       f   o   x       j   u
0000010   m   p       o   v   e   r       l   a   z   y       d   o   g
0000020   s  \n                                                       
0000022

[atom@localhost code]$ hexdump -C txtfile
00000000  74 68 65 20 71 75 69 63  6b 20 66 6f 78 20 6a 75  |the quick fox ju|
00000010  6d 70 20 6f 76 65 72 20  6c 61 7a 79 20 64 6f 67  |mp over lazy dog|
00000020  73 0a                                             |s.|
00000022

3. xxd – make a hexdump or do the reverse.
 能够显示文件对应的十六机制格式,同时还能将修还后的十六进制格式反写回文件,一般与vim结合使用。(利用vim的:! 参数执行外部命令)
使用过程如下:
(1)用vim打开要查看文件
   vim txtfile
(2)在vim命令模式下输入
 :% !xxd
 解释: %表示文件的所有行,!xxd表示执行外部命令xxd,结合在一起,就是把当前vim上显示的所有行传递给xxd,xxd把处理后的结果重新显示在vim上。
 结果如图所示
Linux下文件十六进制查看工具

(3)这时候可以直接在上面修改十六进制值。注意:当前修改了十六进制值,右边侧栏的ASCII码并不会相应改变。
(4)修改完毕后,反写回原文件。在vim命令模式下输入
:% !xxd -r
 只有十六进制的修改部分才会被采用,右边侧栏的ASCII码值忽略不管。

如果你不熟悉vim,可以参考vim自带的vimtutor,然后再参考vim cookbook,主流的技巧就算是掌握了。

带GUI的十六进制编辑器,可以参考ghex和bless,有很多。

题外话,在cu上看到一篇抱怨windows下UltraEdit的帖子。

ildasm的用法

软中间语言 (MSIL) 是一种语言,是许多编译器(C#、VB.NET等)的输出。ILDasm (中间语言反汇编器)程序和.Net Framework SDK(FrameworkSDK\Bin\ildasm.exe)打包在一起,让用户以人可阅读的格式查看MSIL代码。通过该工具,我们可以打开任何.net可执行文件(exe或dll)并查看其MSIL代码。下边我们来看看怎么使用:
1.在VS2008中新建一个Windows窗体应用程序,输入如下代码后生成解决方案:

程序代码
private void Form1_Load(object sender, EventArgs e)
{
int i = 0;
i = i++;
MessageBox.Show(i.ToString());
}

2.运行ildasm,打开刚生成的exe文件,可以看到如下内容:

3.在ildasm中双击”Form1_Load: void(object,class [mscorlib]System.EventArgs)”即可看到上边代码的MSIL代码:
程序代码
.method private hidebysig instance void Form1_Load(object sender,
class [mscorlib]System.EventArgs e) cil managed
{
// 代码大小 22 (0x16)
.maxstack 3
.locals init ([0] int32 i)
IL_0000: ldc.i4.0
IL_0001: stloc.0
IL_0002: ldloc.0
IL_0003: dup
IL_0004: ldc.i4.1
IL_0005: add
IL_0006: stloc.0
IL_0007: stloc.0
IL_0008: ldloca.s i
IL_000a: call instance string [mscorlib]System.Int32::ToString()
IL_000f: call valuetype [System.Windows.Forms]System.Windows.Forms.DialogResult [System.Windows.Forms]System.Windows.Forms.MessageBox::Show(string)
IL_0014: pop
IL_0015: ret
} // end of method Form1::Form1_Load

附:将ildasm集成到VS2008中
在VS2008菜单中选择”工具→外部工具”,点击添加按钮,在标题中输入ILdasm,命令中输入C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\ildasm.exe,确定后在工具菜单中就能找到ILdasm了,以后只要选择它就能运行ILdasm。

 

 

MSIL汇编程序(Ilasm.exe)和MSIL反汇编程序(Ildasm.exe)- –

 

先来解释下文要提到的几个名词:

PE文件:可移植可执行文件。当为公共语言运行库编译程序时,该程序转换为由三部分组成的 PE 文件,PE 标头、MSIL 指令、元数据。

MSIL: Microsoft 中间语言。这是一组可以有效地转换为本机代码且独立于 CPU 的指令。MSIL 包括用于加载、存储和初始化对象以及对对象调用方法的指令,还包括用于算术和逻辑运算、控制流、直接内存访问、异常处理和其他操作的指令。

 

 

MSIL 反汇编程序是 MSIL 汇编程序 (Ilasm.exe) 的伙伴工具。Ildasm.exe 采用包含 Microsoft 中间语言 (MSIL) 代码的可移植可执行 (PE) 文件,并创建相应的文本文件作为 Ilasm.exe 的输入。

还是以SampleClass为例来解释它们的用法。

MSIL反汇编程序(Ildasm.exe)

下面的命令使 PE 文件 SampleClass.exe 的元数据和反汇编代码显示在 Ildasm.exe 的默认 GUI 中。

ildasm SampleClass.exe
下面的命令对 SampleClass.exe 文件进行反汇编,并将结果 MSIL 汇编程程序文本存储在 SampleClass.il 文件中。

E:\test>ildasm SampleClass.exe /output:SampleClass.il
// WARNING: Created Win32 resource file SampleClass.res

下面的命令对 SampleClass.exe 文件进行反汇编,并将结果 MSIL 汇编程序文本显示到控制台窗口中。

E:\test>ildasm SampleClass.exe /text

如果文件 SampleClass.exe 包含嵌入的托管和非托管资源,则下面的命令将产生以下 4 个文件:SampleClass.il、SampleClass.res、Icons.resources 和 Message.resources:

ildasm SampleClass.exe /output:SampleClass.il

下面的命令对 SampleClass.exe 的 SampleClass 类中的 DataClass 方法进行反汇编,并将输出显示到控制台窗口中。

ildasm /item:SampleClass::DataClass SampleClass.exe /text

参数列表:

下列选项可用于 .exe、.dll、.obj 和 .lib 文件。

选项说明

/output:filename 创建具有指定 filename 的输出文件,而不是在对话框中显示结果。
/text 将结果显示到控制台窗口,而不是显示在对话框中或显示为输出文件。
/? 显示此工具的命令语法和选项。

下列附加选项可用于 .exe 和 .dll 文件。

选项说明

/bytes 以十六进制格式显示作为指令注释的实际字节。
/linenum 包含对原始源行的引用。
/nobar 取消反汇编进度指示器弹出窗口的显示。
/pubonly 只反汇编公共类型和公共成员。等效于 /visibility:PUB
/quoteallnames 在单引号中包含所有名称。
/raweh 以原始格式显示异常处理子句。
/source 显示作为注释的原始源行。
/tokens 显示类和成员的元数据标记。
/visibility:vis[+vis …] 只反汇编具有指定可见性的类型或成员。以下是 vis 的有效值。 PUB Public PRIPrivate FAM Family ASM Assembly FAA Family 和 Assembly FOA Family 或 Assembly PSC Private Scope

下列选项仅对用于文件或控制台输出的 .exe 和 .dll 文件有效。

选项说明

/all 指定 /header/bytes 和 /tokens 选项的组合。
/header 在输出中包含文件头信息。
/noil 取消 MSIL 程序集代码输出。
/unicode 对输出使用 Unicode 编码。
/utf8 对输出使用 UTF-8 编码。默认值是 ANSI。

下列选项仅对用于文件或控制台输出的 .exe、.dll、.obj 和 .lib 文件有效。

选项说明

/item:class[::method[(sig)]] 根据所提供的参数反汇编下列内容:

  • 反汇编指定的 class
  • 反汇编 class 的指定 method
  • 反汇编具有指定签名 sig 的 class 的 method。指定具有返回类型的签名和所需的任意多个参数。例如,returntype (param1param2,..paramn)。

MSIL汇编程序(Ilasm.exe)

下面的命令对 MSIL 文件 SampleClass.il 进行汇编并产生可执行文件 SampleClass.exe。

E:\test>ilasm SampleClass

Microsoft (R) .NET Framework IL Assembler.  Version 1.1.4322.2032
Copyright (C) Microsoft Corporation 1998-2002. All rights reserved.
Assembling ‘SampleClass.IL’ , no listing file, to EXE –> ‘SampleClass.EX
Source file is ANSI

Assembled method DataClass::.ctor
Assembled method DataClass::addem
Assembled method SampleClass::.ctor
Assembled method SampleClass::Main
Creating PE file

Emitting members:
Global
Class 1 Fields: 2;      Methods: 2;
Class 2 Fields: 2;      Methods: 2;
Resolving member refs: 11 -> 11 defs, 0 refs
Writing PE file
Operation completed successfully

下面的命令对 MSIL 文件 SampleClass.il 进行汇编并产生 .dll 文件 SampleClass.dll。

E:\test>ilasm SampleClass /dll

Microsoft (R) .NET Framework IL Assembler.  Version 1.1.4322.2032
Copyright (C) Microsoft Corporation 1998-2002. All rights reserved.
Assembling ‘SampleClass.IL’ , no listing file, to DLL –> ‘SampleClass.DLL’
Source file is ANSI

Assembled method DataClass::.ctor
Assembled method DataClass::addem
Assembled method SampleClass::.ctor
Assembled method SampleClass::Main
Creating PE file

Emitting members:
Global
Class 1 Fields: 2;      Methods: 2;
Class 2 Fields: 2;      Methods: 2;
Resolving member refs: 11 -> 11 defs, 0 refs
Writing PE file
Operation completed successfully

下面的命令对 MSIL 文件 SampleClass.il 进行汇编并产生 .dll 文件 SampleClass.dll。

ilasm SampleClass /dll /output:newSampleClass.dll

参数列表:

选项说明

/alignment=integer 将 FileAlignment 设置为由 NT Optional 标题中的 integer 指定的值。如果在文件中指定了 .alignment IL 指令,则此选项将重写它。
/base=integer 将 ImageBase 设置为由 NT Optional 标题中的 integer 指定的值。如果在文件指定了 .imagebase IL 指令,则此选项将重写它。
/clock 为指定的 .il 源文件测量并报告下列编译时间(以毫秒为单位): 总运行时间执行后面的所有特定操作所花费的总时间。 启动 加载并打开文件。分析

发出 MD 发出元数据。 定义引用解析 解析对文件中的定义的引用。修正和链接

CEE 文件生成 在内存中生成文件映像。 PE 文件写入 将映像写入 PE 文件。

/debug 包括调试信息(局部变量名和参数名以及行号)。
/dll 生成 .dll 文件作为输出。
/exe 生成可执行文件作为输出。这是默认值。
/flags=integer 将 ImageFlags 设置为由公共语言运行库标题中的 integer 指定的值。如果在文件中指定了 .corflags IL 指令,则此选项将重写它。有关 integer 的有效值的列表,请参见 CorHdr.h 中的 COMIMAGE_FLAGS。
/key:keyFile 使用 keyFile 中包含的私钥编译具有强签名的 filename
/key:@keySource 使用在 keySource 中生成的私钥编译具有强签名的 filename
/listing 在标准输出上生成列表文件。如果省略此选项,则不生成列表文件。
/nologo 取消显示 Microsoft 启动标题。
/output:file.ext 指定输出文件名和扩展名。默认情况下,输出文件名与第一个源文件名相同。默认扩展名为 .exe。如果指定 /dll 选项,则默认扩展名为 .dll。

注意   指定 /output:myfile.dll 并不会设置 /dll 选项。如果不指定 /dll,则会生成名为 myfile.dll 的可执行文件。

/quiet 指定安静模式;不报告程序集进度。
/resource:file.res 在生成的 .exe 或 .dll 文件中包括 *.res 格式的指定资源文件。使用 /resource选项只能指定一个 .res 文件。
/subsystem=integer 将 subsystem 设置为由 NT Optional 标题中的 integer 指定的值。如果在文件中指定了 .subsystem IL 指令,则此命令将重写它。有关 integer 的有效值的列表,请参见 winnt.h 中的 IMAGE_SUBSYSTEM。
/? 显示此工具的命令语法和选项。