Ⅰ apk反編譯後怎麼修改控制項的大小
有兩種方式:
找到這個控制項所在的布局文件,修改控制項的寬度高度屬性。
找到這個控制項所在的Activity smali文件,在Activity的初始化的方法中設置控制項的大小,一般是在onCreate方法中,這點需要了熟悉smali語言。
所謂APK指的是android操作系統的應用程序安裝文件。所謂Crack,簡單地理解為「破解」。我具體指的是反編譯APK文件進行匯編級的代碼分析,並修改或插入自己的代碼,重新簽名打包為APK文件,以達到改變程序原有行為的目的。
由以上的說明可知,我們要Crack一個APK文件,主要流程有三步:反編譯、代碼分析、重新打包簽名。
基本准備
我們需要一些基本的工具進行一些主要的工作。如果你是一個會做Android APK漢化的朋友,那麼你應該對這些工具非常熟悉:
第一個工具是android-apktool,A tool for reengineering Android apk files 。這個工具是我們完成APK Crack的核心,利用它實現APK文件的反編譯和重新打包。它是Google Code上一個非常著名的開源項目,大家可以在Google Code的網頁上獲取它和它的Wiki、源碼及其他相關信息。
第二個工具是Auto-sign。這個工具實現的是APK打包後的簽名工作,屬於一個小工具。
除了這些基本工具外,為了更好的分析代碼,你可能還需要用到一些其他工具,例如:dex2jar和jd-gui等,這里不做詳述。
反編譯
如果你是一個經常漢化APK程序的朋友,那麼反編譯這一步你肯定不會陌生。不過,既然這篇文章側重於基本流程講解,那麼這一步想來是不能省掉的。所以,覺得羅嗦的朋友,請跳過。首先我們需要有一個待反編譯的APK。這里我自己寫了一個HelloWorld的APK,代碼如下:
package com.zh_weir.helloworld;import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
復制代碼
我們通過android-apktool對這個APK進行反編譯。對於android-apktool的使用,我就不做太多翻譯的工作,直接給出說明文檔吧。簡單一句話,就是命令行執行。
Apktool v1.3.2 - a tool for reengineering Android apk files
Copyright 2010 Ryszard Wi?niewski <[email protected]>
Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
Usage: apktool [-v|--verbose] COMMAND [...]
COMMANDs are:
d[ecode] [OPTS] <file.apk> [<dir>]
Decode <file.apk> to <dir>.
OPTS:
-s, --no-src
Do not decode sources.
-r, --no-res
Do not decode resources.
-d, --debug
Decode in debug mode. Check project page for more info.
-f, --force
Force delete destination directory.
-t <tag>, --frame-tag <tag>
Try to use framework files tagged by <tag>.
--keep-broken-res
Use if there was an error and some resources were dropped, e.g.:
"Invalid config flags detected. Dropping resources", but you
want to decode them anyway, even with errors. You will have to
fix them manually before building.
b[uild] [OPTS] [<app_path>] [<out_file>]
Build an apk from already decoded application located in <app_path>.
It will automatically detect, whether files was changed and perform
needed steps only.
If you omit <app_path> then current directory will be used.
If you omit <out_file> then <app_path>/dist/<name_of_original.apk>
will be used.
OPTS:
-f, --force-all
Skip changes detection and build all files.
-d, --debug
Build in debug mode. Check project page for more info.
if|install-framework <framework.apk>
Install framework file to your system.
For additional info, see: http://code.google.com/p/android-apktool/
復制代碼
通過apktool d HelloWorld.apk的命令,我們就完成了一個簡單的APK的反編譯工作。得到了一個叫做「HelloWorld」的文件夾。你可以看見文件夾下有Manifest文件,有反編譯出的res資源文件。這些東西都是平時漢化特別關心的,而不是我們要注意的重點。我們需要注意的是一個叫做「smali」的文件夾。
仔細觀察,你會發現這個文件夾下的文件組織結構和我們的Android工程中java源碼的組織結構幾乎一致。只不過Java文件被.smali的文件取而代之了。我們用文本編輯器打開這些.smali文件,你會發現它們都是可識別的、並且非常「整齊」的文本文件。
Ⅲ 新人求助,用apktool反編譯提示錯誤
package com.mycompany.myapp;
import android.app.*;
import android.os.*;
import android.view.*;
import android.widget.*;
public class MainActivity extends Activity
{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
sh: Can't open /data/data/per.pqy.apktool/mydata/apktool.sh
sh: Can't open /data/data/per.pqy.apktool/mydata/apktool.sh
Ⅳ APk文件怎麼破解
APK Crack寫這篇文章之前,有些猶豫,我會不會因此而打開了一個潘多拉魔盒呢?後來一想,Android類似的惡意軟體早已問世,說明這世上已經有不少軟體安全專家或者黑客們對此並不陌生了。而我,僅僅是作為一個傳道者,將這個少數人知道的秘密告訴大家。於是我心安多了,我想我是在為Android軟體安全行業早日成熟起來做貢獻吧~! 所謂APK指的是Android操作系統的應用程序安裝文件。所謂Crack,簡單地理解為「破解」。我具體指的是反編譯APK文件進行匯編級的代碼分析,並修改或插入自己的代碼,重新 改之後的代碼,大致如下: # virtual methods .method public onCreate(Landroid/os/Bundle;)V .locals 2 .parameter "savedInstanceState" .prologue
Ⅳ 如何反編譯android應用並重新打包
一.看android的源代碼 1)將Apkd.apk 用zip解壓後,出現了一個classes.dex文件 2014/02/19 19:42 . 2014/02/19 19:42 .. 2014/02/19 15:35 1,656 AndroidManifest.xml 2014/02/19 15:35 687,024 classes.dex 2014/02/19 15:49 META-INF 2014/02/19 15:49 res 2014/02/19 15:35 2,200 resources.arsc 2)進入到dex2jar目錄中,運行情況如下: D:\developer\tools\test_apk\dex2jar-0.0.9.15>dex2jar.bat "..\Apkd(d2j)\classes.d ex" this cmd is deprecated, use the d2j-dex2jar if possible dex2jar version: translator-0.0.9.15 dex2jar ..\Apkd(d2j)\classes.dex -> ..\Apkd(d2j)\classes_dex2jar.jar Done. 在apk所在的目錄會出現 classes_dex2jar.jar 文件。 3) 用JD-GUI對jar包進行查看,可以查看源文件 二.反編譯apk 1.在下載APKTOOL中的三個文件(aapt.exe、apktool.bat、apktool.jar)解壓縮到你的Windows安裝目錄下,以方便使用Dos命令. 2012/12/06 11:44 854,016 aapt.exe 2014/02/19 17:15 277,372 Apkd.apk//示例用apk文件 2012/12/23 23:39 92 apktool.bat 2013/02/03 02:37 2,655,843 apktool.jar 2.進入到apktool.bat所在的目錄,運行: apktool d Apkd.apk decode_dir 反編譯後,decode_dir目錄下的內容如下: 2014/02/19 17:16 716 AndroidManifest.xml 2014/02/19 17:16 237 apktool.yml 2014/02/19 17:18 build 2014/02/19 17:16 res 2014/02/19 17:16 smali 此時我可以查看原文件AndroidManifest.xml了,也是查看smali源文件(是用smali語言寫的,可以對照java看)。 三.APKTOOL的使用 1).decode 該命令用於進行反編譯apk文件,一般用法為 apktool d 代表了要反編譯的apk文件的路徑,最好寫絕對路徑,比如C:\MusicPlayer.apk 代表了反編譯後的文件的存儲位置,比如C:\MusicPlayer 如果你給定的已經存在,那麼輸入完該命令後會提示你,並且無法執行,需要你重新修改命令加入-f指令 apktool d –f 這樣就會強行覆蓋已經存在的文件 2).build 該命令用於編譯修改好的文件,一般用法為 apktool b 這里的 就是剛才你反編譯時輸入的 (如C:\MusicPlayer),輸入這行命令後,如果一切正常,你會發現C:\MusicPlayer內多了2個文件夾build和dist,其中分別存儲著編譯過程中逐個編譯的文件以及最終打包的apk文件。 3).install-framework 該命令用於為APKTool安裝特定的framework-res.apk文件,以方便進行反編譯一些與ROM相互依賴的APK文件。具體情況請看常見問題 四.smali與java源碼對照,並做出相應的修改 java源代碼: import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.widget.*; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView a = (TextView)this.findViewById(R.id.test) ; a.setText("raoliang"); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } } 對應的smali源代碼: .class public Lali/text/apkd/MainActivity; .super Landroid/app/Activity; .source "MainActivity.java" # direct methods .method public constructor ()V .locals 0 .prologue .line 8 invoke-direct {p0}, Landroid/app/Activity;->()V return-void .end method # virtual methods .method protected onCreate(Landroid/os/Bundle;)V .locals 2 .parameter "savedInstanceState" .prologue .line 12 invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V .line 13 const/high16 v1, 0x7f03 invoke-virtual {p0, v1}, Lali/text/apkd/MainActivity;->setContentView(I)V .line 14 const/high16 v1, 0x7f08 invoke-virtual {p0, v1}, Lali/text/apkd/MainActivity;->findViewById(I)Landroid/view/View; move-result-object v0 check-cast v0, Landroid/widget/TextView; .line 15 .local v0, a:Landroid/widget/TextView; const-string v1, "raoliang" invoke-virtual {v0, v1}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V .line 16 return-void .end method .method public onCreateOptionsMenu(Landroid/view/Menu;)Z .locals 2 .parameter "menu" .prologue .line 21 invoke-virtual {p0}, Lali/text/apkd/MainActivity;->getMenuInflater()Landroid/view/MenuInflater; move-result-object v0 const/high16 v1, 0x7f07 invoke-virtual {v0, v1, p1}, Landroid/view/MenuInflater;->inflate(ILandroid/view/Menu;)V .line 22 const/4 v0, 0x1 return v0 .end method 通過對比可以看到,常量是沒有必變的,可以根據的smali的語法,進行相應的修改 五.3、打包、簽名和安裝修改後的apk 修改完了,就可以打包回apk了。執行以下命令: apktool b decode_dir 在mygame目錄下的dist在會看到打包好的apk。 當然,現在一般是無法安裝的,因為apk還沒有簽名。下面就來簽名。簽名需要keystore文件,我已經有專用的keystore了,如果還沒有,請參閱這里進行生成。 執行以下命令為重新編譯的my_game.apk簽名: jarsigner -verbose -keystore demo.keystore Apkd.apk demo.keystore 最後,在安裝到手機前,需要把手機中的已有版本先卸載,因為如果簽名不同,是不能覆蓋安裝的,會提示「應用程序未安裝」錯誤。 完整的運行情況如下: D:\developer\tools\test_apk\new\decode\dist>keytool -genkey -alias demo.keystore -keyalg RSA -validity 40000 -keystore demo.keystore 輸入keystore密碼: 再次輸入新密碼: 您的名字與姓氏是什麼? [Unknown]: rao 您的組織單位名稱是什麼? [Unknown]: rao 您的組織名稱是什麼? [Unknown]: 您所在的城市或區域名稱是什麼? [Unknown]: 您所在的州或省份名稱是什麼? [Unknown]: 該單位的兩字母國家代碼是什麼 [Unknown]: CN=rao, OU=rao, O=Unknown, L=Unknown, ST=Unknown, C=Unknown 正確嗎? [否]: y 輸入的主密碼 (如果和 keystore 密碼相同,按回車): D:\developer\tools\test_apk\new\decode\dist>jarsigner -verbose -keystore demo.keystore Apkd.apk demo.keystore 輸入密鑰庫的口令短語: 正在添加: META-INF/MANIFEST.MF 正在添加: META-INF/DEMO_KEY.SF 正在添加: META-INF/DEMO_KEY.RSA 正在簽名: res/drawable-hdpi/ic_launcher.png 正在簽名: res/drawable-mdpi/ic_launcher.png 正在簽名: res/drawable-xhdpi/ic_launcher.png 正在簽名: res/drawable-xxhdpi/ic_launcher.png 正在簽名: res/layout/activity_main.xml 正在簽名: res/menu/main.xml 正在簽名: AndroidManifest.xml 正在簽名: classes.dex 正在簽名: resources.arsc D:\developer\tools\test_apk\new\decode\dist> 到此為止,修改後的apk可以正常的安裝了,不過,在安裝之前,必須要先卸載以前的apk,不能直接替換(因為簽名不一樣)
Ⅵ 打包後的apk為什麼不走service的oncreate
渠道信息一般在 AndroidManifest.xml中修改以下值:
首先你必須在AndroidManifest.xml中的meta-data修改以下的樣子:
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" />
其中${UMENG_CHANNEL_VALUE}中的值就是你在gradle中自定義配置的值。
build.gradle文件就利用proctFlavors這樣寫:
proctFlavors {
wandoujia {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
}
{
manifestPlaceholders = [UMENG_CHANNEL_VALUE: ""]
}
c360 {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "c360"]
}
uc {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "uc"]
}
}
其中[UMENG_CHANNEL_VALUE: "wandoujia"]就是對應${UMENG_CHANNEL_VALUE}的值。
最新更新
後來發現上面的重復代碼太多,就在網上又發現了一個更簡潔的寫法
proctFlavors {
wandoujia {}
{}
c360 {}
uc {}
proctFlavors.all { flavor ->
flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
}
其中name的值對相對應各個proctFlavors的選項值,這樣就達到自動替換渠道值的目的了。
這樣生成apk時,選擇相應的Flavors來生成指定渠道的包就可以了,而且生成的apk會自動幫你加上相應渠道的後綴,非常方便和直觀。大家可以自己反編譯驗證。
一次生成所有渠道包
在android studio底欄中有個命令行工具Terminal,打開後就CMD可以自動切換到當前項目的目錄下。
有的項目下會有graldew.bat這個文件,你就可以輸入這個命令:
gradlew assembleRelease
就可以一次性生成所有的渠道包了
不過我一般不建議大家使用這個命令,gradlew這個命令的gralde的版本無法控制,有時候會莫名其妙的下載老版本的gradle
所以我個人推薦大家使用以下的用法。
先找到gralde的根目錄,在系統變數里添加兩個環境變數:
變數名為:GRADLE_HOME,變數值就為gradle的根目錄;
所以變數值為:C:\Users\yazhou\.gradle\wrapper\dists\gradle-2.1-all\27drb4udbjf4k88eh2ffdc0n55\gradle-2.1
還有一個在系統變數里PATH裡面添加gradle的bin目錄
我的就是C:\Users\yazhou\.gradle\wrapper\dists\gradle-2.1-all\27drb4udbjf4k88eh2ffdc0n55\gradle-2.1\bin
這里配置完成了,接著在Terminal中敲下 gradle assembleRelease就可以一次性生成所有的渠道包了。
所有生成的apk在項目的build\outputs\apk下。
如果只是想生成單個渠道的包呢?
打開Android Studio的Gradle tasks面板(右邊側邊欄),會發現模塊多了很多任務,如下圖所示。
Ⅶ 求安卓app逆向破解工具和一般過程,純小白
首先,使用apktool工具進行反編譯,可以得到smali代碼文件,再定位找到主Activtiy的代碼,主Activity可以從AndroidManifest文件中查到。九天傳說的主Activity查到為com.tp.ttgame.jiutian.JiuTian。
圖2是處理com\tp\ttgame\jiutian\JiuTian.smali中的onCreate函數,向其中添加有米廣告的初始化代碼截圖
Ⅷ 怎樣把反編譯的apk文件在eclipse中打開
那要看你反編譯的程度了。apk反編譯有兩部分,一部分是res等xml資源文件。用android 的apktool就可以了。這些xml文件都可以在eclipse中直接打開。
dex文件(源代碼)需要使用dex2jar工具轉化成jar文件。jar文件可以在eclipse查看其結構。對.class文件,eclipse可以查看方法,內部類等信息。
如果對Jar也進行了反編譯,那麼得到的就是Java文件。在eclipse中,可以像你new 的class一樣查看。
Ⅸ apk反編譯如何修改字體大小
有兩種方式: 找到這個控制項所在的布局文件,修改控制項的寬度高度屬性。 找到這個控制項所在的Activity smali文件,在Activity的初始化的方法中設置控制項的大小,一般是在onCreate方法中,這點需要了熟悉smali語言。
Ⅹ 為什麼我用show java手機版反編譯出來的工程用AIDE打開會有很多錯誤
本文詳細介紹了如何反編譯一個未被混淆過的Android APK,修改smali位元組碼後,再回編譯成APK並更新簽名,使之可正常安裝。破譯後的apk無論輸入什麼樣的用戶名和密碼都可以成功進入到第二個Activity。
有時難免要反編譯一個APK,修改其中的若干關鍵判斷點,然後再回編譯成一個全新的可用的apk,這完全是可實現的。若要完成上述工作,需要以下工具,雜家後面會把下載鏈接也附上。這些軟體截止本文發布時,經過雜家確認都是最新的版本。
1.APK-Multi-Toolv1.0.11.zip 用它來反編譯apk,得到smali類型的源碼和資源文件。一般來講,直接解壓縮一個apk也可以看到其資源文件,但部分xml是不可閱讀的,需用此工具反編譯。網上流傳較廣的是一個經過高人漢化過的版本1.0.3,第一次使用這個工具可以用這個漢化的版本,熟悉其命令。但經過雜家測試,這個漢化的版本再回編譯apk簽名時已經出問題了,簽不了,最終用的最新版才ok。
2.dex2jar-0.0.9.15.zip 用於將一個apk文件轉換成jar類型的文件,轉換之後再利用下面的jd-gui工具才能看到其java代碼。上面的apk-tool固然強大,但是反編譯出來是smali文件,即dalvik位元組碼,類似匯編語言的一種代碼,直接閱讀如天書一樣,為此我們需要使用dex2jar + jd-gui來得到其java代碼,進行閱讀找到要修改的關鍵點。
3.jd-gui-0.3.6.windows.zip 可以打開一個jar類型的文件,看到java代碼。並能將代碼保存,保存後再弄到sourceinsight里就方便看了。最好使用本文所說的最新版本,使用老版本會發現一個BActivity,如果裡面有內部類,則又多出一個BActivity$1.java,類似這種文件。新版本沒這個問題。
4.Smali2Java.1.0.0.558.zip 用於將smali文件轉成java文件,這個工具僅僅是備用。因為用上面三個工具已經能夠勝任本文的要求了。
如果第一次接觸反編譯,不了解smali語法,可以閱讀鏈接1 鏈接2
下面雜家先上一個Android APK,用來簡單模擬用戶登錄的情況,注意只能是模擬哈。因為正式的apk很少有在本地進行判斷的。此apk要求用戶輸入用戶名和密碼,如果用戶名為yanzi,密碼為123,則認為合法,自動跳轉到第二個Activity。否則提示用戶名或密碼不正確。
<span style="font-family:Comic Sans MS;font-size:18px;">package org.yanzi.decomdemo.activity;
import org.yanzi.decompiledemo.R;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class LoginActivity extends Activity {
EditText loginName = null;
EditText loginPswd = null;
Button loginBtn = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
initUI();
loginBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(isAllowLogin()){
Intent intent = new Intent(LoginActivity.this, SecondActivity.class);
startActivity(intent);
LoginActivity.this.finish();
}
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.login, menu);
return true;
}
private void initUI(){
loginName = (EditText)findViewById(R.id.edit_login_name);
loginPswd = (EditText)findViewById(R.id.edit_login_pswd);
loginBtn = (Button)findViewById(R.id.btn_login);
}
private boolean isAllowLogin(){
String name = loginName.getText().toString().trim();
String pswd = loginPswd.getText().toString().trim();
if(name != null && pswd != null){
if(name.equals("") || pswd.equals("")){
Toast.makeText(this, "密碼或用戶名不能為空", Toast.LENGTH_SHORT).show();
return false;
}
}
if(name.equals("yanzi") && pswd.equals("123")){
return true;
}else{
Toast.makeText(getApplicationContext(), "用戶名或密碼不符", Toast.LENGTH_SHORT).show();
}
return false;
}
}
</span>
附上出處鏈接:http://blog.csdn.net/yanzi1225627/article/details/38425453