逆向教程->软件积分逆向分析

原软件下载地址:http://pan.baidu.com/s/1pJ7Gs47

软件介绍:

Easy Touch是一个像iPhone的AssistiveTouch的按钮, 它漂浮在你的手机屏幕(在任何APP之上), 你可以将它移动到任何地方.

功能
★ 快速设置(如:打开Wifi,调节屏幕亮度,手机网路开关等).
★ 打开你常用的应用.
★ 回到主屏幕
★ 锁屏
★ 应用列表与搜索(加入中文拼音快速搜索,如搜索"dx"则可快速找到“简讯”)
★ 最近任务切换(双击Touch按钮)
★ 自定义设置

开关包括:
- 屏幕亮度
- 静音模式
- 蓝牙
- WiFi
- GPS
- APN(2G/3G/移动网路)
- 自动旋转
- 闪关灯
- 飞行模式

看完介绍下载软件,安装完发现还不错,唯一的缺点就是需要积分,本人最讨厌积分的东西了。所以就准备把他Aruba掉。

-----------------------------------------------↑前言

工具:apkide、bluestacks

首先下载软件,我明明的是easytouch.apk

用APKIDE反编译apk


然后编译apk,打开APK进行体验。点击app-主题,发现的有一部分主题是需要收费的。那我们随便点击一个看看


点击以后发现提示“您的金币不足”,我们将这个提示进入IDE搜索,搜索到唯一一个数值:


我们点进入以后发现了这一行信息:

    <string name="toast_error_coin_not_enough">您的金币不足</string>

这是一个针对弹窗的定义信息,那我们搜索他的string name


搜索后发现出现了好多的结果,经过仔细查看后除了第一个结果是public以外其他都是string,也就是我们之前搜索到的信息以不用的语言形式表达出来而已。

我们点开第一个结果:

    <public type="string" name="toast_error_coin_not_enough" id="0x7f0b0168" />

得到了这个对应的public定义,我们搜索岛:0x7f0b0168

找到了两个结果:


点进去line229: const v2, 0x7f0b0168{对应的10进制代码为:2131427688},查看java代码:


我们看到2131427688是出现在-1-2判断之外的,-2指的是金币获取失败,-1指的是金币获取中。

思路来了,一般情况下,积分软件兑换东西,是走一下几个流程的:

获取积分-取商品积分数-判断积分是否大于-{大于}购买-{小于}购买错误提示-结束

那么我们只需要将【判断积分是否大于】这一个部分的判断改为强制跳转到大于即可。

通过smali代码我们可以找个这个判断

-------------------------------------------------↓

 :pswitch_0
    iget-object v1, p0, Lcom/shere/easytouch/ee;->b:Lcom/shere/easytouch/ed;

    iget-object v1, v1, Lcom/shere/easytouch/ed;->a:Lcom/shere/easytouch/ThemeShopFragment;

    invoke-static {v1}, Lcom/shere/easytouch/ThemeShopFragment;->d(Lcom/shere/easytouch/ThemeShopFragment;)I

    move-result v1

    iget v2, v0, Lcom/shere/assistivetouch/b/a;->l:I

    if-lt v1, v2, :cond_0   //判断v1小于v2为真就跳转到cond_0,即积分不够则跳


····

--------------------------------------------------↑

我们修改时候将这个判断删掉就好了。

保存够安装查看效果。

发现点击后还是这个效果:


是我们改的不对?NO,我们该对了,但是我们没有改全!别忘了我们一共搜出了两个结果,我们才改了第一个。下面我们进入第二个,并查看java代码:


我们发现关键跟上一个差不错,那就再次修改吧。


根据图片中的方框,我们需要修改三个跳转才能够到达下载皮肤的地步!

首先最大的判断:if-ge v1, v4, :cond_0  //v1大于等于v4,就跳转到cond_0

修改为:goto :cond_0

接着第二个if ((com.shere.assistivetouch.h.a.a != null) && (com.shere.assistivetouch.h.a.a.size() > 0))

根据这个话找到该判断:    :cond_0
    sget-object v1, Lcom/shere/assistivetouch/h/a;->a:Ljava/util/HashMap;
    if-eqz v1, :cond_2  //对应com.shere.assistivetouch.h.a.a != null
    sget-object v1, Lcom/shere/assistivetouch/h/a;->a:Ljava/util/HashMap;
    invoke-virtual {v1}, Ljava/util/HashMap;->size()I
    move-result v1
    if-lez v1, :cond_2  //对应com.shere.assistivetouch.h.a.a.size() > 0

在java中0x0表示为false或者null或者0,这里表示的是null

修改:将if-eqz v1, :cond_2 改为goto :cond_2

强制进入cond_2以后我们查看代码:

    :cond_2
    if-eqz v3, :cond_3 //对应java代码中的 if (i != 0),如果v3=0就跳到cond_3,反之不跳。

    iget-object v1, p0, Lcom/shere/easytouch/ui350/au;->b:Lcom/shere/easytouch/ui350/at;
    iget-object v1, v1, Lcom/shere/easytouch/ui350/at;->a:Lcom/shere/easytouch/ui350/ThemeShopActivity;
···

goto/16 :goto_1

-----------------------------------

修改:将if-eqz v3, :cond_3删掉即可正常下载皮肤。

编译打包查看效果。


已经可以下载了呢,好开心的说,去积分就这么简单。

最后说一下中心思路:获取积分-取商品积分数-判断积分是否大于-{大于}购买-{小于}购买错误提示-结束

修改判断积分是否大于才是关键!

                                                                                                              2.14.09.28 Sarkozy

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这是一段 C++ 代码,以下是每行的解释: - `if(NULL != vl)`:如果 `vl` 不为空指针,则执行下面的代码块。 - `{`:代码块的开始。 - `//reverse start;`:注释,表示下面的代码是开始逆向处理。 - `if(rphead && ::is_open_reverse)`:如果 `rphead` 不为空并且全局变量 `::is_open_reverse` 为真,则执行下面的代码块。 - `{`:代码块的开始。 - `rphead->CdrRaw.ncdrid = cdrgetid(rphead->lcoreid);`:将 `rphead->lcoreid` 作为参数调用函数 `cdrgetid` 获得新的 CDR ID (`ncdrid`),并将其赋值给 `rphead->CdrRaw.ncdrid`。 - `rphead->CdrRaw.tstart.tm_cycles = rphead->tstart.tm_cycles;`:将 `rphead->tstart.tm_cycles` 的值赋值给 `rphead->CdrRaw.tstart.tm_cycles`,即将逆向处理的开始时间设置为原始处理的开始时间。 - `rphead->CdrRaw.cdrstat = PACKET_BEGIN;`:将 `rphead->CdrRaw.cdrstat` 的值设置为 `PACKET_BEGIN`,表示逆向处理的 CDR 状态为开始。 - `rphead->btCurStaus = PACKET_BEGIN;`:将 `rphead->btCurStaus` 的值设置为 `PACKET_BEGIN`,表示逆向处理的当前状态为开始。 - `pubSendPkt((void*)rphead);`:调用函数 `pubSendPkt` 发送 `rphead`,即逆向处理的 CDR。 - `vl->SetReverse(rphead->CdrRaw.ncdrid, rphead->CdrRaw.tstart.tm_cycles);`:调用 `vl` 对象的 `SetReverse` 函数,将逆向处理的 CDR ID 和开始时间存储到 `vl` 对象中。 - `}`:代码块的结束。 - `return vl;`:返回 `vl` 对象。 总体来说,这段代码的作用是对一个 CDR 进行逆向处理,并将逆向处理的 CDR ID 和开始时间存储到一个对象中。其中 `rphead` 是一个指向 CDR 的指针,`vl` 是一个对象,`cdrgetid` 是一个函数,`pubSendPkt` 和 `SetReverse` 是两个函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值