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. POJ 1556 - The Doors - [平面几何+建图spfa最短路]

    题目链接:http://poj.org/problem?id=1556 Time Limit: 1000MS Memory Limit: 10000K Description You are to f ...

  2. The Unique MST POJ - 1679 最小生成树判重

    题意:求一个无向图的最小生成树,如果有多个最优解,输出"Not Unique!" 题解: 考虑kruskal碰到权值相同的边: 假设点3通过边(1,3)连入当前所维护的并查集s. ...

  3. iOS多线程编程之线程的状态(转载)

    一.简单介绍 线程的创建: self.thread=[[NSThread alloc]initWithTarget:self selector:@selector(test) object:nil]; ...

  4. Cocos2d比较好的博客

    1 .http://blog.csdn.net/bill_man/article/details/7202458 学习笔记 2.http://cocos2d-x.org/ 官网 3.http://ww ...

  5. 图论最短路——dijkstra

    下午直接开始dijkstra的堆优化,很简单的这里把书上的原理说一下吧,小心和prim最小生成树的堆优化迷,Dijkstra算法基于贪心思想,它只适用于所有边都是非负数的图.当变长z都是非负数的时候, ...

  6. operator, itertools

    import operator import itertools info_list = [ {'name': 'Quinn', 'age': 50}, {'name': 'Ryan', 'age': ...

  7. my.cnf 详解

    [client] port =3306 socket =/tmp/mysql.sock [mysqld] port =3306 socket =/tmp/mysql.sock basedir =/us ...

  8. 【Cocos2dx 3.3 Lua】定时器事件

    Cocos2dx 3.x Lua 中使用定时器有两种方式: (1)self:scheduleUpdateWithPriorityLua(update, priority) > 参数一:刷新函数 ...

  9. svn 常见问题记录

    One or more files are in a conflicted state 情景:A组员新增文件并提交,B组员更新出现如下图情况. 解决方案:直接拷贝到B组员工作区.

  10. javascript 获取元素样式的方法

    javascript 获取元素样式常用方法. Javascript获取CSS属性值方法:getComputedStyle和currentStyle  1 .对于元素的内联CSS样式(<div s ...