吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 27331|回复: 42
收起左侧

[Android 原创] Android逆向实例笔记—同步家教王及其升级版的破解

  [复制链接]
牵走天涯 发表于 2016-9-1 14:31
本帖最后由 牵走天涯 于 2016-10-29 17:43 编辑

一朋友让我来破解下一软件,我拿来一看是这玩意。我以为很难,结果发现没壳。兴趣就来了,弄了一天,就弄出来了。这里把过程和思路分享一下。其实很简单,大神一看就知道。因为这个没加壳,只是加了混淆的。
这算是我第一次破解玩玩整整的apk了。
我觉得授人以鱼不如授人以渔,就把它写出来了,需要的童鞋就看看吧,然后去动手试试,真心的,多动手。
然后我们就开始吧。

一、工具
这次我用的是AndroidKiller,感觉很不错的样子
然后就是我每次都要用的蓝叠

二、同步家教王
1.看情况
老规矩,还是先拖蓝叠看看情况




随便输了123,出现了激活码错误。我们记下来

2.反编译
这个就不多说了,前面说的够多了。直接拖进去,反编译就OK。



3.修改
我们先去string.xml中没有信息,然后转码搜索激活码错误


我们跳过去,看看源码。右键,查看-查看源码


[Java] 纯文本查看 复制代码
package com.school.app.activity.login;

import android.os.Handler;
import android.os.Message;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import com.school.app.utils.SharedPreHandler;

class LoginActivity$3
  extends Handler
{
  LoginActivity$3(LoginActivity paramLoginActivity, String paramString) {}
  
  public void handleMessage(Message paramMessage)
  {
    try
    {
      if (paramMessage.obj != null)
      {
        paramMessage = ((String)paramMessage.obj).split("&");
        if (paramMessage[0].equals("yes"))
        {
          SharedPreHandler.getShared().setSharedPreKey("activation_code", this.val$text);
          SharedPreHandler.getShared().setSharedPreKey("activation_deviceId", LoginActivity.access$1(this.this$0));
          SharedPreHandler.getShared().setSharedPreKey("activation_model", LoginActivity.access$2(this.this$0));
          if (paramMessage[1].equals("-1")) {}
          for (paramMessage = "激活成功";; paramMessage = String.format(LoginActivity.access$3(this.this$0), new Object[] { paramMessage[1], paramMessage[2] }))
          {
            SharedPreHandler.getShared().setSharedPreKey("activation_msg", paramMessage);
            LoginActivity.access$4(this.this$0);
            this.this$0.finish();
            return;
          }
        }
      }
      return;
    }
    catch (Exception paramMessage)
    {
      paramMessage.printStackTrace();
      this.this$0.title.setText("激活码错误");
      this.this$0.back.setVisibility(0);
      this.this$0.exit.setVisibility(0);
      this.this$0.yes.setVisibility(8);
      this.this$0.clear.setVisibility(8);
      this.this$0.edit.setVisibility(8);
    }
  }
}

我们可以很容易的看到激活码出错的字样。再来分析一下java代码。

我们发现激活码错误并没有跳转到这里,但是之前的代码却有个 :cond_1跳转这里来。所以我们明显知道是加了混淆的。
那我们只有从激活成功去看看下手了。
再次搜索



发现有两处
刚刚这出看过了,我们去看看另一处的源码

[Java] 纯文本查看 复制代码
package com.school.app.service;

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.widget.Toast;
import com.school.app.activity.login.LoginActivity;
import com.school.app.utils.CommTool;
import com.school.app.utils.SharedPreHandler;

public class TimeCountService
  extends Service
{
  private static final long sMinute = 1L;
  private Handler mHandler = new Handler()
  {
    public void handleMessage(Message paramAnonymousMessage)
    {
      try
      {
        if ((paramAnonymousMessage.obj != null) && (((String)paramAnonymousMessage.obj).contains("stop")))
        {
          SharedPreHandler.getShared().setSharedPreKey("activation_code", "");
          SharedPreHandler.getShared().setSharedPreKey("activation_msg", "");
          paramAnonymousMessage = new Intent();
          paramAnonymousMessage.setFlags(268435456);
          paramAnonymousMessage.setClass(TimeCountService.this, LoginActivity.class);
          TimeCountService.this.startActivity(paramAnonymousMessage);
        }
        return;
      }
      catch (Exception paramAnonymousMessage)
      {
        paramAnonymousMessage.printStackTrace();
      }
    }
  };
  private MyReceiver myReceiver;
  private long time;
  
  private void requestLoginInfo()
  {
    if (CommTool.isNetworkAvailable(this))
    {
      String str = SharedPreHandler.getShared().getSharedStrPreKey("activation_code", "");
      CommTool.getActivationCode(SharedPreHandler.getShared().getSharedStrPreKey("activation_deviceId", ""), SharedPreHandler.getShared().getSharedStrPreKey("activation_model", ""), str, this.mHandler);
    }
  }
  
  private void stopTimeCountService()
  {
    Intent localIntent = new Intent();
    localIntent.setClass(this, TimeCountService.class);
    stopService(localIntent);
  }
  
  public IBinder onBind(Intent paramIntent)
  {
    return null;
  }
  
  public void onCreate()
  {
    super.onCreate();
  }
  
  public void onDestroy()
  {
    super.onDestroy();
    if (this.myReceiver != null) {
      unregisterReceiver(this.myReceiver);
    }
  }
  
  public int onStartCommand(Intent paramIntent, int paramInt1, int paramInt2)
  {
    String str = SharedPreHandler.getShared().getSharedStrPreKey("activation_msg", "");
    if ((!str.equals("")) && (!str.equals("激活成功"))) {
      Toast.makeText(this, str, 1).show();
    }
    requestLoginInfo();
    return super.onStartCommand(paramIntent, paramInt1, paramInt2);
  }
  
  class MyReceiver
    extends BroadcastReceiver
  {
    MyReceiver() {}
    
    public void onReceive(Context paramContext, Intent paramIntent) {}
  }
}

这里的话,我们还可以清晰看到激活的只是一个判断,然后Toast出来的,那我们去修改前面那一处的跳转试试。
在研究一下之前的源码,发现很混乱。但是明确知道,有个地方会跳转来验证。
的确很混乱,我研究了半天,才在这个地方破解出来。这个不写出出来这个方法,因为我自己也不是太清楚。我是自己不清楚,就绝不误人子弟的,这里大家可以自行尝试。
这里给大家就说另一个简单点的。我想起来wnagzihxain大神写的移动恶意APP分析的心得分享    (这里@wnagzihxain  跪,拜,再拜,三拜)
于是想到了这个思路。
从入口去看看



其实这个工具挺好的,直接把入口写这了,都不用我们去AndroidManifest.xml里面找了
好吧,直接点过。看看源码


[Java] 纯文本查看 复制代码
package com.school.app.activity;

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import com.school.app.activity.login.LoginActivity;
import com.school.app.service.TimeCountService;
import com.school.app.utils.SharedPreHandler;

public class MainActivity
  extends FragmentActivity
{
  private void startCountTimeService()
  {
    Intent localIntent = new Intent();
    localIntent.setClass(this, TimeCountService.class);
    startService(localIntent);
  }
  
  public boolean isActivationCode()
  {
    if (SharedPreHandler.getShared().getSharedStrPreKey("activation_code", "").equals(""))
    {
      Intent localIntent = new Intent();
      localIntent.setClass(this, LoginActivity.class);
      startActivityForResult(localIntent, 10085);
      return false;
    }
    startCountTimeService();
    return true;
  }
  
  protected void onActivityResult(int paramInt1, int paramInt2, Intent paramIntent)
  {
    if ((paramInt1 == 10085) && (paramInt2 == 10086)) {
      finish();
    }
    super.onActivityResult(paramInt1, paramInt2, paramIntent);
  }
  
  protected void onCreate(Bundle paramBundle)
  {
    super.onCreate(paramBundle);
    setContentView(2130903040);
    isActivationCode();
  }
  
  protected void onRestart()
  {
    super.onRestart();
  }
}


仔细一看,这不太简单了么。大概意思就是跳过去验证。这个时候,我们想到了,如果我们不去验证,不就完了么。

有了思路,就直接上手,找到地方。






就是这里了,别问我是怎么找到的,多看两遍源码。不废话,改为nez试试再说。


4.验证
这里就不多说了,修改完了保存。打开就直接没有验证了。


三、学习平台(综合版)
这个怎么说呢,算我是投机取巧吧。因为就上上面那个的升级版。更复杂。我估计要是没有前面那个,后面这个我也许还不能弄出来呢。
同样找到跳转验证的地方,给修改掉。










还是改为nez就OK了




此处,没有太多的技术含量。写这个的主要目的一是记记自己第一次破解完整的apk,然后就是写点换个思路的方式,谢谢大家的耐心看我废话完了这篇文章,就当我混经验好了。


最后给出两个apk的下载地址:


链接:http://pan.baidu.com/s/1pL50eeR 密码:oozb



链接:http://pan.baidu.com/s/1qYnNhFY 密码:xhkz






免费评分

参与人数 12热心值 +12 收起 理由
zjldx + 1 谢谢@Thanks!
GG0 + 1 热心回复!
莉姐 + 1 用心讨论,共获提升!
qaz003 + 1 谢谢分享。。。
生如上善若水 + 1 谢谢@Thanks!
suruoxun + 1 热心回复!
chermy + 1 已答复!
xiaoxi2011 + 1 谢谢@Thanks!
qtfreet00 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
wnagzihxain + 1 思路蛮好的
owenare + 1 热心回复!
czc476 + 1 用心讨论,共获提升!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

奥多比 发表于 2017-3-5 22:12
Screenshot_2017-03-05-20-10-11.jpg Screenshot_2017-03-05-20-10-18.jpg Screenshot_2017-03-05-20-10-28.jpg Screenshot_2017-03-05-20-13-24.jpg
必备软件都装了,数据库装了前二个,下了个人教版四年级英语课程,打开就提示下官方程序,怎么搞,大神
zjldx 发表于 2016-12-30 08:35
我也是用蓝叠,安装完同步家教,下载资料都没问题,但是点击下载好的课本,就会出现《资源浏览器》提示:初始化失败,您安装的资源浏览器版本无法在本手机使用,请到官网下载合适的安装包。

打不开课本,什么原因呢?

打不开课本,什么原因呢?
czc476 发表于 2016-9-1 15:19
LeiSir 发表于 2016-9-1 15:36
做的厉害,谢谢分享辛苦了。
ws848193120 发表于 2016-9-1 16:26
  

请问我的AndroidKiller为什么找不到蓝叠 2016-09-01_162426.jpg
启动蓝叠,刷新,还是找不到
QQh204 发表于 2016-9-1 16:40
楼主你怎么不做好一个破解版发过来啊,这个没破解的我们不会弄
 楼主| 牵走天涯 发表于 2016-9-1 16:52
ws848193120 发表于 2016-9-1 16:26
请问我的AndroidKiller为什么找不到蓝叠
启动蓝叠,刷新,还是找不到
...

先开蓝叠哈,如果不行。重启电脑,先开蓝叠。Android killer确实有时候出问题
 楼主| 牵走天涯 发表于 2016-9-1 16:53
QQh204 发表于 2016-9-1 16:40
楼主你怎么不做好一个破解版发过来啊,这个没破解的我们不会弄

我昨晚发了,你搜搜吧。几点给点热心
QQh204 发表于 2016-9-1 17:05
恩,找到了谢谢楼主,这个适合初三吧?
 楼主| 牵走天涯 发表于 2016-9-1 18:25
QQh204 发表于 2016-9-1 17:05
恩,找到了谢谢楼主,这个适合初三吧?

这个就不知道了,具体你看看吧
Dota大神 发表于 2016-9-2 16:47
QQh204 发表于 2016-9-1 17:05
恩,找到了谢谢楼主,这个适合初三吧?

在哪?我怎么没看到
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-27 06:20

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表