吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 115024|回复: 260
收起左侧

[Android 原创] 吾爱破解安卓逆向入门教程(五)---Smali实战分析

    [复制链接]
qtfreet00 发表于 2015-8-8 17:32
本帖最后由 世事繁华皆成空 于 2015-8-8 17:34 编辑
软件:计算管家 v3.4目标:破解授权会员
目标软件验证方法:软件获取设备号号后调用支付宝进行付费,付费成功后会返回对应参数,点击授权按钮后即完成付费用户授权。
实战目标:点击授权按钮直接授权成功,小雨之前也做过3.3的分析,我的手段比较简单,适合新手

软件界面:
QQ截图20150808162249.png

0x0 脱壳
本软件v3.3使用的爱加密壳,v3.4使用的360壳,不过对于那些大鸟们来说,什么壳都没用,目前我们处于smali阶段,不介绍壳的脱法,不像pc破解一上来就告诉你如何脱壳,后面阶段,将会由@PoJie_小雨 给大家讲述脱壳实战。




0x1 运行软件找关键点
我们首先来到付费页面,如下图:
QQ截图20150808162626.png
开头中我已经讲过这个软件的验证流程,既然这样,我们直接点击授权按钮观察有什么关键点
QQ截图20150808162736.png
软件提示我们并没有获取授权,那么这类文字通常会以文本形式写在String.xml,对应的布局文件或者以unicode形式写在smali中,对于游戏来说,这类可能是以图片形式放在图片文件,或者自定义格式的文件,甚至是通过网络获取的,我们了解之后,先尝试第一种,直接搜索
AndroidKiller载入apk
QQ截图20150808163107.png
嗯,直接搜索到了,减少了我们很多的工作量,那么,文本都有对应的id,我们再次搜索这个id,等等,我们好像发现了更重要的东西
QQ截图20150808163206.png
我们看到了授权成功的文字,那么我们换思路,直接搜索授权成功的id
QQ截图20150808163316.png
我们这里看到了这个神奇的数字,新手相信都不知道这个玩意是怎么来的,那么这里我稍微普及下,apk在编写时,开发工具都会对源代码自动编译,生成对应的标示符,通过这些标示符,来引用对应的资源,详细一点的可以阅读这篇文章
http://blog.sina.com.cn/s/blog_7b83134b01016043.html



0x2 尝试破解
我们接着搜索0x7f080100,发现两处可疑处
QQ截图20150808163815.png
分别点进去看看,顺便我们也记下授权失败的标示符,0x7f080102,这里我们可以方便我们判断
QQ截图20150808164120.png
这里我们看到的就是授权失败时弹出的对话框,我们找到它的标签是:cond_1,接着我们向上翻,看到哪些跳转会跳到:cond_1,我们来到方法的开始
QQ截图20150808164324.png
这是个接收信息的方法,通常是由handler实现的,我们大体可以知道,在付费成功后,会想这个函数传递一个message,这个方法就是判断传入的message的值,通过这个值来判断是否付费成功,这里我们看到一个cond_3,我们找到:cond_3,
QQ截图20150808164658.png
这里我们看到,获取res资源中的0x7f08011a,并转换为string类型,再传入到Alertdialog的message中,我们看看它到底调用了什么资源
QQ截图20150808164846.png
看到是这个,看来跟我们破解无关,跳过,我们就直接针对这两个跳转即可
QQ截图20150808164939.png
如果v1<=0或者v1>v2,则跳转到:cond_1,我们不让它跳,在pc破解中,我们有两种方法,一种是设置为相反的跳转,另一种就是nop掉,lez对应的就是ge,不过这种方法不保险,我推荐第二种,不走跳转,直接向下走if函数中的代码,我们删除这两条即可,另一个smali修改方法类似,稍有出入
QQ截图20150808165502.png
接收传入的message,判断v0是否等于0x1b207,不等的话,跳转到:cond_2,我们观察到,如果跳转的话,就会越过成功提示的方法,我们不能让它跳,nop掉,下面一个跳转到:cond_1的判断也一并删除,保存,打包测试。
QQ截图20150808165811.png
嗯,提示成功,那么我们测试下付费用户的功能是否能够正常使用
QQ截图20150808165912.png
ok,付费主题可以使用,说明我们破解成功了,那是不是就结束了呢?当我们退出程序再进入的时候发现主题丢了,什么鬼?来到付费页面,发现授权按钮又可以点击了,之前我们注意到,授权成功后,按钮就会呈现灰色不可点击的状态,那说明了什么,这个程序有重启验证!



0x3 突破重启验证
之前我们在尝试破解时,在成功函数中看到了这段信息,
QQ截图20150808170236.png
如果是付费状态,“isDefaultTheme”的值是v1,在方法首可以看到v1定义的是1,这里是个putBoolean,即通过Sharepreferences.editor写入了true,那么我们通过分析发现,我们是在重启后丢失授权信息的,那验证方法肯定在第一个显示的页面被调用,我们找到程序的主页面所在的类,来到HelloWorldActivity.smali下,我们尝试搜索“isDefaultTheme”,结果搜到好几个
QQ截图20150808171319.png
[Java] 纯文本查看 复制代码
.method static synthetic d(Llongbin/helloworld/HelloWorldActivity;)V
    .locals 6

    .prologue
    .line 3763
    iget-object v0, p0, Llongbin/helloworld/HelloWorldActivity;->cc:Landroid/content/SharedPreferences;

    const-string v1, "alipay_appid"

    const-string v2, "89d43e35dd25de5d2ce9334f2624d6a61345893a"

    invoke-interface {v0, v1, v2}, Landroid/content/SharedPreferences;->getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;

    move-result-object v1

    const-string v0, ""

    :try_start_0
    iget-object v2, p0, Llongbin/helloworld/HelloWorldActivity;->cb:Landroid/content/SharedPreferences;

    const-string v3, "WWxoT2JnPT0="

    const-string v4, ""

    invoke-interface {v2, v3, v4}, Landroid/content/SharedPreferences;->getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;

    move-result-object v2

    invoke-static {v2}, Llongbin/helloworld/hm;->b(Ljava/lang/String;)Ljava/lang/String;
    :try_end_0
    .catch Ljava/io/UnsupportedEncodingException; {:try_start_0 .. :try_end_0} :catch_0

    move-result-object v0

    :goto_0
    iget-object v2, p0, Llongbin/helloworld/HelloWorldActivity;->cb:Landroid/content/SharedPreferences;

    const-string v3, "font_size"

    const-string v4, "28"

    invoke-interface {v2, v3, v4}, Landroid/content/SharedPreferences;->getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;

    move-result-object v2

    iget-object v3, p0, Llongbin/helloworld/HelloWorldActivity;->cb:Landroid/content/SharedPreferences;

    const-string v4, "isDefaultTheme"

    const/4 v5, 0x0

    invoke-interface {v3, v4, v5}, Landroid/content/SharedPreferences;->getBoolean(Ljava/lang/String;Z)Z

    move-result v3

    invoke-static {v0}, Llongbin/helloworld/m;->f(Ljava/lang/String;)Ljava/lang/String;

    move-result-object v0

    invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z

    move-result v0

    if-eqz v0, :cond_0

    const-string v0, "24"

    invoke-virtual {v2, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z

    move-result v0

    if-eqz v0, :cond_0

    if-eqz v3, :cond_0

    new-instance v1, Llongbin/helloworld/gb;

    const v0, 0x7f090027

    sget-object v2, Llongbin/helloworld/n;->h:[I

    invoke-direct {v1, p0, v0, v2}, Llongbin/helloworld/gb;-><init>(Llongbin/helloworld/HelloWorldActivity;I[I)V

    sget-object v0, Llongbin/helloworld/n;->h:[I

    :goto_1
    new-instance v2, Landroid/app/AlertDialog$Builder;

    invoke-direct {v2, p0}, Landroid/app/AlertDialog$Builder;-><init>(Landroid/content/Context;)V

    new-instance v3, Llongbin/helloworld/cg;

    invoke-direct {v3, p0, v0}, Llongbin/helloworld/cg;-><init>(Llongbin/helloworld/HelloWorldActivity;[I)V

    invoke-virtual {v2, v1, v3}, Landroid/app/AlertDialog$Builder;->setAdapter(Landroid/widget/ListAdapter;Landroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;

    new-instance v0, Llongbin/helloworld/ch;

    invoke-direct {v0, p0}, Llongbin/helloworld/ch;-><init>(Llongbin/helloworld/HelloWorldActivity;)V

    invoke-virtual {v2, v0}, Landroid/app/AlertDialog$Builder;->setOnCancelListener(Landroid/content/DialogInterface$OnCancelListener;)Landroid/app/AlertDialog$Builder;

    invoke-virtual {v2}, Landroid/app/AlertDialog$Builder;->show()Landroid/app/AlertDialog;

    return-void

    :cond_0
    new-instance v1, Llongbin/helloworld/gb;

    const v0, 0x7f090026

    sget-object v2, Llongbin/helloworld/n;->g:[I

    invoke-direct {v1, p0, v0, v2}, Llongbin/helloworld/gb;-><init>(Llongbin/helloworld/HelloWorldActivity;I[I)V

    sget-object v0, Llongbin/helloworld/n;->g:[I

    goto :goto_1

    :catch_0
    move-exception v2

    goto :goto_0
.end method

比如这样的,通过观察,我们发现这些方法都只是调用了isDefaultTheme的布尔值,也就是说,这些并不会改变我们的授权状态,我们需要找到的是会更改布尔值的函数,即putBoolean,我们逐个排查,经过筛选后,我们找到了唯一一个
QQ截图20150808171841.png
那其中的v2就是它经过判断后重新赋予的值,我们找到这个值是什么,向上翻
QQ截图20150808172023.png
我们看到此处定义的是0,即false,那找到病因了,我们就该下药了

A.方法1:
QQ截图20150808172139.png
在传值之前更改v2的值,考虑到不影响整个程序的运行,不建议修改方法开始时的v2值,我们仅在此处修改

B.方法2:
不让程序进行赋值,即跳过这个判断流程,我们找到这个函数体的标签,即:cond_3,根据尝试破解中的手段,跳过这个标签即可。
QQ截图20150808172438.png
我们只找到一个,nop掉,为保证程序一定会能跳过此处,建议是nop掉if-nez v3的同时,将下方的if-eqz v0,改成goto :cond_4,这样程序就一定不会走:cond_3这个分支,isDefaultTheme的布尔值就一定会真,好,打包测试
QQ截图20150808172821.png
我们退出后重开程序,依然是灰色状态,说明我们真正授权成功拉!




作业:
CrackMe.zip (295.05 KB, 下载次数: 4543)
非常简单的一个例子,相信你在学完前面无课后这对你来说根本不是问题,欢迎发帖进行分析,有加分哦



免费评分

参与人数 42威望 +1 吾爱币 +17 热心值 +40 收起 理由
QiuChenly + 1 + 1 用心讨论,共获提升!
black90 + 1 + 1 谢谢@Thanks!
张二黑 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
猫KsWeb点Cc + 1 + 1 我很赞同!
chengling86 + 1 很详细,赞啊
cs433216 + 1 + 1 请问为什么我搜索0x7f080100显示的和你的不一样,只有第一个文件,没有后两.
quan脑残 + 1 + 1 谢谢@Thanks!
Lminexy + 1 + 1 我很赞同!
极大的石头 + 1 + 1 发现最后一句话有错别字
hodir52pj + 1 用心讨论,共获提升!
xixw + 1 + 1 谢谢@Thanks!
jasoon + 1 + 1 谢谢@Thanks!
Chen1997 + 1 + 1 用心讨论,共获提升!
rh1120 + 1 + 1 谢谢@Thanks!
xueye + 1 + 1 谢谢@Thanks!
hehe408 + 1 + 1 谢谢@Thanks!
isgoodtime + 1 + 1 谢谢@Thanks!
siuhoapdou + 1 谢谢@Thanks!
wahejiahua + 1 谢谢@Thanks!
ljs999 + 1 持风的剪,估计下载的是破解版的,建议作者放上原apk,谢谢
Czkusers + 1 我很赞同!
仙峰涯 + 1 我很赞同!
持风的剪 + 1 请问为什么我搜索0x7f080100显示的和你的不一样,只有第一个文件,没有后两.
独行风云 + 1 楼主您辛苦了,感谢热心分享。
开天辟地 + 1 谢谢@Thanks!
威少xwy + 1 我很赞同!
lakshmi + 1 谢谢@Thanks!
hack_koko + 1 受教了1
龙腾飞2016 + 1 谢谢@Thanks!
悟空不悟 + 1 我很赞同!
ak-47 + 1 谢谢@Thanks!
黑桃J + 1 必须赞一个啊,学到不少知识
﹏惗 + 1 谢谢@Thanks!
流云 + 1 我很赞同!
wanttobeno + 1 简单明了!
aoeevy + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.
469164323 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩.
亿联网络 + 1 我很赞同!
caleb110 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.
lies2014 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.
Ericky + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.
青春 + 1 我很赞同!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

xiaosenmokai 发表于 2016-7-1 22:58
为何我第二步只搜出来这一个,另外两个文件没有,求大神们指教
1.png
2.png
Super817 发表于 2015-8-9 12:44
01.png
02.png
03.png
04.png
05.png


螢幕截圖 2015-08-09 12.19.44.png



判断 v0 大於 v2 (30),跳转至 :cond_0


往上查看 v0,看到 move-result v0


直接给予 v0 数值 100



打包测试~~~{:1_916:}


笑对VS人生 发表于 2016-6-30 08:52 来自手机
的确简单,搜索 积分够  
修改前面if ge为if le直接成功!
PJ头狼 发表于 2016-8-15 21:06
我是通过修改switch的分支跳转,实现跳过弹对话框的
将一开始的:
:pswitch_data_0
    .packed-switch 0x7f090050
        :pswitch_0
        :pswitch_1
    .end packed-switch
将两个分支进行了调换,改为
:pswitch_data_0
    .packed-switch 0x7f090050
        :pswitch_1
        :pswitch_0
    .end packed-switch
将原本进入pswitch_0的变为进入到pswitch_1
leftshine 发表于 2016-8-3 12:01
直接把 activity_main.xml 改成这样
[XML] 纯文本查看 复制代码
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:layout_width="fill_parent" android:layout_height="fill_parent"
  xmlns:android="http://schemas.android.com/apk/res/android">
    <TextView android:textSize="30.0sp" android:id="@id/user" android:visibility="invisible" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="普通用户" android:layout_centerInParent="true" />
    <Button android:id="@id/register" android:visibility="invisible" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="点我升级vip" android:layout_below="@id/user" android:layout_centerHorizontal="true" />
    <Button android:id="@id/vip"  android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="vip功能" android:layout_below="@id/register" android:layout_centerHorizontal="true" />
    <TextView android:textSize="25.0sp" android:textColor="#fff1770f" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="by 52pojie.cn" android:layout_alignParentRight="true" android:layout_alignParentBottom="true" />
</RelativeLayout>
1.png
2.png
这样搞定了……
gxcz 发表于 2015-8-8 21:35
零基础的人看的一头雾水,要消化前面的知识蛮难的
知足zz 发表于 2015-8-8 19:10
谢谢谢谢了
watermoon 发表于 2016-3-23 14:10
本帖最后由 watermoon 于 2016-3-23 14:11 编辑

不熟 android 开发,说下我 CrackMe 的方式(感觉有运气成分,望大神指点下):
1. 搜 "点我升级vip",发现是在 activity_main.xml 里面的一个 button,不知道怎么定位
2. 又搜了 "vip",看到很多,然后找到一个 ”激活vip"的地方,代码如下:
3. 很幸运地在下面两行看到比较 "if-ge v0, v2, :cond_0",这里就是跳到激活的地方,估计 v0 就是你的积分,所以改成 "if-ge v2, v2, :cond_0",然后直接保存编译
未命名.png
war962931120 发表于 2015-9-15 19:17
.method public onClick(Landroid/view/View;)V
    .locals 4

    invoke-virtual {p1}, Landroid/view/View;->getId()I

    move-result v0

    packed-switch v0, :pswitch_data_0

    :goto_0
    return-void

    :pswitch_0
    invoke-direct {p0}, Lcom/example/crackme/MainActivity;->a()I

    move-result v0

    new-instance v1, Landroid/app/AlertDialog$Builder;

    invoke-direct {v1, p0}, Landroid/app/AlertDialog$Builder;-><init>(Landroid/content/Context;)V

    const-string v2, "\u6fc0\u6d3bvip"

    invoke-virtual {v1, v2}, Landroid/app/AlertDialog$Builder;->setTitle(Ljava/lang/CharSequence;)Landroid/app/AlertDialog$Builder;

    const/16 v2, 0x1e

    if-ge v0, v2, :cond_0

    new-instance v2, Ljava/lang/StringBuilder;

    const-string v3, "\u76ee\u524d\u4f60\u62e5\u6709\u79ef\u5206\uff1a"

    invoke-direct {v2, v3}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V

    invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;

    move-result-object v0

    const-string v2, ",\u79ef\u5206\u591f\u54e6\uff0c\u8d76\u5feb\u53bb\u8d5a\u79ef\u5206\u628a,\u7136\u800c\u5e76\u6ca1\u6709\u5730\u65b9\u53ef\u4ee5\u8d5a\u79ef\u5206\u3002\u3002"

    invoke-virtual {v0, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v0

    invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v0

    invoke-virtual {v1, v0}, Landroid/app/AlertDialog$Builder;->setMessage(Ljava/lang/CharSequence;)Landroid/app/AlertDialog$Builder;

    const-string v0, "\u77e5\u9053\u9e1f"

    new-instance v2, Lcom/example/crackme/a;

    invoke-direct {v2, p0}, Lcom/example/crackme/a;-><init>(Lcom/example/crackme/MainActivity;)V

    invoke-virtual {v1, v0, v2}, Landroid/app/AlertDialog$Builder;->setNegativeButton(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;

    :goto_1
    invoke-virtual {v1}, Landroid/app/AlertDialog$Builder;->show()Landroid/app/AlertDialog;

    goto :goto_0

    :cond_0
    const-string v0, "\u5347\u7ea7vip\u9700\u8981\u6d88\u801730\u70b9\u79ef\u5206\u54e6\uff0c\u73b0\u5728\u5347\u7ea7\u5417\uff1f"

    invoke-virtual {v1, v0}, Landroid/app/AlertDialog$Builder;->setMessage(Ljava/lang/CharSequence;)Landroid/app/AlertDialog$Builder;

    const-string v0, "\u5347\u7ea7"

    new-instance v2, Lcom/example/crackme/b;

    invoke-direct {v2, p0}, Lcom/example/crackme/b;-><init>(Lcom/example/crackme/MainActivity;)V

    invoke-virtual {v1, v0, v2}, Landroid/app/AlertDialog$Builder;->setPositiveButton(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;

    const-string v0, "\u9000\u51fa"

    new-instance v2, Lcom/example/crackme/c;

    invoke-direct {v2, p0}, Lcom/example/crackme/c;-><init>(Lcom/example/crackme/MainActivity;)V

    invoke-virtual {v1, v0, v2}, Landroid/app/AlertDialog$Builder;->setNegativeButton(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;

    goto :goto_1

    :pswitch_1
    new-instance v0, Landroid/content/Intent;

    const-class v1, Lcom/example/crackme/VipFunction;

    invoke-direct {v0, p0, v1}, Landroid/content/Intent;-><init>(Landroid/content/Context;Ljava/lang/Class;)V

    invoke-virtual {p0, v0}, Lcom/example/crackme/MainActivity;->startActivity(Landroid/content/Intent;)V

    goto :goto_0

    nop

    :pswitch_data_0
    .packed-switch 0x7f090050
        :pswitch_1
        :pswitch_1
    .end packed-switch
.end method


在onClick 里面有个getId的方法 和一个switch  case1 是vip的
所以把

  :pswitch_data_0
    .packed-switch 0x7f090050
        :pswitch_1
        :pswitch_1
    .end packed-switch
.end method

全改为pswitch_1  


或者
在上面
   :pswitch_0
    invoke-direct {p0}, Lcom/example/crackme/MainActivity;->a()I
改为
:pswitch_0
        goto :pswitch_1
    invoke-direct {p0}, Lcom/example/crackme/MainActivity;->a()I

也可以
zt_melody 发表于 2016-6-18 17:17
查看activity_main.xml
发现vip功能按钮是invisible,查找@id/vip发现是0x7f090051,继续查找0x7f090051的代码,
[C++] 纯文本查看 复制代码
const v0, 0x7f090051

    invoke-virtual {p0, v0}, Lcom/example/crackme/MainActivity;->findViewById(I)Landroid/view/View;

    move-result-object v0

    check-cast v0, Landroid/widget/Button;

    iput-object v0, p0, Lcom/example/crackme/MainActivity;->c:Landroid/widget/Button;

    iget-object v0, p0, Lcom/example/crackme/MainActivity;->b:Landroid/widget/Button;

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

    iget-object v0, p0, Lcom/example/crackme/MainActivity;->c:Landroid/widget/Button;

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

    const-string v0, "data"

    invoke-virtual {p0, v0, v3}, Lcom/example/crackme/MainActivity;->getSharedPreferences(Ljava/lang/String;I)Landroid/content/SharedPreferences;

    move-result-object v0

    const-string v1, "points"

    invoke-interface {v0, v1, v3}, Landroid/content/SharedPreferences;->getInt(Ljava/lang/String;I)I

    move-result v0

    if-lez v0, :cond_1

    iget-object v1, p0, Lcom/example/crackme/MainActivity;->a:Landroid/widget/TextView;

    const-string v2, "\u666e\u901a\u7528\u6237" //普通用户

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

    :cond_1
    if-gez v0, :cond_2

    iget-object v0, p0, Lcom/example/crackme/MainActivity;->c:Landroid/widget/Button;

    invoke-virtual {v0, v3}, Landroid/widget/Button;->setVisibility(I)V

    iget-object v0, p0, Lcom/example/crackme/MainActivity;->a:Landroid/widget/TextView;

    const-string v1, "vip\u7528\u6237" //VIP用户

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

    iget-object v0, p0, Lcom/example/crackme/MainActivity;->b:Landroid/widget/Button;

    const/4 v1, 0x4

    invoke-virtual {v0, v1}, Landroid/widget/Button;->setVisibility(I)V

    :cond_2
    return-void


继续往下看,发现普通用户和VIP用户的条件判断: if-lez v0, :cond_1,
继续往下 :cond_1
   if-gez v0, :cond_2发现v0>0的话会跳转至return-void

所以删掉 if-gez v0, :cond_2和 :cond_2标签,重新打包签名即可。
应该还可以通过修改积分值,没试了。




免费评分

参与人数 1热心值 +1 收起 理由
wnagzihxain + 1 这个分析的可以

查看全部评分

破心 发表于 2015-8-8 17:47
前排围观,留个位置。
kingtiger 发表于 2015-8-8 17:48
进来学习下,谢谢楼主好教程
Norton 发表于 2015-8-8 18:14
楼主给力,感谢楼主
密码设定太麻烦 发表于 2015-8-8 19:18
哇呀呀,好文章。感谢楼主的无私奉献,抓紧时间复制下来以防万一。赞美楼主
轴心一一 发表于 2015-8-8 19:51 来自手机
回去试试……
lies2014 发表于 2015-8-8 21:13
进入实战了,这些才是最实在的!
caleb110 发表于 2015-8-8 21:46
找个时间练一下!多谢大牛!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-19 16:01

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表