亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

破解某小說App(一)

標簽:
Android

发现该小说App的域名是一个固定IP(试过几次退出登陆发现每次IP不一样,猜测是客户端写死的或者服务端下发,应该是防止域名被劫持吧)

上传的参数是一堆乱码,token也是乱码,


webp

token

一般末尾是‘=’,应该是base64编码,解密失败

webp

base64解密


返回内容居然是XML,author_name居然也是乱码,猜测是base64编码,使用站长工具Base64解密


webp

base64解密

感觉该App对数据加密做的很严谨,怪不得市场没有破解版

现在模拟它的请求只要破解它的token和参数就可以了(至于收费内容暂时不考虑)

反编译

使用Android Studio打开该App,看到tencent_stub,应该是做个乐固加固了。


webp

App

开始反编译

Mac上使用Android CrackTool进行反编译处理

webp

Android CrackTool


反编译结果的确是乐固加固

webp

结果


加固包反编译

那开始对这个加固包进行反编译
参照这个文档Android APK脱壳--腾讯乐固、360加固一键脱壳

使用脱壳工具FDex2

VirtualXposed:无需root手机即可使用xp框架。

dex进行dex2jar

这个步骤可以用Android Crack Tool上执行,执行成功之后,使用jdgui打开
搜索关键字Xml4Android_relevantPage,获取详情页

webp

详情页


刷新详情页发现Logcat中有日志

webp

image


日志中有contetn 原文进行搜索,发现token和参数加密都是native实现的RSA加密,


 public <T extends BaseModel> T a(Object paramObject, String paramString1, UserInfoDto paramUserInfoDto, String paramString2, b<T> paramb)
  {    try
    {
      paramString1 = paramString1.split("\\?");      String str2 = paramString1[1];      String str1 = a(paramString1[0]);
      paramString1 = new java/lang/StringBuilder;
      paramString1.<init>();
      paramString1.append(str1);
      paramString1.append("?appversion=");
      paramString1.append(AppUtils.getAppversion());
      paramString1.append("&Type=Android");
      paramString1 = paramString1.toString();
      str1 = paramString1;      if (!TextUtils.isEmpty(paramString1))
      {
        str1 = paramString1;        if (paramString1.contains("http://client4ip")) {
          str1 = paramString1.replace("http://client4ip", "https://client4ip");
        }
      }      if (!TextUtils.isEmpty(paramString2))
      {
        paramString1 = paramb.d(paramString2);
      }      else
      {        if (!TextUtils.isEmpty(paramUserInfoDto.getUsername())) {
          paramUserInfoDto.setUsername(paramUserInfoDto.getUsername().toLowerCase());
        }        if (!TextUtils.isEmpty(paramUserInfoDto.getPassword())) {
          paramUserInfoDto.setPassword(paramUserInfoDto.getPassword().toLowerCase());
        }        if (!TextUtils.isEmpty(paramUserInfoDto.getVerifyCode())) {
          paramUserInfoDto.setVerifyCode(paramUserInfoDto.getVerifyCode().toLowerCase());
        }        if (!TextUtils.isEmpty(paramUserInfoDto.getUsername()))
        {
          paramString2 = paramb.a(paramUserInfoDto);
          paramString1 = paramb.d(paramString2);
        }        else
        {
          paramString1 = new java/lang/StringBuilder;
          paramString1.<init>();
          paramString1.append(System.currentTimeMillis());
          paramString1.append("");
          paramString2 = MD5.MD5(paramString1.toString());
          paramString1 = paramb.d(paramString2);
        }
      }
      paramUserInfoDto = m.a().b("SP_UID");      if (!TextUtils.isEmpty(m.a().b("username"))) {
        paramUserInfoDto = m.a().b("username");
      }      Object localObject = paramUserInfoDto;      if (TextUtils.isEmpty(paramUserInfoDto))
      {
        localObject = j.a();
        m.a().a("SP_UID", (String)localObject);
      }
      paramUserInfoDto = new java/lang/StringBuilder;
      paramUserInfoDto.<init>();
      paramUserInfoDto.append(str2);
      paramUserInfoDto.append("&uuid=");
      paramUserInfoDto.append((String)localObject);
      localObject = paramUserInfoDto.toString();
      paramUserInfoDto = (UserInfoDto)localObject;      if (!TextUtils.isEmpty((CharSequence)localObject))
      {
        paramUserInfoDto = (UserInfoDto)localObject;        if (!((String)localObject).contains("time="))
        {
          paramUserInfoDto = new java/lang/StringBuilder;
          paramUserInfoDto.<init>();
          paramUserInfoDto.append((String)localObject);
          paramUserInfoDto.append("&time=");
          paramUserInfoDto.append(URLEncoder.encode(TimeUtils.getNowString(), "gb2312"));
          paramUserInfoDto = paramUserInfoDto.toString();
        }
      }
      localObject = paramUserInfoDto;      if (!TextUtils.isEmpty(paramUserInfoDto))
      {
        localObject = paramUserInfoDto;        if (!paramUserInfoDto.contains("appversion="))
        {
          localObject = new java/lang/StringBuilder;
          ((StringBuilder)localObject).<init>();
          ((StringBuilder)localObject).append(paramUserInfoDto);
          ((StringBuilder)localObject).append("&appversion=");
          ((StringBuilder)localObject).append(AppUtils.getAppversion());
          ((StringBuilder)localObject).append("&Type=Android");
          localObject = ((StringBuilder)localObject).toString();
        }
      }
      paramUserInfoDto = new java/lang/StringBuilder;
      paramUserInfoDto.<init>();
      paramUserInfoDto.append("content 原文 ");
      paramUserInfoDto.append((String)localObject);
      g.a(new Object[] { paramUserInfoDto.toString() });
      paramUserInfoDto = paramb.a((String)localObject, paramString2);
      paramString2 = new com/lzy/okgo/model/HttpParams;
      paramString2.<init>();
      paramString2.put("", paramUserInfoDto, new boolean[0]);
      paramObject = ((PostRequest)((PostRequest)((PostRequest)((PostRequest)((PostRequest)com.lzy.okgo.a.b(str1).tag(paramObject)).headers("token", paramString1)).headers("mobileType", "Android")).headers("appversion", AppUtils.getAppversion())).params(paramString2)).execute();      if (paramObject == null) {        return null;
      }      if (((Response)paramObject).isSuccessful())
      {
        paramUserInfoDto = ((Response)paramObject).body().byteStream();
        paramObject = new java/io/BufferedReader;
        paramString1 = new java/io/InputStreamReader;
        paramString1.<init>(paramUserInfoDto, "gb2312");
        ((BufferedReader)paramObject).<init>(paramString1);
        paramUserInfoDto = new java/lang/StringBuffer;
        paramUserInfoDto.<init>();        for (;;)
        {
          paramString1 = ((BufferedReader)paramObject).readLine();          if (paramString1 == null) {            break;
          }
          paramUserInfoDto.append(paramString1);
        }
        paramObject = (BaseModel)paramb.b(paramUserInfoDto.toString());        return (T)paramObject;
      }
    }



作者:乱码桑
链接:https://www.jianshu.com/p/baf21596db9a


點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消