Android逆向练习 crackme0502

今天继续练习简单的crackme。
先看一下界面,还是输入注册码,点击检测后弹Toast提示成功、失败。

反编译APK

几种方式
1、直接用apktool反编译,得到smali代码
2、直接解压apk,得到的dex文件用BytecodeViewer打开(翻译成java源码)
3、d2j-dex2jar工具打成jar包,然后用jd-jui打开读java源码

定位代码:

先搜注册码相关的字符,找到onClick().


 this.btnCheckSN.setOnClickListener(new View.OnClickListener()
    {
      public void onClick(View paramAnonymousView)
      {
        if (new MainActivity.SNChecker(MainActivity.this, MainActivity.this.edtSN.getText().toString()).isRegistered()) {}
        for (String str = "注册码正确";; str = "注册码错误")
        {
          Toast.makeText(MainActivity.this, str, 0).show();
          return;
        }
      }
    });

可以看到这里判断了个isRegistered(),然后下面的发编译代码有点问题。不过没关系,先看一眼isRegistered()函数:

public boolean isRegistered()
    {
      int i = 0;
      if ((this.sn == null) || (this.sn.length() < 8)) {
        return false;
      }
      int j = this.sn.length();
      if (j == 8) {
        switch (this.sn.charAt(0))
        {
        default: 
          bool = false;
          if (bool) {
            switch (this.sn.charAt(3))
            {
            default: 
              bool = false;
            }
          }
          break;
        }
      }
      do
      {
        for (;;)
        {
          return bool;
          bool = true;
          break;
          bool = true;
        }
        bool = false;
      } while (j != 16);
      int k = 0;
      label145:
      if (k >= j) {
        if (i % 6 != 0) {
          break label181;
        }
      }
      label181:
      for (boolean bool = true;; bool = false)
      {
        break;
        i += this.sn.charAt(k);
        k++;
        break label145;
      }
    }

按照以往的经验,直接一劳永逸将isRegistered()返回true就行了。修改smali时,我们直接在函数开始的地方插入代码,让它返回true。

    const/4 v0, 0x1
    return v0

然后我们看下上面提到的有错误的地方,就是这段:

 if (new MainActivity.SNChecker(MainActivity.this, MainActivity.this.edtSN.getText().toString()).isRegistered()) {}
        for (String str = "注册码正确";; str = "注册码错误")
        {
          Toast.makeText(MainActivity.this, str, 0).show();
          return;
        }

到smali中查看,通过分析得知其实是反编译成java代码的时候产生的问题。

   .line 45
    .local v0, "checker":Lcom/droider/crackme0502/MainActivity$SNChecker;
    invoke-virtual {v0}, Lcom/droider/crackme0502/MainActivity$SNChecker;->isRegistered()Z

    move-result v2  #isRegistered()的结果

    if-eqz v2, :cond_0 #如果为false,就到cond_0

    const-string v1, "\u6ce8\u518c\u7801\u6b63\u786e"   #unicode转码 -> 注册码正确

    .line 46
    .local v1, "str":Ljava/lang/String;
    :goto_0         #开始循环
    iget-object v2, p0, Lcom/droider/crackme0502/MainActivity$2;->this$0:Lcom/droider/crackme0502/MainActivity;

    const/4 v3, 0x0

    #调用toast方法,v2相当于MainActivity.this,v1是str,v3=0
    invoke-static {v2, v1, v3}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;

    move-result-object v2

    invoke-virtual {v2}, Landroid/widget/Toast;->show()V

    .line 47
    return-void

    .line 45
    .end local v1    # "str":Ljava/lang/String;
    :cond_0       #isRegistered()的结果位false跳到这里
    const-string v1, "\u6ce8\u518c\u7801\u9519\u8bef"   #unicode转码 -> 注册码错误

    goto :goto_0
.end method

好了,打包apk试验,却发现应用闪退。。。看一眼logcat,发现了程序被修改的log提示。所以应该是某些地方做了某种验证,不符合后就kill掉应用。这里有两种方法,一种是搜索提示“程序被修改”字符,不过一般的是不会给你任何提示的;另一种是搜索finish()方法或者android.os.killprocess()方法。我们来搜索一下,果然在MyApp中发现了两处:

结合jd-jui代码

很明显的用了Java反射机制,手动调用了isRegistered()方法,参数是字符串1111。如果1111通过了验证或者调用isRegistered()失败,则用killProcess干掉本应用进程。知道了原理,也就好解决了,直接将两处killProcess()的调用nop掉就可以了。

重新打包验证,随便输入字符都能验证通过了。

crackme0502 APK连接:
链接: https://pan.baidu.com/s/1kVeNCoB 密码: b5km

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,794评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,050评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,587评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,861评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,901评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,898评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,832评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,617评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,077评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,349评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,483评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,199评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,824评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,442评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,632评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,474评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,393评论 2 352

推荐阅读更多精彩内容