首页
社区
课程
招聘
[原创]安卓手机下xx.apk JAVA破解之旅
发表于: 2012-10-4 11:17 44735

[原创]安卓手机下xx.apk JAVA破解之旅

2012-10-4 11:17
44735

前言:这几天手机上装了个软件,用了没多久就收费了,颇为不爽,于是便想看看能否破解,便有了下文,请注意该文章只为技术交流,请不要进行非法破解。

软件描述:这个apk使用一定次数后就会扣掉积分 当积分少于0的时候 便不能使用,每次启动程序的时候便会提示积分为0,需要注册,这说明程序在启动的时候就已经检测了积分,刚好可以利用这点

练手软件:
http://pan.baidu.com/share/link?shareid=64695&uk=201738998



1.环境配置   首先请下载好最新的jdk,网络上到处都是,记得配置环境变量,网络都有   其次下载工具(请注意使用的时候所有路径要是英文的)

apktool d xxx.apk 
package com.nfbazi.qimen;

import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import com.nfbazi.qimen.a.a;

public class activity_register extends Activity
{
  a a = new a(this);
  private SharedPreferences b;

  protected void onCreate(Bundle paramBundle)
  {
    super.onCreate(paramBundle);
    setContentView(2130903043);
    EditText localEditText1 = (EditText)findViewById(2131165228);
    EditText localEditText2 = (EditText)findViewById(2131165230);
    localEditText1.setText(a.o);
    localEditText2.setFocusable(true);
    localEditText2.setFocusableInTouchMode(true);
    Button localButton1 = (Button)findViewById(2131165232);
    Button localButton2 = (Button)findViewById(2131165233);
    localButton1.setOnClickListener(new bp(this));
    localButton2.setOnClickListener(new bo(this));
    TextView localTextView = (TextView)findViewById(2131165231);
    if (a.q)   //如果对象a.q字段不为0
    {
      localTextView.setTextColor(-16776961);    //那么设置文字颜色
      localTextView.setText("您已经注册了本程序。");  //设置文本
      localEditText2.setText("************");   //设置文本
      localEditText2.setEnabled(false);  //     将填写注册码的文本框变灰 因为已经注册了
    }
  }
}
.class public Lcom/nfbazi/qimen/activity_register;
.super Landroid/app/Activity;


# instance fields
.field a:Lcom/nfbazi/qimen/a/a;

.field private b:Landroid/content/SharedPreferences;


# direct methods
.method public constructor <init>()V
    .locals 1

    invoke-direct {p0}, Landroid/app/Activity;-><init>()V

    new-instance v0, Lcom/nfbazi/qimen/a/a;

    invoke-direct {v0, p0}, Lcom/nfbazi/qimen/a/a;-><init>(Landroid/content/Context;)V

    iput-object v0, p0, Lcom/nfbazi/qimen/activity_register;->a:Lcom/nfbazi/qimen/a/a;

    return-void
.end method

.method static synthetic a(Lcom/nfbazi/qimen/activity_register;)Landroid/content/SharedPreferences;
    .locals 1

    iget-object v0, p0, Lcom/nfbazi/qimen/activity_register;->b:Landroid/content/SharedPreferences;

    return-object v0
.end method

.method static synthetic a(Lcom/nfbazi/qimen/activity_register;Landroid/content/SharedPreferences;)V
    .locals 0

    iput-object p1, p0, Lcom/nfbazi/qimen/activity_register;->b:Landroid/content/SharedPreferences;

    return-void
.end method


# virtual methods
.method protected onCreate(Landroid/os/Bundle;)V
    .locals 4

    const/4 v3, 0x1

    invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V

    const v0, 0x7f030003

    invoke-virtual {p0, v0}, Lcom/nfbazi/qimen/activity_register;->setContentView(I)V

    const v0, 0x7f07002c

    invoke-virtual {p0, v0}, Lcom/nfbazi/qimen/activity_register;->findViewById(I)Landroid/view/View;

    move-result-object v0

    check-cast v0, Landroid/widget/EditText;

    const v1, 0x7f07002e

    invoke-virtual {p0, v1}, Lcom/nfbazi/qimen/activity_register;->findViewById(I)Landroid/view/View;

    move-result-object v1

    check-cast v1, Landroid/widget/EditText;

    sget-object v2, Lcom/nfbazi/qimen/a/a;->o:Ljava/lang/String;

    invoke-virtual {v0, v2}, Landroid/widget/EditText;->setText(Ljava/lang/CharSequence;)V

    invoke-virtual {v1, v3}, Landroid/widget/EditText;->setFocusable(Z)V

    invoke-virtual {v1, v3}, Landroid/widget/EditText;->setFocusableInTouchMode(Z)V

    const v0, 0x7f070030

    invoke-virtual {p0, v0}, Lcom/nfbazi/qimen/activity_register;->findViewById(I)Landroid/view/View;

    move-result-object v0

    check-cast v0, Landroid/widget/Button;

    const v2, 0x7f070031

    invoke-virtual {p0, v2}, Lcom/nfbazi/qimen/activity_register;->findViewById(I)Landroid/view/View;

    move-result-object v2

    check-cast v2, Landroid/widget/Button;

    new-instance v3, Lcom/nfbazi/qimen/bp;

    invoke-direct {v3, p0}, Lcom/nfbazi/qimen/bp;-><init>(Lcom/nfbazi/qimen/activity_register;)V

    invoke-virtual {v0, v3}, Landroid/widget/Button;->setOnClickListener(Landroid/view/View$OnClickListener;)V

    new-instance v0, Lcom/nfbazi/qimen/bo;

    invoke-direct {v0, p0}, Lcom/nfbazi/qimen/bo;-><init>(Lcom/nfbazi/qimen/activity_register;)V

    invoke-virtual {v2, v0}, Landroid/widget/Button;->setOnClickListener(Landroid/view/View$OnClickListener;)V

    const v0, 0x7f07002f

    invoke-virtual {p0, v0}, Lcom/nfbazi/qimen/activity_register;->findViewById(I)Landroid/view/View;

    move-result-object v0

    check-cast v0, Landroid/widget/TextView;

    sget-boolean v2, Lcom/nfbazi/qimen/a/a;->q:Z

    if-eqz v2, :cond_0   //这里的if-eqz 就是说 如果v2变量等于0的平方那么就跳...,我们将他删除掉

    const v2, -0xffff01  //定义常量v2

    invoke-virtual {v0, v2}, Landroid/widget/TextView;->setTextColor(I)V  //调用方法设置颜色,参数为v0和v2,那么v2应该是颜色信息

    const-string v2, "\u60a8\u5df2\u7ecf\u6ce8\u518c\u4e86\u672c\u7a0b\u5e8f\u3002" //定义字串也就是该程序已经注册

    invoke-virtual {v0, v2}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V

    const-string v0, "************" //将文本框设置为**********  之后再设置为灰色

    invoke-virtual {v1, v0}, Landroid/widget/EditText;->setText(Ljava/lang/CharSequence;)V

    const/4 v0, 0x0

    invoke-virtual {v1, v0}, Landroid/widget/EditText;->setEnabled(Z)V

    :cond_0
    return-void
.end method
  上面部分一样   从这里开始
      const v2, -0xffff01

    invoke-virtual {v0, v2}, Landroid/widget/TextView;->setTextColor(I)V

    const-string v2, "\u60a8\u5df2\u7ecf\u6ce8\u518c\u4e86\u672c\u7a0b\u5e8f\u3002"

    invoke-virtual {v0, v2}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V

    const-string v0, "************"

    invoke-virtual {v1, v0}, Landroid/widget/EditText;->setText(Ljava/lang/CharSequence;)V

    const/4 v0, 0x0

    invoke-virtual {v1, v0}, Landroid/widget/EditText;->setEnabled(Z)V

      :cond_0
    return-void
.end method
public String d()
  {
    com.nfbazi.qimen.a.a.a = c();
    if (com.nfbazi.qimen.a.a.a < 5);
    for (String str = "剩余积分:" + Integer.toString(com.nfbazi.qimen.a.a.a) + " 分。 您的积分不足。" + 10 + "次试用期过后,如果没有注册,还想继续免费使用软件,可点击程序主页面右下角的“获取积分”," + "通过下载安装应用,免费获取一定积分。" + "您也可以付费注册本软件,无需通过积分方式使用。点击程序主页面左下角“菜单”里的帮助,查看如何注册。" + "注册后,不会再有积分事项显示。"; ; str = "剩余积分:" + Integer.toString(com.nfbazi.qimen.a.a.a) + " 分。 每次点击“时家奇门”会“日家奇门”,会消费积分 " + 5 + " 分。")
      return str;
  }

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 6
支持
分享
最新回复 (37)
雪    币: 122
活跃值: (72)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
厉害啊!正需要。
2012-10-4 14:24
0
雪    币: 238
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
其实真正的注册地方是.../qimen/a/d.smali。
只要做以下修改就可以了
if-eqz v2, :cond_19

修改成
if-nez v2, :cond_19
2012-10-4 19:37
0
雪    币: 18
活跃值: (430)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
4
嗯   3q 这个文件名不规则 要花时间找 有时间可以逆向下算法的
修改注册的地方很多 我没有细看 达到免费的目的就可以了
2012-10-6 10:53
0
雪    币: 218
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
public static boolean a(String paramString1, String paramString2)
  {
    boolean bool = true;
    a.p = a(a.a(paramString1));
    if (a.p.equals(paramString2))
      a.q = bool;
    while (true)
    {
      return bool;
      a.q = false;
      bool = false;
    }
  }
paramString1就是注册码
2012-10-6 12:57
0
雪    币: 18
活跃值: (430)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
6
是的 paramString1就是注册码
只是静态的看 显示不了 需要看他的运算过程
用eclipse倒是可以动态调试下
2012-10-6 20:33
0
雪    币: 218
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
积分的话,随便改多少都可以的。
2012-10-6 20:53
0
雪    币: 18
活跃值: (430)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
8
不过积分我一改成超过0x5就报错 不能编译
不知道是啥问题
2012-10-6 21:03
0
雪    币: 411
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
高手,不知道能不能破解一款智播的手机软件
2012-10-6 21:05
0
雪    币: 218
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
进制问题吧。
2012-10-6 21:06
0
雪    币: 218
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
那是什么软件?
2012-10-6 21:07
0
雪    币: 18
活跃值: (430)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
12
我也怀疑是进制问题 也有可能是寄存器的问题
改成
const/16 或者32程序就直接奔溃 让我郁闷
2012-10-6 21:09
0
雪    币: 218
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
改这个不需要改原来的寄存器的啊。
2012-10-6 21:11
0
雪    币: 18
活跃值: (430)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
14
就算没改 只要超过0x5  就编译不过...
2012-10-6 21:12
0
雪    币: 218
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
15
你改的是剩余积分,改10000多行啊
2012-10-6 21:28
0
雪    币: 27
活跃值: (127)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
16
我来学习学习
2012-10-6 21:38
0
雪    币: 18
活跃值: (430)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
17
剩余积分就是修改一个return
2012-10-6 23:53
0
雪    币: 5
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
这些破解都太复杂,还有更简单的方法
2012-10-7 20:45
0
雪    币: 18
活跃值: (430)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
19
愿闻高招.........
2012-10-7 23:42
0
雪    币: 151
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
这个软件我昨天刚好也破解好了,只要修改if-eqz  => if-nez,。。。
但是目前我有碰到另外一个相似的软件,按理说应该找到了突破口,但是他的注册方法我找不到,今天找了一天也没找到,我就再resultchecker 里,修改了i=0 变成了 i=1.
final boolean b()
  {
    int i = 1;
    if ((c().equalsIgnoreCase("true")) && (a() == 2))
      i = 1;
    return i;
  }

但是找不到哪里注册,除非安装支付宝支付,我也没有找到在哪里检测的,各位兄弟帮我一起看看~也是奇门遁甲,是d8soft.com
2012-10-9 13:33
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
其实真正的注册地方是.../qimen/a/d.smali。
只要做以下修改就可以了

引用:
if-eqz v2, :cond_19
修改成

引用:
if-nez v2, :cond_19
=========================

您说的文件里面,没找到这句话 if-eqz v2, :cond_19
能不能详细说下
2013-1-1 14:39
0
雪    币: 507
活跃值: (130)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
22
经过阅读,感觉楼主可以用其他的方法~
这个广告积分墙是有米的广告,我们可以试着对这个广告包进行删除去掉,因为在android程序中实现这些,必须是有广告平台提供的接口,在smali文件中进行了调用,才会显示的这个积分,一种方法就是楼主的,将积分判断进行修改,另外一种,其实就是整体删除广告包,然后对应在smali文件中找到调用接口,进行删除既可,配合eclipse查询出错代码,进行删除Lcom/youmi这个字符的调用代码,达到彻底去除广告,去除积分显示~
2013-1-9 09:08
0
雪    币: 18
活跃值: (430)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
23
愿闻高招 我不大明白 要是能做个视频就好了
2013-1-17 20:18
0
雪    币: 507
活跃值: (130)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
24
你看一下我写的那个帖子,也在这个板块,思路主要是去广告,因为广告接口是额外放置在代码里面,我们找到所有调用代码删除即可。

最好看一下广告sdk使用介绍,然后以后遇到同类广告,很方便使用~
2013-1-20 08:17
0
雪    币: 3
活跃值: (81)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
学习研究一下
2013-1-20 09:45
0
游客
登录 | 注册 方可回帖
返回
//