ciker_li 发表于 2019-12-13 09:36

老菜鸟逆向某统计计算器

本帖最后由 ciker_li 于 2019-12-13 09:38 编辑

最近自学统计分析,在手机上随便下了一个统计计算器,开始感觉挺好用,没想到只能输入15以内数字,超过之后提示:“数据达到限制,免费版本你最多只能插入15个数值。购买专业版本可以插入无限个数值,此功能仅适用于专业版.你可以在Android市场和AndroidPit市场上买它.”
作为一个老宅男,怎么可能掏钱,只好捡起早已荒废多年的手艺,试试能不能pojie。
先拿出老工具,改之理,载入看看,还好没有加壳。
然后找提示string,“数据达到限制”



换到java编辑,根据string的name:limitFree,找到对应ID


在主函数里找到那个ID


可以看到这段函数主要就是判断是否超过15个字符,超了就弹出对话框,提示购买了


再回到smali编辑界面,找到那段函数,smali以前就没搞太明白,又赶紧复习了一下,简单能看懂了。

.method public onTextChanged(Ljava/lang/CharSequence;III)V
    .locals 11
    .param p1, "seq"    # Ljava/lang/CharSequence;
    .param p2, "start"    # I
    .param p3, "before"    # I
    .param p4, "count"    # I

    .prologue
    const/16 v10, 0xf       #这里设置数据长度限制,15个

    .line 279
    iget-object v8, p0, Lcom/cgollner/StatisticsCalculatorActivity;->dataInput:Landroid/widget/EditText;

    invoke-virtual {v8}, Landroid/widget/EditText;->getEditableText()Landroid/text/Editable;

    move-result-object v3

    .line 280
    .local v3, "editable1":Landroid/text/Editable;
    iget-object v8, p0, Lcom/cgollner/StatisticsCalculatorActivity;->dataInput2:Landroid/widget/EditText;

    invoke-virtual {v8}, Landroid/widget/EditText;->getEditableText()Landroid/text/Editable;

    move-result-object v4

    .line 281
    .local v4, "editable2":Landroid/text/Editable;
    invoke-direct {p0, v3}, Lcom/cgollner/StatisticsCalculatorActivity;->getValuesInput(Landroid/text/Editable;)Ljava/util/List;

    move-result-object v5

    .line 282
    .local v5, "list1":Ljava/util/List;, "Ljava/util/List<Ljava/lang/Double;>;"
    invoke-direct {p0, v4}, Lcom/cgollner/StatisticsCalculatorActivity;->getValuesInput(Landroid/text/Editable;)Ljava/util/List;

    move-result-object v6

    .line 284
    .local v6, "list2":Ljava/util/List;, "Ljava/util/List<Ljava/lang/Double;>;"
    if-nez v5, :cond_0

    sget-object v8, Lcom/cgollner/MyTabActivity;->statisticsCalculator:Lcom/cgollner/domain/StatisticsCalculatorFreqs;

    new-instance v9, Ljava/util/ArrayList;

    invoke-direct {v9}, Ljava/util/ArrayList;-><init>()V

    invoke-virtual {v8, v9}, Lcom/cgollner/domain/StatisticsCalculatorFreqs;->setListaD(Ljava/util/List;)V

    .line 285
    :cond_0
    if-nez v6, :cond_1

    sget-object v8, Lcom/cgollner/MyTabActivity;->statisticsCalculator2:Lcom/cgollner/domain/StatisticsCalculatorFreqs;

    new-instance v9, Ljava/util/ArrayList;

    invoke-direct {v9}, Ljava/util/ArrayList;-><init>()V

    invoke-virtual {v8, v9}, Lcom/cgollner/domain/StatisticsCalculatorFreqs;->setListaD(Ljava/util/List;)V

    .line 287
    :cond_1
    sget-object v8, Lcom/cgollner/MyTabActivity;->inputType:Lcom/cgollner/MyTabActivity$InputType;

    sget-object v9, Lcom/cgollner/MyTabActivity$InputType;->VALFREQ:Lcom/cgollner/MyTabActivity$InputType;

    if-ne v8, v9, :cond_3

    .line 288
    sget-object v8, Lcom/cgollner/MyTabActivity;->statisticsCalculator:Lcom/cgollner/domain/StatisticsCalculatorFreqs;

    invoke-virtual {v8, v5, v6}, Lcom/cgollner/domain/StatisticsCalculatorFreqs;->setListas(Ljava/util/List;Ljava/util/List;)V

    .line 289
    if-nez v5, :cond_2

    .line 290
    invoke-direct {p0}, Lcom/cgollner/StatisticsCalculatorActivity;->fillWithBlank()V

    .line 343
    :goto_0
    return-void

    .line 293
    :cond_2
    invoke-direct {p0}, Lcom/cgollner/StatisticsCalculatorActivity;->fillOutputs()V

    goto :goto_0

    .line 297
    :cond_3
    if-nez v5, :cond_4

    .line 298
    invoke-direct {p0}, Lcom/cgollner/StatisticsCalculatorActivity;->fillWithBlank()V

    .line 335
    :goto_1
    if-nez v6, :cond_7

    .line 336
    invoke-direct {p0}, Lcom/cgollner/StatisticsCalculatorActivity;->fillWithBlank2()V

    goto :goto_0

    .line 300
    :cond_4
    invoke-interface {v5}, Ljava/util/List;->size()I

    move-result v8      #从这开始 比较数据长度

    if-le v8, v10, :cond_5    #把它跳过

    .line 301
    :goto_2
    invoke-interface {v5}, Ljava/util/List;->size()I

    move-result v8    ##从这开始 比较数据长度

    if-gt v8, v10, :cond_6   #把它跳过

    .line 304
    iget-object v8, p0, Lcom/cgollner/StatisticsCalculatorActivity;->dataInput:Landroid/widget/EditText;

    iget-object v9, p0, Lcom/cgollner/StatisticsCalculatorActivity;->before:Ljava/lang/CharSequence;

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

    .line 305
    iget-object v8, p0, Lcom/cgollner/StatisticsCalculatorActivity;->dataInput:Landroid/widget/EditText;

    iget-object v9, p0, Lcom/cgollner/StatisticsCalculatorActivity;->dataInput:Landroid/widget/EditText;

    invoke-virtual {v9}, Landroid/widget/EditText;->getText()Landroid/text/Editable;

    move-result-object v9

    invoke-interface {v9}, Landroid/text/Editable;->length()I

    move-result v9

    invoke-virtual {v8, v9}, Landroid/widget/EditText;->setSelection(I)V

    .line 306
    new-instance v2, Landroid/app/Dialog;

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

    .line 308
    .local v2, "dialog1":Landroid/app/Dialog;
    const v8, 0x7f030001

    invoke-virtual {v2, v8}, Landroid/app/Dialog;->setContentView(I)V

    .line 309
    const v8, 0x7f07004e

    invoke-virtual {p0, v8}, Lcom/cgollner/StatisticsCalculatorActivity;->getString(I)Ljava/lang/String;

    move-result-object v8

    invoke-virtual {v2, v8}, Landroid/app/Dialog;->setTitle(Ljava/lang/CharSequence;)V

    .line 310
    const v8, 0x7f0a0006

    invoke-virtual {v2, v8}, Landroid/app/Dialog;->findViewById(I)Landroid/view/View;

    move-result-object v0

    check-cast v0, Landroid/widget/TextView;

    .line 311
    .local v0, "b":Landroid/widget/TextView;
    const v8, 0x7f07004f

    invoke-virtual {p0, v8}, Lcom/cgollner/StatisticsCalculatorActivity;->getString(I)Ljava/lang/String;

    move-result-object v8

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

    .line 313
    const/4 v8, 0x1

    invoke-virtual {v2, v8}, Landroid/app/Dialog;->setCancelable(Z)V

    .line 315
    const v8, 0x7f0a0007

    invoke-virtual {v2, v8}, Landroid/app/Dialog;->findViewById(I)Landroid/view/View;

    move-result-object v1

    check-cast v1, Landroid/widget/Button;

    .line 316
    .local v1, "buy":Landroid/widget/Button;
    new-instance v8, Lcom/cgollner/StatisticsCalculatorActivity$5;

    invoke-direct {v8, p0}, Lcom/cgollner/StatisticsCalculatorActivity$5;-><init>(Lcom/cgollner/StatisticsCalculatorActivity;)V

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

    .line 323
    const v8, 0x7f0a0008

    invoke-virtual {v2, v8}, Landroid/app/Dialog;->findViewById(I)Landroid/view/View;

    move-result-object v7

    check-cast v7, Landroid/widget/Button;

    .line 324
    .local v7, "nothanks":Landroid/widget/Button;
    new-instance v8, Lcom/cgollner/StatisticsCalculatorActivity$6;

    invoke-direct {v8, p0, v2}, Lcom/cgollner/StatisticsCalculatorActivity$6;-><init>(Lcom/cgollner/StatisticsCalculatorActivity;Landroid/app/Dialog;)V

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

    .line 330
    invoke-virtual {v2}, Landroid/app/Dialog;->show()V

    .line 332
    .end local v0    # "b":Landroid/widget/TextView;
    .end local v1    # "buy":Landroid/widget/Button;
    .end local v2    # "dialog1":Landroid/app/Dialog;
    .end local v7    # "nothanks":Landroid/widget/Button;
    :cond_5
    sget-object v8, Lcom/cgollner/MyTabActivity;->statisticsCalculator:Lcom/cgollner/domain/StatisticsCalculatorFreqs;

    invoke-virtual {v8, v5}, Lcom/cgollner/domain/StatisticsCalculatorFreqs;->setListaD(Ljava/util/List;)V

    .line 333
    invoke-direct {p0}, Lcom/cgollner/StatisticsCalculatorActivity;->fillOutputs()V

    goto/16 :goto_1

    .line 302
    :cond_6
    invoke-interface {v5}, Ljava/util/List;->size()I

    move-result v8

    add-int/lit8 v8, v8, -0x1

    invoke-interface {v5, v8}, Ljava/util/List;->remove(I)Ljava/lang/Object;

    goto :goto_2

    .line 338
    :cond_7
    sget-object v8, Lcom/cgollner/MyTabActivity;->statisticsCalculator2:Lcom/cgollner/domain/StatisticsCalculatorFreqs;

    invoke-virtual {v8, v6}, Lcom/cgollner/domain/StatisticsCalculatorFreqs;->setListaD(Ljava/util/List;)V

    .line 339
    invoke-direct {p0}, Lcom/cgollner/StatisticsCalculatorActivity;->fillOutputs2()V

    goto/16 :goto_0
.end method


最后保存编译,成功po jie,输入20个数据也没问题!

moyu2 发表于 2019-12-13 09:53

你直接把15改成大数不就得了,这么麻烦

ciker_li 发表于 2022-1-28 17:28

太后跟班 发表于 2022-1-23 00:04
求楼主分享下此破解,好多年前下过这个软件后来根本没有地方找到了!

链接: https://pan.baidu.com/s/1_tnTJug0v71JoB1bfnO1YQ?pwd=i8s2 提取码: i8s2 复制这段内容后打开百度网盘手机App,操作更方便哦

sitiger 发表于 2019-12-13 09:57

软件功能看起来很简单

rosoon 发表于 2019-12-13 10:43

谢谢LZ分享!!!

xxpl123 发表于 2019-12-13 11:09

moyu2 发表于 2019-12-13 09:53
你直接把15改成大数不就得了,这么麻烦

呵呵,刚准备这么说的,就看见你说了:lol

MatthewLee 发表于 2019-12-13 11:24

这个厉害了   菜鸟来学习一下

TvT 发表于 2019-12-13 11:28

学习了学习了学习了

zgmn001 发表于 2019-12-13 12:15

在哪里下载?

西枫游戏 发表于 2019-12-13 12:15

如果 允许的话 直接暴力改成0x999999

cptw 发表于 2019-12-13 12:53


学习了学习了学习了
页: [1] 2 3 4 5
查看完整版本: 老菜鸟逆向某统计计算器