红心J 发表于 2017-7-13 00:11

一个面试APK的简单分析

本帖最后由 红心J 于 2017-7-17 21:31 编辑

之前有看到个帖子
http://www.52pojie.cn/forum.php?mod=viewthread&tid=403032&extra=page%3D2%26filter%3Dtypeid%26typeid%3D236
分析android程序的,我是刚学,抱着学知识的心态按照帖子里的,自己走了一遍。
1、先试试爆破吧。
用改之理打开程序。
搜 密码错误 转成 unicode,到 Java 源码去看看

如下图:

说实话,好像没啥看懂。
不过可以知道的是: str1 是我们的输入 ,paramView = str1 ,赋值给 paramView


这个比较很关键,告诉我们str2 = paramView = str1 时就正确了。
所以呢,爆破的话,很简单。


补充下Dalvik比较指令:
if-eqzvAA,若 vAA为0 则跳, Java语法为:if(!vAA)
if-nezvAA,若 vAA 不为0 则跳, Java语法为:if(vAA)
if-ltz    vAA,若 vAA 小于0 则跳, Java语法为:if(vAA<0)
if-gez    vAA,若 vAA 大于等于0 则跳, Java语法为:if(vAA>=0)
if-gtz    vAA,若 vAA 大于0 则跳, Java语法为:if(vAA>0)
if-lez    vAA,若 vAA 小于0 则跳, Java语法为:if(vAA<=0)

   if-nez v5, :cond_1   改成if-eqz v5, :cond_1



2.我们来找找正确的 key

根据上面的分析,str2 里面就是存放的正确的key
那么,让这个程序输出 str2就行。
看看str2 出现在什么地方。

就是那个 gagafffafa 这个奇怪的函数里面。


我们让程序输出 v3, 复制下输出 登陆成功xxx(登陆失败xxx)这段 Dalvik 代码。

改一下,把 v6 改成 v3 ,放到上面那个图的最后。

运行试一下

这。。肯定不对
是错误的。。。为什么呢。。。在来看代码

正确的key在v1里面,那就在输出 登陆错误那句话里,把 v6 改成 v1

再运行试试


很明显,,还是不对的。。

为什么呢??我在来看看 v3 和 v1到底比较的什么东西。改成 v3再试

运行,输入 123 看看 会输出什么?

这几个字是不是很熟悉。。对,就是我们最开始添加代码的那个位置,也就是gagafffafa这个函数的输出。。。。
很遗憾,,没有试出正确的key
----------------------------------------
最后题目是说爆破,爆破成了,由于能力有限,没有找到正确的key。抱歉~。
第一次发帖,做的不好的地方,大家海涵。

hjphy 发表于 2017-7-17 20:44

真对你无语,工欲善其事,必先利其器啊,看看哥反编译后的Java代码,你就都明白了package com.uc.uc_crackme;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;

public class MainActivity extends Activity {
    Button mButton;
    EditText meditText;

    class C00011 implements OnClickListener {
      C00011() {
      }

      public void onClick(View v) {
            String v3 = MainActivity.this.meditText.getText().toString();
            String v5 = MainActivity.this.cccccc();
            String v4 = MainActivity.this.gagagfffafa();
            String v2 = null;
            try {
                v2 = MainActivity.bytesToAliSmsCode(v5, v3.getBytes("utf-8"));
            } catch (UnsupportedEncodingException v1) {
                v1.printStackTrace();
            }
            if (v4 == null || v4.equals("") || !v4.equals(v2)) {
                Toast.makeText(MainActivity.this, "密码错误!登录失败", 0).show();
            } else {
                Toast.makeText(MainActivity.this, "恭喜你!登录成功", 0).show();
            }
      }
    }

    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(C0002R.layout.activity_main);
      this.meditText = (EditText) findViewById(C0002R.id.edit);
      this.mButton = (Button) findViewById(C0002R.id.button);
      this.mButton.setOnClickListener(new C00011());
    }

    private static String bytesToAliSmsCode(String table, byte[] data) {
      StringBuilder v1 = new StringBuilder();
      for (byte b : data) {
            v1.append(table.charAt(b & 255));
      }
      return v1.toString();
    }

    protected String cccccc() {
      String v6 = null;
      InputStream v3 = null;
      String v5 = "";
      try {
            v3 = getResources().getAssets().open("abcdefghddddd");
            int v4 = v3.available();
            byte[] v0 = new byte;
            v3.read(v0, 0, v4);
            byte[] v1 = new byte;
            System.arraycopy(v0, 89473, v1, 0, 768);
            v6 = new String(v1, "utf-8");
      } catch (Throwable e) {
            e.printStackTrace();
      }
      try {
            v3.close();
            return v6;
      } catch (IOException e2) {
            return v6;
      }
    }

    protected String gagagfffafa() {
      String v6 = null;
      InputStream v3 = null;
      String v5 = "";
      try {
            v3 = getResources().getAssets().open("abcdefghddddd");
            int v4 = v3.available();
            byte[] v0 = new byte;
            v3.read(v0, 0, v4);
            byte[] v1 = new byte;
            System.arraycopy(v0, 91265, v1, 0, 18);
            String v62 = new String(v1, "utf-8");
            if (v3 == null) {
                v6 = v62;
                return v62;
            }
            v6 = v62;
            try {
                v3.close();
                v5 = v6;
            } catch (IOException e) {
                v5 = v6;
            }
            return v5;
      } catch (Throwable e2) {
            e2.printStackTrace();
      }
    }
}


简单分析一下,就是从ASSERT下的一个文件里面读出一个Table和一个结果值,然后根据输入的内容,从Table里面取出内容,跟这个结果值进行比较,最后的结果是:581026,什么注册机,完全扯淡啊

红心J 发表于 2017-7-17 21:15

本帖最后由 红心J 于 2017-7-17 21:33 编辑

hjphy 发表于 2017-7-17 20:44
真对你无语,工欲善其事,必先利其器啊,看看哥反编译后的Java代码,你就都明白了p ...
对不起,朋友,分析错了。抱歉,,我刚学请见谅。我是参照上面那个帖子去做的。没有自己去好好看反编译后的Java代码。是我自己的错,把题目要求也给看错了。抱歉!

peterq521 发表于 2017-7-13 09:33

沙发 楼主一个成品也没给啊

红心J 发表于 2017-7-13 11:37

peterq521 发表于 2017-7-13 09:33
沙发 楼主一个成品也没给啊

你到我上面给那个链接去看看嘛,那个帖子给了的。

Vat_ 发表于 2017-7-13 12:44

感谢分享

wanmei195634 发表于 2017-7-13 20:06

楼主 加油分析的不错

Nino30888 发表于 2017-7-13 21:09

感谢分享!!!

wangxd 发表于 2017-7-14 00:14


楼主 加油分析的不错

NoZuoNo代 发表于 2017-7-14 01:33

分析给力啊,等大神批示

生如上善若水 发表于 2017-7-14 09:20

学习一下,谢谢分享

u7c 发表于 2017-7-14 09:22

不错,学习啦,谢谢分享~~~~~~~~~~~~~~~~~~~
页: [1] 2
查看完整版本: 一个面试APK的简单分析