芽衣 发表于 2020-7-20 10:28

【新手教程】.field public ×赋值 赋值规则 实战必学教程 构建函数

本帖最后由 417788939 于 2020-7-21 11:33 编辑

软件以知音漫客v5.6.7为例,现在无壳了。比较简单,不加阅读权限了。知音漫客完整版教程:https://www.52pojie.cn/thread-1156372-1-1.html





https://static.52pojie.cn/static/image/hrline/4.gif
之前我发的解锁漫画教程是批量赋值的,用正则表达式,对于一些人来说正则看得眼花缭乱,非常的不便。能不能直接用0x1或者0x0来代替呢?答案是可以的。





如上图,解锁漫画关键字是isRecharge:Z,搜一下非常多,而且单独赋值一个地方没有用。顺着路径打开ChapterListItemBean这个文件看看是什么情况。




全文代码如下:
.class public Lcn/zymk/comic/model/ChapterListItemBean;
.super Ljava/lang/Object;
.source "ChapterListItemBean.java"

# interfaces
.implements Ljava/io/Serializable;


# annotations
.annotation system Ldalvik/annotation/MemberClasses;
    value = {
      Lcn/zymk/comic/model/ChapterListItemBean$ChapterImageBean;
    }
.end annotation


# static fields
.field private static final serialVersionUID:J = -0x1dcf11e7771e8b5fL


# instance fields
.field public appVersion:Ljava/lang/String;

.field public chapter_addr:Ljava/lang/String;

.field public chapter_id:Ljava/lang/String;

.field public chapter_image:Lcn/zymk/comic/model/ChapterListItemBean$ChapterImageBean;

.field public chapter_name:Ljava/lang/String;

.field public chapter_title:Ljava/lang/String;【模板】

.field public chapter_type:I

.field public create_time:J

.field public downFolder:Ljava/lang/String;

.field public download_price:I

.field public end_var:I

.field public isDown:Z

.field public isRead:Z

.field public isRecharge:Z【想办法对这个赋值】

.field public paths:Ljava/lang/String;

.field public position:I

.field public price:I

.field public source_url:Ljava/lang/String;

.field public start_var:I

.field public tempPosition:I

.field public urls:Ljava/lang/String;

.field public webview:Ljava/lang/String;


# direct methods
.method public constructor <init>()V【反射大法】
    .locals 1

    .line 1
    invoke-direct {p0}, Ljava/lang/Object;-><init>()V

    const-string v0, ""【v0寄存器里面包含字符串】

    .line 2
    iput-object v0, p0, Lcn/zymk/comic/model/ChapterListItemBean;->chapter_title:Ljava/lang/String;【参考上方模板,输入(iput-object)的类型是字符串(String)】

    return-void
.end methodsmali代码里面有【String】的,应该知道这是字符串类型,不能赋值0或者1,而是赋值const-string vx, "",否则可能会导致崩溃。一般来说1代表真、对、是、true,而0代表假、错、否、false。比如一些app反编译后有isvip方法,赋值1意思就是该用户属于vip会员,0就是该用户不属于会员。知音漫客破解免付费阅读需要对.field public isRecharge:Z赋值1,但是可不能直接.field public isRecharge:Z=1或者.field public isRecharge:Z=true,这个是无法运行的。




https://static.52pojie.cn/static/image/hrline/4.gif


构造函数基本框架如下,可以参照目标文件的写法。
.method public constructor <init>()V
   

    return-void
.end method


所以对isRecharge:Z赋值,写法参考如下:

.method public constructor <init>()V
    .registers 4【注意这个,少了可能闪退异常,具体自行测试】

    .line 1
    invoke-direct {p0}, Ljava/lang/Object;-><init>()V【invoke-direct:调用】

    const-string v0, ""

    .line 2
    iput-object v0, p0, Lcn/zymk/comic/model/ChapterListItemBean;->chapter_title:Ljava/lang/String;

   #以下是在原基础上添加的代码

    const/4 v2, 0x1【先对某个寄存器赋值,建议v(x+2),以后这个就是老巢】

    iput-boolean v2, p0, Lcn/zymk/comic/model/ChapterListItemBean;->isRecharge:Z【iput-boolean:把v2的值置入isRecharge这个成员变量中。p0照搬上面调用,然后紧跟文件路径,不能用点,只能斜杠】

    return-void
.end method然后回编译测试一下效果。可以发现漫画的锁头已经全部打开了{:17_1073:}
补充一下registers怎么数,不知道的情况下改大绝对不会错。比如一个方法里面有v1和v5,他是从v1~v5,有个跨度的,所以registers是5,不是2。





成员变量格式是:

   .field public/private varName:<类型>。

对于不同的成员变量也有不同的指令。

一般来说,

  获取的指令有:iget、sget、iget-boolean、sget-boolean、iget-object、sget-object等。

  操作的指令有:iput、sput、iput-boolean、sput-boolean、iput-object、sput-object等。

没有“-object”后缀的表示操作的成员变量对象是基本数据类型,带“-object”表示操作的成员变量是对象类型,特别地,boolean类型则使用带“-boolean”的指令操作。
https://static.52pojie.cn/static/image/hrline/4.gif
同理免登陆开启vip,根据以上规则,代码建议使用iput。





举例:
iput v2, p0, Lcn/zymk/comic/model/UserBean;->isvip:I虽然没有点亮图标但是功能可以用的,因为现在更新了以后有些不同。




https://static.52pojie.cn/static/image/hrline/4.gif

这个知音漫客app更新还挺快的,每次都说修复bug,也不知道是什么问题。但是我逆向发现广告商变多了,更新内容应该是新增广告植入吧……{:17_1077:} 比如新增了快手开屏广告。
实质性的改变并没有,比如蛋疼的移动网络提示,每次都会弹出,而且无法关闭。以前还有网络缓慢提示,现在有不再提示按钮了。

涛之雨 发表于 2020-7-21 06:33

本帖最后由 涛之雨 于 2020-7-21 06:38 编辑

关于注册寄存器,有条件的可以看一下谷歌官方的权威说明
https://code.google.com/p/smali/wiki/Registers
没有条件可以看一下别人转载的,比如
Smali语法:Registers(寄存器)
注:条件指上网方式和英语阅读水平。
当然如果有上网条件也可以使用在线翻译

正己 发表于 2020-7-20 11:59

偶尔.c 发表于 2020-7-20 11:07
楼主能说说为什么寄存器是4吗

我先替他回答,这个方法内有三个寄存器,分别是v0,p0,v2,写register 3也是可以的,可以多写,比如,写但是不能少于本事身寄存器的数量,不然就会报错,也不知道说得对不对

芽衣 发表于 2020-7-20 12:04

正己 发表于 2020-7-20 11:59
我先替他回答,这个方法内有三个寄存器,分别是v0,p0,v2,写register 3也是可以的,可以多写,比如,写 ...

是4个……最低了{:17_1072:}



v0~v2,这已经是3个了。我用的是v2不是v1。

丁大胜023 发表于 2020-7-20 10:51

楼主上午好!请问搞APP需要学习什么计算机语言?Java吗?

偶尔.c 发表于 2020-7-20 11:01

牛逼牛逼

偶尔.c 发表于 2020-7-20 11:07

楼主能说说为什么寄存器是4吗

az12az 发表于 2020-7-20 11:33

太高深了,不懂。

hkdg009 发表于 2020-7-20 11:54

支持下!!!!

芽衣 发表于 2020-7-20 12:02

偶尔.c 发表于 2020-7-20 11:07
楼主能说说为什么寄存器是4吗



低于4会导致异常,无法加载漫画。你数一下p和v{:17_1068:}

正己 发表于 2020-7-20 12:08

417788939 发表于 2020-7-20 12:04
是4个……最低了




啊哈哈哈哈,尴尬了,不过不要紧,学到了{:17_1068:}
页: [1] 2 3
查看完整版本: 【新手教程】.field public ×赋值 赋值规则 实战必学教程 构建函数