如何分析一个Android程序(反编译+重新编译+签名)
2013-12-10 18:26
549 查看
如何分析一个Android程序
这是参照《Android软件安全与逆向分析》中的一个例子,主要就是如何分析一个Android应用程序,是一个非常简单的例子。
首先:默认各位已经安装JDK,并且环境变量已经正确配置。
已经有安装有Android开发环境。
默认各位都不是Android零基础。。(这个好像有点多余,,嘿嘿。。)
所需工具:
Android 反编译工具下载:http://download.csdn.net/download/xyz326547445/6691679 (不要积分哦,亲)
正文:
1、新建一个Android项目,名字叫 CrackMe01,界面为这样:
2、 接着编写MainActivity 里面的代码,先写一个checkSN ( String userName , String sn )方法,代码如下:
private boolean checkSN(String userName ,String sn) { // TODO Auto-generated method stub boolean result = false; if(userName == null || userName.length() == 0){//如果 userName == null 或者 userName == ""; return false; } if(sn == null || sn.length() != 16){//如果注册码 sn == null 或者 sn 的长度不等于 16 return false; } try { MessageDigest digest = MessageDigest.getInstance("MD5"); digest.reset(); digest.update(userName.getBytes()); byte[] userNameBytes = digest.digest(); // 采用 MD5 对用用户名进行 Hash String strBytes = new String(userNameBytes,"UTF-8"); // 将计算结果转化为字符串 StringBuffer strBuffer = new StringBuffer(); for (int i = 0; i < strBytes.length(); i+=2) { strBuffer.append(strBytes.charAt(i)); } String userSN = strBuffer.toString();//计算出的userSN result = userSN.equalsIgnoreCase(sn);//比较注册码(sn)是否正确 } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } return result; }
接着在 MainActivity 的 onCreate() 方法中注册监听 Button 点击事件:
private EditText etUserName;//用户名输入框 private EditText etRegisterCode;//注册码输入框 private Button btnRegister;//注册按钮 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setTitle(R.string.unregister);//设置标题 initView();//初始化界面控件 initListener();//注册监听 } private void initView() { // TODO Auto-generated method stub etUserName = (EditText)findViewById(R.id.et_user_name); etRegisterCode = (EditText)findViewById(R.id.et_register_code); btnRegister = (Button)findViewById(R.id.btn_regist); } private void initListener() { // TODO Auto-generated method stub btnRegister.setOnClickListener(new View.OnClickListener() {//注册按钮点击监听 @Override public void onClick(View v) { // TODO Auto-generated method stub String userName = etUserName.getText().toString().trim(); String sn = etRegisterCode.getText().toString().trim(); if(checkSN(userName, sn)){//调用checkSN方法进行注册码比较 Toast.makeText(MainActivity.this, R.string.register_succeed, 0).show(); setTitle(R.string.register); }else{ Toast.makeText(MainActivity.this, R.string.register_failed, 0).show(); setTitle(R.string.unregister); } } }); }
写好之后进行编译,生成 apk 文件,测试:
好了,接下来我们用 反编译工具 进行反编译,得到的文件列表如下图:
我们先找一个突破口: 就以 "无效用户名或注册码,注册失败" 这句话为突破口,在资源文件里面找:
在 /res/values/string.xml 中:
接下来我们在
/res/values/public.xml 中寻找 register_failed:
可以看出它的对应的id = "0x7f050009";
现在我们去MainActivity$1.smali代码中寻找这个id:
这是smali语言,if-eqz 如果为真 就顺序执行,否则跳到 cond_0
和它相对应的是 if-nez,所以我们将它 替换为 if-nez。然后在用ApkTools即反编译工具 Rebuild APK ,重新生成新的apk,这时候别忘了要对新的apk进行签名:
最后再运行签名后的apk,运行结果:
相关文章推荐
- Android 如何对apk文件进行反编译以及重新打包签名 标签: apktoolandroid反编译jebSmali2Java 2016-05-10 16:00 3897人阅读 评论(0) 收藏
- Android 如何对apk文件进行反编译以及重新打包签名
- c++游戏程序移植到android平台后,如何更新程序,重新编译
- 如何反编译一个android程序一
- Android程序反编译、重新编译和签名的方法
- 最好用的Android反编译、重新编译和签名工具-AntiDroid V1.3 发布了~
- 如何反编译一个android程序三
- 如何反编译一个android程序二
- Android如何防止apk程序被反编译
- Android 软件安装程序(*.apk)的结构分析、反编译以及汉化 (12-24 01:22)
- 云课堂 Linux内核分析 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- Android如何防止apk程序被反编译
- Android apk如何防止反编译和如何快速有效的反编译别人的Apk
- Unity引擎编译后的程序是如何运行在iOS和Android上
- linux内核分析 第七周 Linux内核如何装载和启动一个可执行程序
- Linux内核分析作业7:Linux内核如何装载和启动一个可执行程序
- Android如何防止apk程序被反编译
- android编译系统分析(四)实战:新增一个产品
- android逆向研究[0]:一个app是如何构造出来的----Android编译过程
- Android如何防止apk程序被反编译