編輯:關於Android編程
這個首先感謝魚C論壇的cbs大神,我是看了他的視頻。自己再動手破解他給出這三個小程序。真心這樣無私把技術分享給大家的人真的不多。再次感謝他。
這裡我就我自己破解的三個小程序自己做做筆記吧,方便自己以後查看,也方便剛剛入門的童鞋。這些都是些沒啥技術含量的東西,大神請飄過。
一、認識新工具
這裡我先給出一個新的工具。jeb。給個我找的。分別有32和64的。https://yunpan.cn/cMuBpvug7qjc2 訪問密碼 da4a
還是照例給個樣圖
二、Crackme03
1.查看原apk
還是拖拽到藍疊裡面看看吧。
我們看到錯誤的提示是Bad boy。
那就讓我們開心的打開apkIDE吧
2.反編譯
反編譯之後打開strings.xml。發現,沒有Bad boy。
Android Crackme03 - [by deurus] About Crackme03 This is the third crackme of the Android collection crackmes, in this, the crackme take another phone values and with our name make something. For this reason, the crackme dont run in the emulator, only in the phone. Good luck for all!. by deurus [29-10-10] [Made in Basque Country] Enter Name Enter Serial --------------------------------------
搜索結果只有一處,還好。
雙擊過去,並往上找跳轉。結果發現,這代碼有混淆。沒有辦法了?
這個時候就該我們的jeb上了。
點擊File-Open,然後選擇我們的Crackme03。
然後點到Decompiled Java選項卡。雙擊左邊的HelloAndroid。我們驚喜的發現這不是源碼麼?
其實不是哈。只是很類似了。而已。
其實,這裡的話,我們也可以不用jeb哈。直接用apkIDE帶一個東西。
點擊打開,選擇打開。也是一樣的
讓我們來看看代碼。
package com.example.helloandroid; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.telephony.TelephonyManager; import android.view.View; import android.view.View$OnClickListener; import android.widget.TextView; import android.widget.Toast; public class HelloAndroid extends Activity { private View$OnClickListener pulsarBoton; private View$OnClickListener pulsarBotonabout; public HelloAndroid() { super(); this.pulsarBotonabout = new View$OnClickListener() { public void onClick(View v) { HelloAndroid.this.setContentView(2130903041); Intent v0 = new Intent(); v0.setClass(HelloAndroid.this, prueba2.class); HelloAndroid.this.startActivity(v0); HelloAndroid.this.finish(); } }; this.pulsarBoton = new View$OnClickListener() { public void onClick(View v) { String v10 = HelloAndroid.this.findViewById(2131034116).getText().toString(); int v11 = v10.length(); String v12 = ""; String v15 = HelloAndroid.this.findViewById(2131034118).getText().toString(); if(v11 >= 4) { goto label_29; } try { Toast.makeText(HelloAndroid.this.getApplicationContext(), "Min 4 chars", 1).show (); return; label_29: int v5; for(v5 = 0; v5 < v10.length(); ++v5) { v12 = String.valueOf(v12) + v10.charAt(v5); } v12 = String.valueOf(Integer.parseInt(v12.substring(0, 5)) ^ 438294); Object v8 = HelloAndroid.this.getSystemService("phone"); String v6 = ((TelephonyManager)v8).getDeviceId(); String v16 = ((TelephonyManager)v8).getSimSerialNumber(); String v19 = v6.substring(0, 6); if(!String.valueOf(v12) + "-" + String.valueOf(((long)(Integer.parseInt(v19) ^ Integer .parseInt(v16.substring(0, 6))))) + "-" + v19.equals(v15)) { goto label_114; } Toast.makeText(HelloAndroid.this.getApplicationContext(), "God boy", 1).show(); return; label_114: Toast.makeText(HelloAndroid.this.getApplicationContext(), "Bad boy ", 1).show(); return; } catch(Exception v22) { Toast.makeText(HelloAndroid.this.getApplicationContext(), "Another Error Ocurred :(" , 1).show(); return; } } }; } public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(2130903040); Object v3 = this.getSystemService("phone"); String v2 = ((TelephonyManager)v3).getDeviceId(); new TextView(((Context)this)); this.findViewById(2131034112).setText("HardwareID 01: " + v2); String v5 = ((TelephonyManager)v3).getSimSerialNumber(); new TextView(((Context)this)); this.findViewById(2131034113).setText("HardwareID 02: " + v5); String v8 = v2.substring(0, 6); String v9 = v5.substring(0, 6); Integer.parseInt(v8); Integer.parseInt(v9); new TextView(((Context)this)); this.findViewById(2131034116).setText(""); this.findViewById(2131034120).setOnClickListener(this.pulsarBotonabout); this.findViewById(2131034119).setOnClickListener(this.pulsarBoton); } }
我們很容易的發現Bad boy,上面有God boy。猜測就知道這就是正確信息。
那就讓我們看看這代碼。我們發現上面有個
goto label_114;就從這個就跳轉到Bad boy。那麼我們就得讓它不跳轉,對吧。大致知道那裡之後回到apkIDE。
我們往上找語句塊,發現了 :cond_2
那我們搜索這個。到了這裡就是我們之前看到的那個跳轉。
OK,我們果斷改為nez,保存,生成。
3.驗證
拖拽到藍疊,打開。不錯,God boy和我們見面
這個我們就是KO了。
三、CrackMe-F1F2
1.查看原apk
無需多說,進藍疊
這不是是寫的EditView,居然不是hint屬性,表示無語。懂的就懂,不懂也不重要。這裡扯遠了,我們繼續。
既然有東西,我就懶得輸了。直接驗證
我們知道了錯誤代碼就是Lisence Uncorrect.。
2.反匯編
apkIDE,常規操作。照樣,string.xml沒有信息。
只有smali裡面搜索一波。
雙擊過去。找找跳轉。
這裡給出代碼
.class Lcom/mstar/test/LisenceCheck$1; .super Ljava/lang/Object; .source "LisenceCheck.java" # interfaces .implements Landroid/view/View$OnClickListener; # annotations .annotation system Ldalvik/annotation/EnclosingClass; value = Lcom/mstar/test/LisenceCheck; .end annotation .annotation system Ldalvik/annotation/InnerClass; accessFlags = 0x0 name = null .end annotation # instance fields .field final synthetic this$0:Lcom/mstar/test/LisenceCheck; # direct methods .method constructor(Lcom/mstar/test/LisenceCheck;)V .locals 0 .prologue .line 1 iput-object p1, p0, Lcom/mstar/test/LisenceCheck$1;->this$0:Lcom/mstar/test/LisenceCheck; .line 51 invoke-direct {p0}, Ljava/lang/Object;-> ()V return-void .end method # virtual methods .method public onClick(Landroid/view/View;)V .locals 10 .param p1, "v" # Landroid/view/View; .prologue const/4 v9, 0x0 const-string v8, "" .line 53 check-cast p1, Landroid/widget/Button; .end local p1 # "v":Landroid/view/View; iget-object v6, p0, Lcom/mstar/test/LisenceCheck$1;->this$0:Lcom/mstar/test/LisenceCheck; iget-object v6, v6, Lcom/mstar/test/LisenceCheck;->mbutton:Landroid/widget/Button; if-ne p1, v6, :cond_5 .line 55 new-instance v4, Ljava/lang/String; const-string v6, "" invoke-direct {v4, v8}, Ljava/lang/String;-> (Ljava/lang/String;)V .line 56 .local v4, "s1":Ljava/lang/String; iget-object v6, p0, Lcom/mstar/test/LisenceCheck$1;->this$0:Lcom/mstar/test/LisenceCheck; iget-object v6, v6, Lcom/mstar/test/LisenceCheck;->meditun:Landroid/widget/EditText; invoke-virtual {v6}, Landroid/widget/EditText;->getText()Landroid/text/Editable; move-result-object v6 invoke-interface {v6}, Landroid/text/Editable;->toString()Ljava/lang/String; move-result-object v4 .line 57 new-instance v5, Ljava/lang/String; const-string v6, "" invoke-direct {v5, v8}, Ljava/lang/String;-> (Ljava/lang/String;)V .line 58 .local v5, "s2":Ljava/lang/String; iget-object v6, p0, Lcom/mstar/test/LisenceCheck$1;->this$0:Lcom/mstar/test/LisenceCheck; iget-object v6, v6, Lcom/mstar/test/LisenceCheck;->meditsn:Landroid/widget/EditText; invoke-virtual {v6}, Landroid/widget/EditText;->getText()Landroid/text/Editable; move-result-object v6 invoke-interface {v6}, Landroid/text/Editable;->toString()Ljava/lang/String; move-result-object v5 .line 60 const/4 v1, 0x0 .local v1, "i":I const/4 v2, 0x0 .line 62 .local v2, "k1":I const/4 v1, 0x0 :goto_0 invoke-virtual {v4}, Ljava/lang/String;->length()I move-result v6 if-lt v1, v6, :cond_1 .line 69 :cond_0 xor-int/lit16 v2, v2, 0x5678 .line 72 const/4 v3, 0x0 .line 73 .local v3, "k2":I const/4 v1, 0x0 :goto_1 invoke-virtual {v5}, Ljava/lang/String;->length()I move-result v6 if-lt v1, v6, :cond_3 .line 78 xor-int/lit16 v3, v3, 0x1234 .line 80 if-ne v2, v3, :cond_4 .line 81 iget-object v6, p0, Lcom/mstar/test/LisenceCheck$1;->this$0:Lcom/mstar/test/LisenceCheck; invoke-virtual {v6}, Lcom/mstar/test/LisenceCheck;->getApplicationContext()Landroid/content/Context; move-result-object v6 const-string v7, "Lisence Correct\uff01" invoke-static {v6, v7, v9}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast; move-result-object v6 invoke-virtual {v6}, Landroid/widget/Toast;->show()V .line 92 .end local v1 # "i":I .end local v2 # "k1":I .end local v3 # "k2":I .end local v4 # "s1":Ljava/lang/String; .end local v5 # "s2":Ljava/lang/String; :goto_2 return-void .line 64 .restart local v1 # "i":I .restart local v2 # "k1":I .restart local v4 # "s1":Ljava/lang/String; .restart local v5 # "s2":Ljava/lang/String; :cond_1 invoke-virtual {v4, v1}, Ljava/lang/String;->charAt(I)C move-result v0 .line 65 .local v0, "ch":C const/16 v6, 0x41 if-lt v0, v6, :cond_0 .line 66 const/16 v6, 0x5a if-le v0, v6, :cond_2 const/16 v6, 0x20 sub-int v6, v0, v6 int-to-char v0, v6 .line 67 :cond_2 add-int/2addr v2, v0 .line 62 add-int/lit8 v1, v1, 0x1 goto :goto_0 .line 74 .end local v0 # "ch":C .restart local v3 # "k2":I :cond_3 invoke-virtual {v5, v1}, Ljava/lang/String;->charAt(I)C move-result v0 .line 75 .restart local v0 # "ch":C const/16 v6, 0x30 sub-int v6, v0, v6 int-to-char v0, v6 .line 76 mul-int/lit8 v6, v3, 0xa add-int v3, v6, v0 .line 73 add-int/lit8 v1, v1, 0x1 goto :goto_1 .line 83 .end local v0 # "ch":C :cond_4 iget-object v6, p0, Lcom/mstar/test/LisenceCheck$1;->this$0:Lcom/mstar/test/LisenceCheck; invoke-virtual {v6}, Lcom/mstar/test/LisenceCheck;->getApplicationContext()Landroid/content/Context; move-result-object v6 const-string v7, "Lisence Uncorrect\uff01" invoke-static {v6, v7, v9}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast; move-result-object v6 invoke-virtual {v6}, Landroid/widget/Toast;->show()V goto :goto_2 .line 88 .end local v1 # "i":I .end local v2 # "k1":I .end local v3 # "k2":I .end local v4 # "s1":Ljava/lang/String; .end local v5 # "s2":Ljava/lang/String; :cond_5 iget-object v6, p0, Lcom/mstar/test/LisenceCheck$1;->this$0:Lcom/mstar/test/LisenceCheck; iget-object v6, v6, Lcom/mstar/test/LisenceCheck;->meditun:Landroid/widget/EditText; const-string v7, "" invoke-virtual {v6, v8}, Landroid/widget/EditText;->setText(Ljava/lang/CharSequence;)V .line 89 iget-object v6, p0, Lcom/mstar/test/LisenceCheck$1;->this$0:Lcom/mstar/test/LisenceCheck; iget-object v6, v6, Lcom/mstar/test/LisenceCheck;->meditsn:Landroid/widget/EditText; const-string v7, "" invoke-virtual {v6, v8}, Landroid/widget/EditText;->setText(Ljava/lang/CharSequence;)V goto :goto_2 .end method
看我框出來的地方。很顯然,如果前面不等於後面這一段,那麼就跳轉到下面去,Toast出來錯誤。
OK,我們回到smali裡面,去找這個跳轉。
其實大膽一點,我們直接可以在錯誤的上面看到:cond_4。然後搜素這個,但是我們還是穩一點,看看類似的源碼,找找思路。
搜索:cond_4,雙擊過去
ne就是等於,那我們改成等於就OK了。eq改上。
3.驗證
保存,生成apk。拖藍疊。
又是我們熟悉又激動的正確Toast。
四、EX05_01_
1.原apk
不廢話,上藍疊。看看錯誤提示
這裡是直接不用輸什麼,直接來error--
2.反編譯
來看看我們的apkIDE怎麼說。
不用多想。依然那個問題。string沒信息。那我們就搜索error--看看
只有一處結果就是極好的,雙擊過去找跳轉。
顯然沒有什麼可用信息。還是看看類源碼吧。
package irdc.ex05_01; import android.text.util.Linkify; import android.view.KeyEvent; import android.view.View; import android.view.View.OnKeyListener; import android.widget.TextView; import android.widget.Toast; class EX05_01$1 implements View.OnKeyListener { EX05_01$1(EX05_01 paramEX05_01) {} public boolean onKey(View paramView, int paramInt, KeyEvent paramKeyEvent) { if ("gogo".equals("11")) { EX05_01.access$0(this.this$0).setText("gogo"); Toast.makeText(this.this$0, "right++", 1).show(); } for (;;) { Linkify.addLinks(EX05_01.access$0(this.this$0), 7); return false; EX05_01.access$0(this.this$0).setText("gogo"); Toast.makeText(this.this$0, "error--", 1).show(); } } }
我們知道,意思就是“gogo”等於“11”才會跳轉到正確的地方。但是怎麼可能“gogo”等於“11”呢。這裡我們就直接修改為不等於就OK了。
回到apkIDE,找到跳轉到錯誤的地方。
那麼就直接把eqz改為nez。讓它不等於
3.驗證
保存,生成,拖藍疊。
打完收工!!!
這三個app都不是很難。但是主要的目的就是練練手,然後去理理思路。各位看官,看的開心就給個五星好評。
還是最後給出三個apk下載地址吧 https://yunpan.cn/cMu6crr4vXq5t 訪問密碼 21bc
Android中的日歷,只有真機才有,模擬上是沒有的,所以測試環境一定要真機!! 因為日歷是系統自帶的,所以我們讀寫它一定要申請權限,也就是在AndroidManife
前言其實仔細想一下原理還是挺簡單的。無非是當我們滑動到最後一頁,再向後滑動時定位到第一頁;當我們滑動到第一頁,再向前滑動時定位到最後一頁。但是,相信很多朋友都遇到過這個問
准備:一. Mac OS X(10.9.2)編譯環境設置創建大小寫敏感的磁盤鏡像可以通過磁盤管理工具進行設置,也可以通過以下命令生成鏡像文件hdiutil create
上一篇講到了使用意圖錄音,這篇文章將使用MediaRecorder類來錄音,從而提供更多的靈活性。 效果圖: 源代碼奉上: