【新手教程】安卓逆向之时间赋值 时间戳修改 会员vip时间任意修改 时间转换

查看 149|回复 11
作者:芽衣   
不适合加固、混淆的app,对于新手来说难度过高
安卓时间修改对于破解一些本地验证的app很好用,在线的没辙。一般来说大公司的app是在线验证的,因为这个貌似很消耗服务器资源,比如pixiv,有钱就是为所欲为,当然你也是


00.png (4.8 KB, 下载次数: 2)
下载附件
2020-7-13 10:55 上传

有不少软件有年费会员或者终身会员什么的,可以对关键地方进行赋值破解。
本帖主要说明时间在smali里面的表达方法

找到老巢

反编译后一般搜索的方法名关键字有vip、isvip、endtime、starttime、getvip、userinfo、viptime等;字符串关键字有到期、剩余、开通、续费、isvip、非会员等,他也有可能加短杠【_】混在里面。最常见的是找res字符串的ID,这个用的比较多。具体怎么找,这个每个app逻辑都不一样,而且大多需要跳转,而且如果不熟悉英文……
找到vip计算时间的老巢之后,接下来就是赋值了。
进行赋值破解

在线时间戳转换:http://www.beijing-time.org/shijianchuo/
案例:https://www.52pojie.cn/thread-1218307-1-1.html、https://www.52pojie.cn/thread-1211527-1-1.html、https://www.52pojie.cn/thread-1193093-1-1.html
"

对某一个方法的时间赋值,比如【const-wide v0, 0x3bb2b0c6018L】,会员到期时间就是2099年12月31日。那么3bb2b0c6018怎么来的呢?也就是(2099年12月31日-1970年1月1日)×365天×24小时×60分钟×60秒×1000毫秒,转换成16进制就大概是那个数了。那个单位L是long的意思,数值类型。
当然数值不是越大越好,如果涉及到运算就不能随意赋值了。


1.png (120.84 KB, 下载次数: 4)
下载附件
2020-7-13 11:54 上传

比如这款彩云天气app,对const-wide v6, 0x11840ad80L这个数值改大以后,本来是送2个月会员的,现在变成了20多天到期,而且重新登录也是20多天。改小时间越来越长,最终变成永久会员。如果把下面的判断if-ltz v5, :cond_1删掉他也是永久会员。【cmp-long vx, vy, vz。比较vy和vz的long值并在vx存入int型返回值(比较操作,如果第一个操作数大于第二个操作数返回正值;如果两者相等,返回0;如果第一个操作数小于第二个操作数,返回负值。)】
再比如https://www.52pojie.cn/thread-1218307-1-1.html
[Asm] 纯文本查看 复制代码const-wide/16 v1,0x3e8
mul-long p0, p0, v1
计算的是中间这个p0的值,v1是乘数。原本v1是1000,改大以后倍率高了到期时间就会变得很恐怖。一般获取时间后会有计算代码,常用于数值转换。比如分钟转换小时。
获取手机系统时间固定smali代码(1970-01-01开始):
[ol]
  • invoke-static {}, Ljava/lang/System;->currentTimeMillis()J
  • move-result-wide v×[/ol]复制代码
    以后看见这行代码就知道他在获取系统时间了。然后下面一般会紧跟着计算代码,比如cmp-long、mul-long/2addr、div-int/2addr等,修改寄存器的数值对结果影响很大。
    如果需要对时间进行运算,比如加减乘除,需要先对v(×+1)进行赋值,然后下一行再加入计算代码。
    举例:系统时间加上1秒
    [ol]
  • .method public static wuaipojie()J
  •     .registers 4
  •     .prologue
  •     .line 11
  •     invoke-static {}, Ljava/lang/System;->currentTimeMillis()J
  •     move-result-wide v0【v0储存系统的时间】
  •     const-wide/16 v2, 0x3e8【对v2进行赋值,10进制为1000】
  •     add-long/2addr v0, v2【v0=v0+v2】
  •     return-wide v0【该方法返回v0的计算结果】
  • .end method[/ol]复制代码
    Java代码就是:
    [Java] 纯文本查看 复制代码public static long wuaipojie()
        {
            return System.currentTimeMillis() + 1000L;
        }
    甚至可以写个又有判断又有乘除的代码:
    [ol]
  • .method public static wuaipojie()J
  •     .registers 4
  •     .prologue
  •     .line 11
  •     invoke-static {}, Ljava/lang/System;->currentTimeMillis()J
  •     move-result-wide v0
  •     const-wide/32 v2, 0x60bbf54e
  •     cmp-long v0, v0, v2
  •     if-gez v0, :cond_10
  •     .line 12
  •     invoke-static {}, Ljava/lang/System;->currentTimeMillis()J
  •     move-result-wide v0
  •     .line 14
  •     :goto_f
  •     return-wide v0
  •     :cond_10
  •     invoke-static {}, Ljava/lang/System;->currentTimeMillis()J
  •     move-result-wide v0
  •     const-wide/16 v2, 0x34
  •     add-long/2addr v0, v2
  •     const-wide/16 v2, 0x2
  •     xor-long/2addr v0, v2
  •     goto :goto_f
  • .end method[/ol]复制代码

    时间, 赋值

  • 芽衣
    OP
      


    mitchzh 发表于 2020-7-27 09:10
    请问如何解读这句代码,add-long/2addr v0, v2【v0=v0+v2】

    这是smali语法。加法表示方法。
    深入了解计算你得看书……
    ╰留个小板寸回   

    对某一个方法的时间赋值,比如【const-wide v0, 0x3bb2b0c6018L】,会员到期时间就是2099年12月31日。那么3bb2b0c6018怎么来的呢?也就是(2099年12月31日-1970年1月1日)×365天×24小时×60分钟×60秒×1000毫秒,转换成16进制就大概是那个数了。那个单位L是long的意思,数值类型。  我按照这个公式算出来不对啊   
    尼阿爸   

    学习一下
    sunv52pojie   

    感谢大神指点 辛苦!!
    刀大喵   

    很实用的知识
    第一品霄   

    学习一下了
    小枫z   

    学习一下
    富春山居   

    学习了!!
    87901434   

    谢谢。希望出一个合集让我们学习。
    您需要登录后才可以回帖 登录 | 立即注册