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

来源:互联网 发布:淘宝网大童连衣裙 编辑:程序博客网 时间:2024/04/27 23:51
最近学习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

0 0
原创粉丝点击