安卓逆向smail破解小试-->注册码破解

安卓逆向smail破解小试-->注册码破解


长期搞web渗透的朋友,APP业务逻辑测试的朋友,不妨关注一下java安卓逆向破解类的东东

首先要明白这个概念,这在逆向破解中是非常常见的

"if-eq vA, vB, :cond_**" 如果vA等于vB则跳转到:cond_**
"if-ne vA, vB, :cond_**" 如果vA不等于vB则跳转
到:cond_**
"if-lt vA, vB, :cond_**" 如果vA小于vB则跳转到:cond_**
"if-ge vA, vB, :cond_**" 如果vA大于等于vB则跳转
到:cond_**
"if-gt vA, vB, :cond_**" 如果vA大于vB则跳转到:cond_**
"if-le vA, vB, :cond_**" 如果vA小于等于vB则跳转
到:cond_**
"if-eqz vA, :cond_**" 如果vA等于0则跳转到:cond_**
"if-nez vA, :cond_**" 如果vA不等于0则跳转到:cond_**
"if-ltz vA, :cond_**" 如果vA小于0则跳转到:cond_**


if-eqz:跳转 -->意思是如果vA等于vB跳转到cond_*执行相应的代码

if-nez:  意思是如果vA不等于vB跳转到cond_*执行相应的代码


首先下载一款软件进行测试:玄奥河洛理数

http://www.downyi.com/downinfo/262063.html

载入夜神模拟器

安装



捕获.JPG



捕获112.JPG



这里提示需要注册


输入123456

捕获988.JPG



我们就想办法,逆向一下,是否能破解他的这个功能

常见破解工具如apktool

命令:>apktool_2.6.0.jar d apk名称


捕获1.JPG



捕获22.JPG



jadx-gui反编译工具

AndroidKiller逆向分析工具


这些工具能帮忙我们破解一些工具的使用功能

具体如何破解呢


可以根据提示,来进行载入搜索关键字

载入asm字节信息也可以使用这种方法


我们首先发现一个关键字

请输入注册号

这里作为一个关键


首先打开jadx,载入app


捕获888.JPG



来搜索一下关键字:请输入注册号


捕获90.JPG




定位到这里,发现这里有一个请输入注册号,其实

  Toast.makeText(this, "请输入注册号。", 1).show();
这一句,实际上有点像messagebox.show(""):

或者system.out.println("");


我们需要先研究一下这个逻辑


 public void onClick(View v) {
        if (v == this.BtoClose) {
            setResult(0);
            finish();

这个有一个onClick事件

          main.m_chkSoft.Fregcode = stmp;
            if (main.m_chkSoft.ChkNumA() && main.m_chkSoft.ChkNumB() && main.m_chkSoft.ChkNumC()) {
                main.m_chkSoft.WriteRegCode(stmp);
                this.m_bFlag = true;
            }
            Intent iet = getIntent();
            iet.putExtra("reg", this.m_bFlag);
            setResult(main.Ret_RegOk, iet);
            finish();
            return;


这里有一个判断

    if (main.m_chkSoft.ChkNumA() && main.m_chkSoft.ChkNumB() && main.m_chkSoft.ChkNumC()) {

关键点是  this.m_bFlag = true;

ChkNumA()

ChkNumB()

ChkNumC()

如果条件满足那就执行跳转

再看看前面

  if (stmp.length() == 15) {
            for (int i = 0; i < 15; i++) {
                if (stmp.charAt(i) < '0' || stmp.charAt(i) > '9') {
                    Toast.makeText(this, "请输入数字。", 1).show();
                    return;
                }
            }

这里就是一个for循环,判断用户输入的值,类型是数字

m_bFlag应该是一个关键

否则执行错误信息

这种分析就有点像我们在挖web渗透测试过程中,if a=0 ;则执行修改密码的操作,如果a!=0,那就弹出错误信息,不允许执行该类操作


注意这里

  if (this.m_bFlag) {
            this.EdtSer.setText("已注册");
            this.EdtReg.setText("已注册");
        } else {
            this.EdtSer.setText(main.m_chkSoft.Fsoftsn);
            this.EdtReg.setText("");
        }


如果m_bFlag条件成立,已注册

否则不成立,错误信息

我们需要去找这个

m_bFlag

或者

已注册


首先打开AndroidKiller


搜索m_bFlag

找到一处

捕获999.JPG



定位到m_bFlag,我们发现这里

 iget-boolean v4, p0, LMy/XuanAo/HeLuoYi/SoftRegDlg;->m_bFlag:Z

    if-eqz v4, :cond_4

    .line 110

如果 if-eqz v4 等于v4,就跳转到cond_4

而cond_4就在这里

:cond_4
    iget-object v4, p0, LMy/XuanAo/HeLuoYi/SoftRegDlg;->EdtReg:Landroid/widget/EditText;

    invoke-virtual {v4}, Landroid/widget/EditText;->getText()Landroid/text/Editable;

    move-result-object v4

跳转到cond_4,这里会执行一个getText()的操作

我们看一下代码是否是对应的

捕获8901.JPG


我们再来搜索一下

已注册

转成unicode


捕获881.JPG


定位一下


捕获0001.JPG



其实这两句话对应的就是

     this.EdtSer.setText("已注册");
            this.EdtReg.setText("已注册");

只不过转成了unicode

\

那么我们注意这里

  if-eqz v0, :cond_0

如果如果vA等于vB则跳转到:cond_**

是这个意思



而cond_0在哪里呢

捕获989.JPG


我们让他不等于vA不等于vB,也就是if-nez 也就是反方向,那么就直接已注册了啊!

需要把

  if-eqz v0, :cond_0

改成

  if-nez v0, :cond_0

然后保存一下

捕获9921.JPG



编译一下

捕获882.JPG


我们再来测试一下,是否能够绕过注册码



捕获001.JPG



载入之后发现是成功了,显示已注册


捕获998.JPG