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. Elasticsearch之settings和mappings的意义

    Elasticsearch之settings和mappings(图文详解)   Elasticsearch之settings和mappings的意义 简单的说,就是 settings是修改分片和副本数 ...

  2. 源码 mongod.lock shutdown

    https://github.com/mongodb/mongo/blob/master/src/mongo/db/db.cpp 1. 退出原理 /proc/" << pid 判 ...

  3. Charles 使用(拦截与修改)

    一.http 拦截(Breakpoints) 选取需要拦截的地址,鼠标右击选择Breakpoints 二.拦截结果与修改 可以在请求与返回结果中修改内容 1.所拦截的数据包 2.所拦截的请求 3.所拦 ...

  4. ssm框架整合shiro

    1.导入shiro相应jar包,也可下载shiro-all.jar; 2.web.xml添加shiroFilter配置,类似于mvc <!-- shiro 安全过滤器--> <fil ...

  5. Vue 数据绑定语法

    数据绑定语法 Vue.js 的模板是基于 DOM 实现的.这意味着所有的 Vue.js 模板都是可解析的有效的 HTML,且通过一些特殊的特性做了增强.Vue 模板因而从根本上不同于基于字符串的模板, ...

  6. POJ:3083 Children of the Candy Corn(bfs+dfs)

    http://poj.org/problem?id=3083 Description The cornfield maze is a popular Halloween treat. Visitors ...

  7. NGINX负载均衡缓存配置

    环境:VMware-Workstation-12-Pro,Windows-10,CentOS-7.5,Xshell5 1 概述 如果我们的架构是前端负载均衡后端WEB集群时,可以开启nginx的缓存功 ...

  8. css定位浮动总结

    定位:定位在中间,放大缩小时也不会跑偏. position:absolute; top: 50%; left: 50%; margin: -270px 0 0 -455px; 解释:定位后,设百分比的 ...

  9. 3:3 OGNL 表达式一

    一: 用例 (直接链式访问属性名,其实内部还是的调用set,get方法实现数据的流动); 二: 注意:表达式里面是没有方法的,只能点属性, 访问列表: (访问的时候加上#,表示访问非值栈的内容.) 访 ...

  10. ajax提交form(文本数据以及文件上传)

    $.ajax({ url: 'xxxx.do', type: 'POST', cache: false, data: new FormData($('.layui-form')[0]), proces ...