【Android安全】APK静态分析-源码反编译逆向分析

来源:互联网 发布:php倒着做乘法表 编辑:程序博客网 时间:2024/05/01 18:11
静态分析(Static Analysis)是指在不运行代码的情况下,采用词法分析、语法分析等各种技术手段对程序文件进行扫描从而生成程序的反汇编代码,然后阅读反汇编代码来掌握程序功能的一种技术。在实际的分析过程中,完全不运行程序是不太可能的,分析人员时常需要先运行目标程序来寻找程序的突破口。静态分析强调的是静态,在整个分析的过程中,阅读反汇编代码是主要的分析工作。生成反汇编代码的工具称为反汇编工具或反编译工具,选择一个功能强大的反汇编工具不仅能获得更好的反汇编效果,而且也能为分析人员节省不少时间。
静态分析Android程序有两种方法:一种方法是阅读反汇编生成的Dalvik字节码,可以使用IDA Pro分析dex文件,或者使用文本编辑器阅读baksmali反编译生成的smali文件;另一种方法是阅读反汇编生成的Java源码,可以使用dex2jar生成jar文件,然后再使用jd-gui阅读jar文件的代码。


还是用之前写的一个实例,界面包含2个文本框,2个按钮,判断2个文本框中内容是否相等,相等返回成功,不等返回失败。
dex产生过程:java源代码-》Java字节码-》Dalvik字节码,dex还原过程与之相反。
dex2jar工具作用是将dalvik字节码的dex文件转换为java字节码的jar或class文件
下载地址:http://dl.cr173.com/soft1/dex2jar.zip
jd-gui工具是将java字节码文件转换为java源码
下载地址:http://dl.cr173.com/soft1/jd-gui.zip
1、将之前开发的用户名密码校验的apk文件的扩展名apk改为zip,解压zip后可以查看到class.dex利用dex2jar转换为jar格式
D:\software\android\test\TestTwo>d2j-dex2jar classes.dex
dex2jar classes.dex -> classes-dex2jar.jar


D:\software\android\test\TestTwo>
2、利用jd-gui查看新生产的classes-dex2jar.jar文件查看源代码可以看到MainActivity.java的代码如下与源代码基本一致,主要是控件不是用名称而是用ID表示。


package com.example.testtwo;


import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;


public class MainActivity extends Activity
{
  private boolean checkSN(String paramString1, String paramString2)
  {
    return paramString1.equals(paramString2);
  }


  protected void onCreate(Bundle paramBundle)
  {
    super.onCreate(paramBundle);
    setContentView(2130903040);
    final EditText localEditText1 = (EditText)findViewById(2131230724);
    final EditText localEditText2 = (EditText)findViewById(2131230725);
    Button localButton1 = (Button)findViewById(2131230722);
    Button localButton2 = (Button)findViewById(2131230723);
    localButton1.setOnClickListener(new View.OnClickListener()
    {
      public void onClick(View paramAnonymousView)
      {
        if (MainActivity.this.checkSN(localEditText1.getText().toString().trim(), localEditText2.getText().toString().trim()))
        {
          Toast.makeText(MainActivity.this, "success!", 0).show();
          return;
        }
        Toast.makeText(MainActivity.this, "fail!", 0).show();
      }
    });
    localButton2.setOnClickListener(new View.OnClickListener()
    {
      public void onClick(View paramAnonymousView)
      {
      }
    });
  }


  public boolean onCreateOptionsMenu(Menu paramMenu)
  {
    getMenuInflater().inflate(2131165184, paramMenu);
    return true;
  }
}


资源id的对应关系在R.id中详细如下,可以看到22和23为按钮控件,24和25为文本控件。
package com.example.testtwo;


public final class R
{
  public static final class attr
  {
  }


  public static final class dimen
  {
    public static final int activity_horizontal_margin = 2130968576;
    public static final int activity_vertical_margin = 2130968577;
  }


  public static final class drawable
  {
    public static final int ic_launcher = 2130837504;
  }


  public static final class id
  {
    public static final int AbsoluteLayout1 = 2131230720;
    public static final int action_settings = 2131230728;
    public static final int button1 = 2131230723;
    public static final int button2 = 2131230722;
    public static final int editText1 = 2131230724;
    public static final int editText2 = 2131230725;
    public static final int textView1 = 2131230726;
    public static final int textView2 = 2131230721;
    public static final int textView3 = 2131230727;
  }


  public static final class layout
  {
    public static final int activity_main = 2130903040;
  }


  public static final class menu
  {
    public static final int main = 2131165184;
  }


  public static final class string
  {
    public static final int action_settings = 2131034113;
    public static final int app_name = 2131034112;
    public static final int hello_world = 2131034114;
  }


  public static final class style
  {
    public static final int AppBaseTheme = 2131099648;
    public static final int AppTheme = 2131099649;
  }
}


3、通过上面的代码分析可以理解此程序只是对两个文本框中输入的内容进行判断,如果相等返回成功,不等返回失败。
0 0
原创粉丝点击