20145307陈俊达_安卓逆向分析_dex2jar&jd-gui的使用

20145307陈俊达_安卓逆向分析_dex2jar&jd-gui的使用

引言

这次免考选择了四个项目,难度也是从简到难,最开始先写一个工具的使用

想要开发安卓首先要会编写代码,但是想要逆向分析安卓的话就要对它的输出文件结构有所了解。首先我们要先了解安卓的输出文件结构。

start!

开发工具一般就是eclipse和官方的安卓studio,两者文件结构略有不同,这里用官方的安卓studio也就是IDEA IDE+SDK来进行讲解

877272-20170611091828293-918732253.png

app文件夹就是src文件夹用来存放java相关代码,就是源文件。build是构建文件,gradle这个东西是编译输出apk的核心,一会重点!重点!介绍。后缀名为properties的文件在混淆编译 保护代码的时候也有重大作用,一会也要重点介绍。res文件为资源文件夹用来存放代码引用的资源等。

环境配置

电脑win 10 64bit,ide选择安卓studio,sdk选择安卓7.1.1(SDK 25),下载后安装!

这里要注意我大天朝可是不能连接谷歌的,所以会报错无法连接服务器,这时候使用代理VPN或者修改proxy 推荐大连东软的mirrors.neusoft.edu.cn 端口号80.

之后你以为就完了吗?no,你想输出apk还需要gradle这个东西,还要自己去配置!官网:http://services.gradle.org/distributions/ 下载好对应的文件后解压到C盘usr目录的gradle/xxx目录下替换源文件,亲测必须要替换!不然天朝的网会编译等待一百年!

正式开始

终于开始了。。。

第一篇讲解已知apk如何逆向出元安卓代码

首先创建一个安卓的项目,选择loginactivity的xml,SDK选择7.1.1就好,之后敲代码,我们也不来难的,就写一个简单得登录代码,有id有pwd。

public class LoginActivity extends Activity {  
  
    private final String ACCOUNT="jclemo";  
    private final String PASSWORD="123456";  
    private EditText etAccount, etPassword;  
    private Button btnLogin;  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_login);  
  
        etAccount=(EditText)findViewById(R.id.et_account);  
  
        etPassword=(EditText)findViewById(R.id.et_password);  
  
        btnLogin=(Button)findViewById(R.id.btn_login);  
  
        btnLogin.setOnClickListener(new View.OnClickListener() {  
            @Override  
            public void onClick(View v) {  
                if (isOK(etAccount.getText().toString(), etPassword.getText().toString())) {  
                    Toast.makeText(LoginActivity.this, "登录成功", Toast.LENGTH_SHORT).show();  
                } else {  
                    Toast.makeText(LoginActivity.this, "登录失败", Toast.LENGTH_SHORT).show();  
                }  
  
            }  
        });  
  
    }  
  
    private boolean isOK(String account, String password){  
        return account.equals(ACCOUNT) && password.equals(PASSWORD);  
    }  
  
}  

.xml布局文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:tools="http://schemas.android.com/tools"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent">  
  
    <LinearLayout  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content"  
        android:orientation="vertical"  
        android:layout_centerInParent="true">  
  
        <LinearLayout  
            android:layout_width="match_parent"  
            android:layout_height="wrap_content"  
            android:gravity="center_horizontal"  
            android:orientation="horizontal">  
  
            <TextView  
                android:layout_width="wrap_content"  
                android:layout_height="wrap_content"  
                android:text="帐号:"/>  
  
            <EditText  
                android:id="@+id/et_account"  
                android:layout_width="100dp"  
                android:layout_height="wrap_content" />  
  
        </LinearLayout>  
  
        <LinearLayout  
            android:layout_width="match_parent"  
            android:layout_height="wrap_content"  
            android:gravity="center_horizontal"  
            android:orientation="horizontal">  
  
            <TextView  
                android:layout_width="wrap_content"  
                android:layout_height="wrap_content"  
                android:text="密码:"/>  
  
            <EditText  
                android:id="@+id/et_password"  
                android:layout_width="100dp"  
                android:layout_height="wrap_content" />  
  
        </LinearLayout>  
  
        <Button  
            android:id="@+id/btn_login"  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:layout_gravity="center_horizontal"  
            android:text="登录"/>  
  
    </LinearLayout>  
  
</RelativeLayout>  

签名打包 Build>Generate Signed APK

yeah,不报错

877272-20170611093836184-1724005600.png

将导出的xxx.apk文件的后缀.apk改为.zip,然后解压,提取出.class文件。如果你的dex2jar版本很高的话是不需要解压的直接拖拽也行。

877272-20170611094308387-1893844756.png

下载dex2jar和jd-gui 附上下载链接: http://download.csdn.net/download/ygd1994/9565391

用cmd,并在dex2jar所在窗口的dos位置输入 dex2jar 路径名+classes.dex,会在本目录下生成一个.jar后缀的名字的文件。

877272-20170611094324278-2143312025.png

但是jar文件是不可以直接看的,要用到配套的工具jd-gui.exe打开。

877272-20170611094333731-1704686186.png

哇!震惊全源码,这也太不安全了吧!

这可不行,思考一下解决方法!

改进 混淆编译

不加处理的话直接显示源代码,这太伤了,那如何改进呢?我们使用混淆编译!

谷歌他们自己从SDK 2.3之后就为开发者提供了一个代码混淆工具proguard,新版的adt创建的工程默认都会有多两个代码混淆文件。我们的文件夹中会带一个.properties和.cfg文件,这就是我们混淆编译的根本。你直接build&run是不会混淆编译的,我们需要在project.properties文件中添加一句 proguard.config=proguard.cfg 才能手动开启混淆编译

行吧,2234再来一次吧!

我们来看看之后逆向后的代码

public class LoginActivity extends Activity  
{  
  private final String a = "jclemo";  
  private final String b = "123456";  
  private EditText c;  
  private EditText d;  
  private Button e;  
  
  private boolean a(String paramString1, String paramString2)  
  {  
    return (paramString1.equals("jclemo")) && (paramString2.equals("123456"));  
  }  
  
  protected void onCreate(Bundle paramBundle)  
  {  
    super.onCreate(paramBundle);  
    setContentView(2130968601);  
    this.c = ((EditText)findViewById(2131492944));  
    this.d = ((EditText)findViewById(2131492945));  
    this.e = ((Button)findViewById(2131492946));  
    this.e.setOnClickListener(new a(this));  
  }  
}  

哇!最直观的一点,所有的关键变量名都变成了abcd!这就相对来说安全很多了啊,看来这一点很有用吧,算我们尝试改进成功!

总结

第一个小例子让我们了解了安卓的逆向与改进办法,之后我们来继续研究其他的逆向方法,加油嘻嘻!

版权声明:本文为baijiang9765原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/baijiang9765/article/details/102339812

智能推荐

Mycat+Mysql分布式架构改造和性能压力测试

架构实现 Mycat作为数据库高可用中间件具备很多的功能,如负载均衡,分库分表,读写分离,故障迁移等。结合项目的实际情况,分库分表功能对于关联查询有很高的要求,需要从业务角度考虑分库分表后的关联查询SQL的分析,业务代码动作较大,所以在此方案中我们不考虑分库分表。主要应用Mycat的负载均衡及故障迁移的功能即可。 整个架构改造包括两个部分,第一是单例Mysql改为多个Mysql,同时负载均衡,并且...

人脸识别之疲劳检测(二)阈值法、KNN分类和K-means聚类

Table of Contents 1、均值法 2、中值法 3、KNN 4、K-means 结合上一节在获得人眼特征点后需要对睁眼闭眼状态做出判断,方法的选择需要经验结合公平的评价方法,使用大量测试集得到不同方法下的精确度并做出比较: 1、均值法 50帧睁眼数据取均值,得到不同阈值下精确度。 2、中值法 50帧睁眼数据取中值,得到不同阈值下精确度。 3、KNN KNN是一种ML常用分类算法,通过测...

CodeForce Tic-Tac-Toe

Two bears are playing tic-tac-toe via mail. It's boring for them to play usual tic-tac-toe game, so they are a playing modified version of this game. Here are its rules. The game is played on the foll...

Python雾里看花-抽象类ABC (abstract base class)

首先认识模块 abc,python中没有提供抽象类与抽象方法,然而提供了内置模块abc来模拟实现抽象类,例如提供泛映射类型的抽象类 abc.MutableMapping 继承abc.MutableMapping构造一个泛映射类型(类似python中的dict) 当然继承abc.Mapping 也可以,毕竟MutableMapping是其子类 dict是python中典型的映射类型数据结构,其接口的...

python 文件操作

2, with open (‘xx.txt’,‘w’,encoding=‘utf-8’) as f: f.write(‘文件内容或对象’)...

猜你喜欢

【Python基础】使用统计函数绘制简单图形

机器学习算法与自然语言处理出品 @公众号原创专栏作者 冯夏冲 学校 | 哈工大SCIR实验室在读博士生 2.1 函数bar 用于绘制柱状图 2.2 函数barh 用于绘制条形图 2.3 函数hist 用于绘制直方图 直方图与柱状图的区别 函数pie 用于绘制饼图 2.5 函数polor 用于绘制极线图 极线图是在极坐标系上绘出的一种图。在极坐标系中,要确定一个点,需要指明这个点距原点的角...

css:顶部按钮固定,上面内容滑动

这种需求我们平时见到很多的,实现方法也多的参差不齐,下面我说一种简单的。如图: 可以看到只有红线部分滚动,底下按钮是固定的。 代码...

环形公路堵车概率模型(含详细解析)

文章目录 基础理论 代码实现 图形分析 基础理论 路面上有n辆车,以不同的速度向前行驶, 模拟堵车问题。 有以下假设: 假设某辆车的当前速度是v。 若前方可见范围内没车,则它在下一秒的车速提高到v+1,直到达到规定的最高限速。 若前方有车,前车的距离为d,且d < v,则它下 一秒的车速降低到d-1 。 每辆车会以概率p随机减速v-1。、 代码实现 图形分析 图形中颜色越重的地方,说明很多车...

JavaScript事件处理的例题

知道的越多,所不知道的越多。如果带给你帮助,点赞支持一下。 JavaScript事件处理的例题 1、表单验证 2、验证数字输入 3、利用document对象的bgColor属性改变背景色,添加鼠标悬停事件 4.附加题(选做) 1、表单验证 要求:用户名不少于2位,并且用户名第一个字符需为字母! 密码长度必须在6~15之间。 2、验证数字输入 如果输入的值 x 不是数字或者小于 1 或者大于 10,...

arduino操作光照传感器BH1750(数字型,I2C接口)

BH1750传感器,用于检测环境光光照强度。 BH1750FVI是日本罗姆(ROHM)半导体生产的数字式环境光传感IC。其主要特性有: I2C数字接口,支持速率最大400Kbps 输出量为光照度(Illuminance) 测量范围1~65535 lux,分辨率最小到1lux 低功耗(Power down)功能 屏蔽50/60Hz市电频率引起的光照变化干扰 支持两个I2C地址,通过ADDR引脚选择 ...