第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

破解某小說(shuō)App(一)

標(biāo)簽:
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


點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺(jué)得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評(píng)論
  • 收藏
  • 共同學(xué)習(xí),寫(xiě)下你的評(píng)論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說(shuō)多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開(kāi)微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消