菜鳥 學序號產生器編寫之 Android app
0x00前言
環境及工具:
手機 Nexus 4(己root)
系統版本 Android 5.01
工具 AndroidKiller_V1.2
關於Android平臺app序號產生器的編寫網上文章還比較少,而在Windows平臺上這方面的教程己經很多了,今天將以一個簡單的app為例分析並編寫一個序號產生器,高手莫要見笑,僅供小菜玩樂,有不對或不足的地方還請多多指教,不勝感激!
0x01資訊收集與註冊碼驗證流程分析
a.程式安裝執行後如圖1所示,須要註冊碼,而且從介面上可以看出應該是繫結了機器碼的。
圖1
隨便輸入一個錯誤的序列號,提示 “序列號錯誤,請檢查後重新輸入!”。
b.我們先來分析它的機器碼是如何產生的?
將apk放到AndroidKiller中進行反編譯,在網上搜尋獲得Android裝置的唯一序列號,一共就幾種方法,然後在反編譯後的apk中搜尋關鍵字最終搜到了 "ANDROID_ID",如圖2所示。
圖2
轉換後的java程式碼如圖3所示:
圖3
從圖3可以看出它是獲得ANDROID_ID後呼叫EncryptionAlgorithm().MD5(str))演算法加密,然後將密文存放在/data/data/com.drivetest.lukaoyi/shared_prefs/devicenumber.xml檔案中, 而/data/data/com.drivetest.lukaoyi/shared_prefs/isReg.xml檔案是儲存註冊標誌的,註冊前後裡面變化如下:
未註冊:<string name="ISREG">0</string>
註冊後:<string name="ISREG">1</string>
從圖3可以看出程式啟動時會讀取isReg.xml並且判斷“ISREG”是否為”1”。
下面是在網上搜尋到的關於ANDROID_ID的一些說明:
ANDROID_ID是裝置第一次啟動時產生和儲存的64bit的一個數,當裝置被wipe後該數重置,ANDROID_ID似乎是獲取Device ID的一個好選擇,但它也有缺陷:它在Android <=2.1 or Android >=2.3的版本是可靠、穩定的,但在2.2的版本並不是100%可靠的在主流廠商生產的裝置上,有一個很經常的bug,就是每個裝置都會產生相同的ANDROID_ID:9774d56d682e549c。
c.定位註冊碼驗證流程,我們搜尋”序列號錯誤,請檢查後重新輸入!”字串,定位到關鍵點。如圖4 、圖5所示:
圖4
圖5
將定位到的smali程式碼轉換成java程式碼分析,如圖6所示:
圖6
從圖6分析可以看出驗證註冊碼是在protected void onCreate(Bundle paramBundle)函式中完成的,首先呼叫getSeriaNumber(this.sharedPreferences)函式獲取真實註冊碼與使用者輸入的註冊碼比較是否相同,相同走正常流程,否則提示“序列號錯誤,請檢查後重新輸入!”。
0x02多種方式實現爆破
- 程式每次啟動時都會讀取isReg.xml檔案並且判斷“ISREG”項是否為”1”,標誌為”1”表示己註冊,所以我們可以將isReg.xml檔案中的“ISREG”項改成1,或者修改程式中的判斷該標誌的地方,直接修改跳轉。
- 修改驗證註冊碼的地方,直接修改跳轉。
- Patch機器碼,將機器碼固定死。
0x03序號產生器的編寫
- 透過上面分析可以知道它的生成註冊碼流程為:
a) 獲得ANDROID_ID號->將ANDROID_ID號計算得到串碼->將計算得到的號與常量字串” yida1234”拼接->將拼接後的字串計算得出最終的註冊碼。
2. 演算法直接可以從apk的挖出來使用,程式碼如下:
1 package com.eoeAndroid.HelloWorld; 2 //download by http://www.codefans.net 3 import android.app.Activity; 4 import android.content.Context; 5 import android.os.Bundle; 6 import android.view.View; 7 import android.widget.TextView; 8 import android.widget.Toast; 9 import android.provider.Settings; 10 import android.widget.Button; 11 import android.text.ClipboardManager; 12 13 14 15 public class ActivityMain extends Activity { 16 /** Called when the activity is first created. */ 17 18 private Button button1; 19 public void onCreate(Bundle savedInstanceState) { 20 super.onCreate(savedInstanceState); 21 setContentView(R.layout.main); 22 TextView tv = new TextView(this); 23 String seriaNumber; 24 25 super.onCreate(savedInstanceState); 26 setContentView(R.layout.main); 27 28 //獲得機器碼 29 String str = Settings.System.getString(ActivityMain.this.getContentResolver(), "android_id"); 30 31 EncryptionAlgorithm localEncryptionAlgorithm = new EncryptionAlgorithm(); 32 33 //將機器碼計算MD5 34 str = localEncryptionAlgorithm.MD5(str); 35 36 str += "yida1234"; 37 38 //計算註冊碼 39 seriaNumber = localEncryptionAlgorithm.MD5(str); 40 41 tv.setText("註冊碼: "+seriaNumber); 42 setContentView(tv); 43 44 localEncryptionAlgorithm.copy(seriaNumber, getBaseContext()); 45 Toast.makeText(ActivityMain.this, "註冊碼已複製到剪貼簿", 0).show(); 46 Toast.makeText(ActivityMain.this, "註冊碼已複製到剪貼簿", 0).show(); 47 Toast.makeText(ActivityMain.this, "註冊碼已複製到剪貼簿", 0).show(); 48 49 //--按鈕事件 50 51 } 52 } 53 54 package com.eoeAndroid.HelloWorld; 55 56 import java.io.UnsupportedEncodingException; 57 import java.security.InvalidKeyException; 58 import java.security.MessageDigest; 59 import java.security.NoSuchAlgorithmException; 60 import java.security.SecureRandom; 61 62 import javax.crypto.BadPaddingException; 63 import javax.crypto.Cipher; 64 import javax.crypto.IllegalBlockSizeException; 65 import javax.crypto.KeyGenerator; 66 import javax.crypto.NoSuchPaddingException; 67 import javax.crypto.spec.SecretKeySpec; 68 69 import android.content.Context; 70 import android.text.ClipboardManager; 71 72 public class EncryptionAlgorithm { 73 74 public final String PASSWORD = "yida1234"; 75 76 77 public static void copy(String content, Context context) 78 { 79 // 得到剪貼簿管理器 80 ClipboardManager cmb = (ClipboardManager)context.getSystemService(Context.CLIPBOARD_SERVICE); 81 cmb.setText(content.trim()); 82 } 83 84 private String parseByte2HexStr(byte[] paramArrayOfByte) 85 { 86 StringBuffer localStringBuffer = new StringBuffer(); 87 for (int i = 0; i < paramArrayOfByte.length; i++) 88 { 89 String str = Integer.toHexString(0xFF & paramArrayOfByte[i]); 90 if (str.length() == 1) { 91 str = '0' + str; 92 } 93 localStringBuffer.append(str.toUpperCase()); 94 } 95 return localStringBuffer.toString(); 96 } 97 98 public String AES(String paramString) 99 { 100 try 101 { 102 KeyGenerator localKeyGenerator = KeyGenerator.getInstance("AES"); 103 localKeyGenerator.init(128, new SecureRandom("yida1234".getBytes())); 104 SecretKeySpec localSecretKeySpec = new SecretKeySpec(localKeyGenerator.generateKey().getEncoded(), "AES"); 105 Cipher localCipher = Cipher.getInstance("AES"); 106 byte[] arrayOfByte = paramString.getBytes("utf-8"); 107 localCipher.init(1, localSecretKeySpec); 108 String str = parseByte2HexStr(localCipher.doFinal(arrayOfByte)); 109 return str; 110 } 111 catch (NoSuchAlgorithmException localNoSuchAlgorithmException) 112 { 113 localNoSuchAlgorithmException.printStackTrace(); 114 return null; 115 } 116 catch (NoSuchPaddingException localNoSuchPaddingException) 117 { 118 for (;;) 119 { 120 localNoSuchPaddingException.printStackTrace(); 121 } 122 } 123 catch (InvalidKeyException localInvalidKeyException) 124 { 125 for (;;) 126 { 127 localInvalidKeyException.printStackTrace(); 128 } 129 } 130 catch (UnsupportedEncodingException localUnsupportedEncodingException) 131 { 132 for (;;) 133 { 134 localUnsupportedEncodingException.printStackTrace(); 135 } 136 } 137 catch (IllegalBlockSizeException localIllegalBlockSizeException) 138 { 139 for (;;) 140 { 141 localIllegalBlockSizeException.printStackTrace(); 142 } 143 } 144 catch (BadPaddingException localBadPaddingException) 145 { 146 for (;;) 147 { 148 localBadPaddingException.printStackTrace(); 149 } 150 } 151 } 152 153 public String MD5(String paramString) 154 { 155 try 156 { 157 MessageDigest localMessageDigest = MessageDigest.getInstance("MD5"); 158 localMessageDigest.update(paramString.getBytes()); 159 byte[] arrayOfByte = localMessageDigest.digest(); 160 StringBuffer localStringBuffer = new StringBuffer(""); 161 for (int i = 0; i < arrayOfByte.length; i++) 162 { 163 int j = arrayOfByte[i]; 164 if (j < 0) { 165 j += 256; 166 } 167 if (j < 16) { 168 localStringBuffer.append("0"); 169 } 170 localStringBuffer.append(Integer.toHexString(j)); 171 } 172 String str = localStringBuffer.toString().substring(8, 24); 173 return str; 174 } 175 catch (NoSuchAlgorithmException localNoSuchAlgorithmException) 176 { 177 localNoSuchAlgorithmException.printStackTrace(); 178 } 179 return ""; 180 } 181 182 183 }
0x04總結
a. 未對程式碼做混淆或一些其它保護措施容易被反編譯分析,應當對app做一些基本的防護手段,比如混淆或加殼,還有重要的shared_prefs檔案應該加密存放等。
b. 序號產生器使用效果。
將註冊碼貼上到註冊框中
成功註冊
樣本及序號產生器與pdf文件下載地址:
http://yunpan.cn/cQJtXdEJvj2ed (提取碼:2a61)
相關文章
- 用C++編寫序號產生器的一點技巧2015-11-15C++
- 序號產生器合集2024-03-17
- Kalua Cocktails 1.1完全破解,內附彙編序號產生器(用序號產生器編寫器,並有它的使用教程)
(22千字)2002-02-27AI
- Java編寫的文字編輯器(菜鳥作品)2015-07-18Java
- Myeclipse 6.5 序號產生器2020-04-06Eclipse
- AlgoLab PtVector的破解及序號產生器的編寫 (17千字)2001-05-04Go
- xplorer2之破解和序號產生器2004-12-05
- 製作mIRC6.02序號產生器(給別人寫的初學者序號產生器教材) (14千字)2015-11-15
- 分享一個navicat序號產生器2024-04-02
- win10如何執行序號產生器_win10怎麼執行序號產生器2020-08-28Win10
- mIRC v5.81版註冊碼演算法分析和序號產生器編寫2000-12-11演算法
- winzip序號產生器 (1千字)2001-04-12
- HappyIcon序號產生器TC原始碼 (1千字)2001-04-08APP原始碼
- 美萍安全衛士V8.45序號產生器制作分析過程,及序號產生器! (11千字)2001-10-28
- Gif2Swf Ver 2.1 TC20序號產生器 && MASM32序號產生器 (4千字)2001-12-10ASM
- 菜鳥學習寫的Ioc工具2013-03-27
- 菜鳥裹裹App分析系列-產品分析2018-07-26APP
- hellfire2000破解過程及序號產生器的編寫(上) (4千字)2001-01-19
- 序號產生器制分析: (1千字)2001-11-19
- 密碼學-軟體加密技術和序號產生器制2020-04-06密碼學加密
- stkman[CCG]大哥的東西太厲害了,我這菜鳥看不懂.搞個菜鳥都能懂的My Flasher Play
1.4 (破解+演算法分析+序號產生器) (2千字)2002-01-24演算法
- Resource
Builder 1.1.0 完全破解~~附彙編序號產生器 (10千字)2015-11-15UI
- 從菜鳥到專家 vi編輯器全程教學2011-02-28
- SAP CRM One Order的事件序號產生器制2020-02-11事件
- Navicat Premiumx64 使用序號產生器啟用2018-11-12REM
- 010
Editorv1.3破解(序號產生器)2004-05-17
- winzip的通用序號產生器 (2千字)2001-12-10
- 密碼擷取網路版1.0序號產生器(VB寫的) (345字)2001-04-28密碼
- 破解QQ圖形留言器3.0(不是OICQ圖形留言系統)及序號產生器編寫!! (6千字)2001-07-15
- 檔案密使2.0暴力破解及序號產生器的編寫―好久沒寫過東西了。 (11千字)2001-07-10
- 序號產生器寫作教學。奉賢給想加入CCG和BCG的朋友。 (11千字)2001-10-21
- SAP CRM呼叫中心裡的事件序號產生器制2020-03-10事件
- 貼彩虹狗破解工具的序號產生器 (727字)2001-07-01
- 【原創】FileRecoveryAngel 演算法分析+序號產生器2015-11-15演算法
- 電腦幽靈pcGhost4.0序號產生器(TC編譯通過) (742字)2001-04-24編譯
- 和菜鳥一起學產品之產品經理的工作職責2013-12-16
- Android菜鳥學習js筆記一2018-06-27AndroidJS筆記
- 菜鳥學Python之雜湊表2019-04-09Python