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

引言

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

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

start!

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

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,不报错

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

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

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

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

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

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

改进 混淆编译

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

谷歌他们自己从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!这就相对来说安全很多了啊,看来这一点很有用吧,算我们尝试改进成功!

总结

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

20145307陈俊达_安卓逆向分析_dex2jar&jd-gui的使用的更多相关文章

  1. 20145307陈俊达_安卓逆向分析_Xposed的hook技术研究

    20145307陈俊达_安卓逆向分析_Xposed的hook技术研究 引言 其实这份我早就想写了,xposed这个东西我在安卓SDK 4.4.4的时候就在玩了,root后安装架构,起初是为了实现一些屌 ...

  2. 20145307陈俊达_安卓逆向分析_APKtools分析smail

    20145307陈俊达_安卓逆向分析_APKtools分析smail 引言 真刺激呢!到了第二篇博客了,难度开始加大,之前是简单的dex2jar和有图形界面的jd-gui,现在来隆重介绍强大的反汇编工 ...

  3. 20145307陈俊达《网络对抗》逆向及Bof基础

    20145307陈俊达<网络对抗>逆向及Bof基础 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任 ...

  4. 20145307陈俊达《网络对抗》Exp4 恶意代码分析

    20145307陈俊达<网络对抗>Exp4 恶意代码分析 基础问题回答 如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪 ...

  5. 20145307陈俊达《网络对抗》Exp9 Web安全基础实践

    20145307陈俊达<网络对抗>Exp9 Web安全基础实践 基础问题回答 1.SQL注入攻击原理,如何防御? SQL注入攻击就是通过把SQL命令插入到Web表单递交或输入域名或页面请求 ...

  6. 20145307陈俊达《网络对抗》Exp7 网络欺诈技术防范

    20145307陈俊达<网络对抗>Exp7 网络欺诈技术防范 基础问题回答 什么是dns欺骗攻击! 利用dns spoof运行DNS欺骗,如果是请求解析某个域名,dnsspoof会让该域名 ...

  7. 20145307陈俊达《网络对抗》Exp6 信息搜集与漏洞扫描

    20145307陈俊达<网络对抗>Exp6 信息搜集与漏洞扫描 基础问题回答 哪些组织负责DNS,IP的管理? 全球根服务器均由美国政府授权的ICANN统一管理,负责全球的域名根服务器.D ...

  8. 20145307陈俊达《网络对抗》shellcode注入&return to libc

    20145307陈俊达<网络对抗>shellcode注入 Shellcode注入 基础知识 Shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并将 ...

  9. 20145307陈俊达《网络对抗》Exp 8 Web基础

    20145307陈俊达<网络对抗>Exp 8 Web基础 基础问题回答 1.什么是表单? 表单是一个包含表单元素的区域,表单元素是允许用户在表单中输入信息的元素,表单在网页中主要负责数据采 ...

随机推荐

  1. tkinter 进度条

    import tkinter as tk window = tk.Tk() window.title("我的窗口") window.geometry('600x400') var1 ...

  2. 初识Spring Webflux

    Important to know is that there are two ways to use Spring Webflux. One using annotations, which is ...

  3. ionic项目打包好Xcode工程,模拟器运行各种沙盒缓存目录

    用ionic开发好的app,build好iOS端可用的Xcode工程,然后用模拟器跑起来.研究一下js写的代码做本地持久化时,不同类型的文件都放在那里了. cordova-plugin-sqliteS ...

  4. mysql主从服务器的配置

    使用mysql主从复制的好处有: 1.采用主从服务器这种架构,稳定性得以提升.如果主服务器发生故障,我们可以使用从服务器来提供服务. 2.在主从服务器上分开处理用户的请求,可以提升数据处理效率. 3. ...

  5. MongoDB的”存储过程“

    使用 db.system.js.insert({_id:"aaa", value:"zzq"}); 这条命令向全局系统的js中添加了一个_id为"aa ...

  6. flask中cookie,session的存储,调用,删除 方法(代码demo)

    # -*- encoding: utf-8 -*- # cookie,session的存储,调用,删除 from flask import Flask,make_response,request,se ...

  7. 2015 湘潭大学程序设计比赛(Internet)H题-括号匹配

    括号匹配 Accepted : 30   Submit : 234 Time Limit : 10000 MS   Memory Limit : 65536 KB 题目描述 有一串括号(只包含&quo ...

  8. (2.17)Mysql之SQL基础——日期函数

    关键词:mysql时间函数,mysql日期函数 [1]curdate():返回当前日期(2019-03-06),curdate()+0 返回(20190306) [2]curtime():返回当前时间 ...

  9. Andrew Ng-ML-第九&十章-神经网络

    1.神经网络模型1 图1 这是一个神经网络的模型,通常设置一个x0,作为偏执单元或者偏置(bias)神经元. 图2 这里最后一句话,说的是系数矩阵θ,神经网络模型中,如果当前在j层有s_j个单元,在j ...

  10. GNS3的使用2

    IDE值没算好,巨卡.重新安装,重新算值.速度快了不少 IDE值:选出现次数多,并且数字大的 2960的选256M 另外加了2个模拟器:ASA防火墙.juniper路由器