从破解APP开始学Android——用户登录验证

最近学习android 的大型商业App 开发,又搞不到 商业源码,网上能找到的都是高仿的界面,但是应用程序里面的程序架构都不怎么样。
笔者就瞄准的 app破解,找个app破解开来学习。
Apk文件破解可见源码   这里讲的很好。

破解以后code 里面很多破解的不是很全面, 有很多//ERROR// 只能自己改了。
笔者的方法是 简单的 改掉,复杂的直接删掉,等将来用到的时候 再调试并加上。

Fiddler   http 调试利器    android http 抓包

一下记录了登录修改过程中碰到的一些问题:
HttpClient
1  最开始 自己定义了一 httpClient  但是在 Fiddler抓的包中 一直有 client   agent 头,但是真正的app中是没有这个头的。最后还是只能用app中的实现:
    private HttpClient createHttpClient()
    {
      BasicHttpParams localBasicHttpParams = new BasicHttpParams();
      ConnManagerParams.setMaxTotalConnections(localBasicHttpParams, 5);
      HttpConnectionParams.setConnectionTimeout(localBasicHttpParams, 30000);
      HttpConnectionParams.setSoTimeout(localBasicHttpParams, 60000);
      HttpProtocolParams.setVersion(localBasicHttpParams, HttpVersion.HTTP_1_1);
      HttpProtocolParams.setContentCharset(localBasicHttpParams, "ISO-8859-1");
      HttpProtocolParams.setUseExpectContinue(localBasicHttpParams, true);
      SchemeRegistry localSchemeRegistry = new SchemeRegistry();
      localSchemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
      localSchemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
      return new DefaultHttpClient(new ThreadSafeClientConnManager(localBasicHttpParams, localSchemeRegistry), localBasicHttpParams);
    }



2 关于encode 破解的 函数中 代码是乱的,最后在 网站的开放api sdk 中找到了:
 
    public static String encode(String value) {
      String encoded = null;
      try {
          encoded = URLEncoder.encode(value, "utf-8");
      } catch (UnsupportedEncodingException ignore) {
      }
      StringBuffer buf = new StringBuffer(encoded.length());
      char focus;
      for (int i = 0; i < encoded.length(); i++) {
          focus = encoded.charAt(i);
          if (focus == '*') {
              buf.append("%2A");
          } else if (focus == '+') {
              buf.append("%20");
          } else if (focus == '%' && (i + 1) < encoded.length()
                  && encoded.charAt(i + 1) == '7' && encoded.charAt(i + 2) == 'E') {
              buf.append('~');
              i += 2;
          } else {
              buf.append(focus);
          }
      }
      return buf.toString();
  }


3 程序签名 破解code 也是乱的, 最后google 了一下, 居然和weibo 的签名函数一样:

    http://open.weibo.com/qa/index.php?qa=3850&qa_1=token1-0 %E6%98%AF%E6%8A%A5%E9%94%99%EF%BC%8Csignature_method_rejected-get_oauth2_token

public static String generateSignature(String paramString1, String paramString2, String paramString3)
  {
    String HMAC_SHA1 ="HmacSHA1";
     byte[] byteHMAC = null;
        try {
            Mac mac = Mac.getInstance("HmacSHA1");
            StringBuilder localStringBuilder = new StringBuilder(String.valueOf(encode(paramString2))).append("&");
            localStringBuilder.append(paramString1);
            SecretKeySpec spec;
            if (null == paramString3) {
             String oauthSignature = encode(paramString2) + "&";
             spec = new SecretKeySpec(oauthSignature.getBytes(), HMAC_SHA1);
            } else {              
             spec = new SecretKeySpec(encode(paramString3).getBytes(), "HmacSHA1");
            }
            mac.init(spec);
            byteHMAC = mac.doFinal(paramString1.toString().getBytes());
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException ignore) {
            // should never happen
        }
        return new BASE64Encoder().encode(byteHMAC);
  }



最后 成功信息:
  oauth_token=164269412_7130f783fdfafe3927d29e1f6625a4&oauth_token_secret=ec94542edde237ee3b9f7e4094c3cb606a2e3d3bd6&is_semi_account=0&user_id=164269412&verify=164269412_164269412_1413102298_3d1adde80e52af26753d7f050e5996ce_03403AndroidClient_kx&wapverify=164269412_164269412_1413102298_bc28dc7d497824ce8f6f392ab7f94899_kx-android

你可能感兴趣的:(Android,abdroid,破解,登录,验证,签名)