反編譯sdk
A. Android反編譯(三)— 手動編譯
PS: 最近沒工作,沒工作就沒需求,沒需求就沒什麼技術總結的靈感,那就沒更新什麼。但是兩個月不更新了,要是三個月不更新就會出大事,所以這次打算做一件有意思又不難的事。
之前有發文章寫過反編譯,今天就來試試反編譯之正編譯,開玩笑的,就是試試手動編譯的過程, 平時我們在項目中編譯出包都是使用Gradle直接執行assemble任務就能解決,我打算試試手動模擬整個過程。當然我也是第一次這樣搞,所以如果有寫得不對的地方,還望指出。
眾所周知,apk實質上就是一個壓縮包。復習一下,我們寫個最簡單的Demo,然後打包,然解壓,注意是解壓,不是反編譯,意義是不同的。
注意我這個Demo很簡單,什麼都不引入
然後我們看看整個出包的過程,隨便從網上拿張圖
然後這里我們用Android SDK給我們提供的工具來完成整個流程,工具在sdk文件夾下的build-tools文件夾下,有什麼aapt.exe、dx.bat,用的就是這些
這步應該是整個流程最簡單的吧,我感覺,所以從最簡單的開始。
我們先看看生成的dex有什麼
對比項目,我是一開始最基本的項目,什麼都沒動,所以只有一個MainActivity.clas,所以這里肯定是要先想辦法得到BuildConfig.class和R.class。
輸入命令:
aapt p -f -m -J <輸出路徑> -S <res路徑> -I <android.jar路徑> -M <Manifest路徑>
下一步,我們需要BuildConfig.class
這個BuildConfig.java是由gradle在我們配置好gradle之後自己幫我們生成的,所以我們直接拿來用,然後再javac就得到class文件了
然後我們再編譯我們的MainActivity.java並將它們放到同一個文件夾下, MainActivity因為引用了Android.jar和R文件,所以編譯時注意點,我為此被動好好的復習了一遍javac,都是淚
最後一步,我們用dx工具就能打出dex文件了
然後執行命令就得到一個Dex文件,看看這個文件裡面和上面直接打出的apk中的Dex文件有什麼不同:
看圖,我們上一步已經生成.dex了,那麼我們需要和compiled Resource 還有 Other Resource 一起生成APK。
我們先來生成compiled Resource,也就是resources.arsc
發現之前使用aapt生成R文件的時候沒寫完整,當時可以加一個-F參數直接生成arsc和Manifest
導出的abc.zip裡面就有resources.arsc和AndroidManifest.xml。
因為之前寫漏了,所以肯定要重新編一次MainActivity.java和Dex
我們把剛才的dex文件和aapt生成的resources.arsc、AndroidManifest.xml和res放到一個文件夾裡面。
PS:res文件夾也是上面aapt的命令生成的
然後我們對比這個文件夾和之前apk解壓的文件夾
最後運行
看來是成功了。
再說說遇到的還有兩個問題,並說下我解決問題的思路
(1)我把它們都放到一個文件夾之後,我壓縮成壓縮包,然後改後綴成.apk,然後發現安裝不了,我就直接反編譯,發現發編譯失敗,提示包有問題,以我多點玩包的經驗,我感覺就是壓縮工具出了問題,然後我去下個「好壓」(這不是廣告啊),然後就能正常反編譯了。
(2)但是還是安裝不了,再根據我多年的玩包經驗,我感覺是簽名問題,然後我隨便給這個包上一個簽名,就能正常安裝得到上圖的結果了。
總體來說,還真挺好玩的,這整個過程,就是翻車了幾次。做完之後感覺非常牛逼,為什麼這樣說,因為我知道這整個過程,我就可以做到,我不經過gradle來打包,我自己寫個python腳本來調用aapt和dx來打包也是能做到的。
當然上面純屬異想天開,因為這是個什麼都沒有的Demo所以覺得簡單,要是一個真實的項目,我感覺肯定要有很多坑,別的先不說,一個項目那麼多依賴關系,我這javac要搞死人。
最後如果有不對的地方,希望有大佬能夠指出,畢竟能運行也不能證明完全沒問題。然後我使用的build-tools是28的,不敢保證其它版本包括以後版本的玩法都一樣。
B. 用apktool對apk 反編譯怎麼在sdk虛擬機里使用這個項目啊
貌似木有吧
C. java的反編譯怎麼使用,說具體點
1.下載jad1.5.8e
http://www.kps.com/jad.html#download
下載後解壓。解壓縮後將jad.exe拷貝到JRE的bin目錄下,如\Java\jre1.5.0_06\bin
2.下載 jadclipse_3.1.0.jar
http://jaist.dl.sourceforge.net/sourceforge/jadclipse/jadclipse_3.1.0.jar
將jadclipse_3.1.0.jar復制到D:\Program Files\eclipse\myplugin\eclipse\plugins目錄下(用的是
link方式安裝插件的)。
3.啟動Eclipse後,在Windows-->Perference-->Java下面應該會多出一個JadClipse目錄,相關的設置可
以在此修改
配置jadclipse:設置path to decompiler為jad.exe的全路徑,如:F:\Java\jre1.5.0_06\bin\jad.exe
,在Directory for temporary files中指定臨時文件的路徑,如:G:\Java\eclipse-SDK-3.0-win32\temp
4、在Eclipse的Windows-->Perference-->General->Editors->File Associations中修改「*.class」默
認關聯的編輯器為「JadClipse Class File Viewer」
5、安裝完成,雙擊class文件,Eclipse將自動反編譯了。
D. flutter 反編譯
>You are building a fat APK that includes binaries for android-arm, android-arm64.
>If you are deploying the app to the Play Store, it's recommended to use app bundles or split the APK to rece the APK size.
> To generate an app bundle, run:
> flutter build appbundle --target-platform android-arm,android-arm64
> Learn more on: https://developer.android.com/guide/app-bundle
> To split the APKs per ABI, run:
> flutter build apk --target-platform android-arm,android-arm64 --split-per-abi
> Learn more on: https://developer.android.com/studio/build/configure-apk-splits#configure-abi-split
>Initializing gradle... 2.3s
>Resolving dependencies... 14.2s
>Running Gradle task 'assembleRelease'... ע: E:\work_tool\flutter\.pub-cache\hosted\pub.flutter-io.cn\connectivity-0.4.4\android\src\main\java\io\flutter\plugins\connectivity\ConnectivityPlugin.javaʹ�û����ѹ�ʱ�� API��
>ע: �й���ϸ��Ϣ, ��ʹ�� -Xlint:deprecation ���±��롣
>ע: E:\work_tool\flutter\.pub-cache\hosted\pub.flutter-io.cn\url_launcher-5.1.3\android\src\main\java\io\flutter\plugins\urllauncher\WebViewActivity.javaʹ
>�û����ѹ�ʱ�� API��
>ע: �й���ϸ��Ϣ, ��ʹ�� -Xlint:deprecation ���±��롣
>Calling mockable JAR artifact transform to create file: C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\android.jar\\android.jar with input E:\work_tool\sdk\android-sdk-windows\platforms\android-28\android.jar
>Calling mockable JAR artifact transform to create file: C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\android.jar\\android.jar with input E:\work_tool\sdk\android-sdk-windows\platforms\android-27\android.jar
>Request to incrementing alive workforce from 0. Current workforce (dead or alive) 0
>thread-pool size=4
>ProGuard, version 6.0.3
>Reading input...
>Reading program jar [C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\flutter.jar\\jetified-flutter.jar] (filtered)
>Reading program jar [F:\dartSpace\flutter\jiddspace\nfc\build\app\intermediates\flutter\release\libs.jar] (filtered)
>Reading program jar [C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\localbroadcastmanager-1.0.0.aar\\jars\classes.jar] (filtered)
>Reading program jar [C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\work-runtime-2.1.0.aar\\jars\classes.jar] (filtered)
>Reading program jar [C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\fragment-1.1.0.aar\\jars\classes.jar] (filtered)
>Reading program jar [C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\room-runtime-2.1.0.aar\\jars\classes.jar] (filtered)
>Reading program jar [C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\room-runtime-2.1.0.aar\\jars\libs\room-common-java8-2.1.0.jar] (filtered)
>Reading program jar [C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\viewpager-1.0.0.aar\\jars\classes.jar] (filtered)
>Reading program jar [C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\loader-1.0.0.aar\\jars\classes.jar] (filtered)
>Reading program jar [C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\activity-1.0.0.aar\\jars\classes.jar] (filtered)
>Reading program jar [C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\customview-1.0.0.aar\\jars\classes.jar] (filtered)
>Reading program jar [C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\core-1.1.0.aar\\jars\classes.jar] (filtered)
>Reading program jar [C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\versionedparcelable-1.1.0.aar\\jars\classes.jar] (filtered)
>Reading program jar [C:\Users\Administrator\.gradle\caches\moles-2\files-2.1\androidx.collection\collection\1.1.0\\collection-1.1.0.jar] (filtered)
>Reading program jar [C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\lifecycle-livedata-2.0.0.aar\\jars\classes.jar] (filtered)
>Reading program jar [C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\lifecycle-livedata-core-2.0.0.aar\\jars\classes.jar] (filtered)
>Reading program jar [C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\core-runtime-2.0.1.aar\\jars\classes.jar] (filtered)
>Reading program jar [C:\Users\Administrator\.gradle\caches\moles-2\files-2.1\androidx.room\room-common\2.1.0\\room-common-2.1.0.jar] (filtered)
>Reading program jar [C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\sqlite-framework-2.0.1.aar\\jars\classes.jar] (filtered)
>Reading program jar [C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\sqlite-2.0.1.aar\\jars\classes.jar] (filtered)
>Reading program jar [C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\lifecycle-service-2.0.0.aar\\jars\classes.jar] (filtered)
>Reading program jar [C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\lifecycle-runtime-2.1.0.aar\\jars\classes.jar] (filtered)
>Reading program jar [C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\lifecycle-viewmodel-2.1.0.aar\\jars\classes.jar] (filtered)
>Reading program jar [C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\savedstate-1.0.0.aar\\jars\classes.jar] (filtered)
>Reading program jar [C:\Users\Administrator\.gradle\caches\moles-2\files-2.1\androidx.lifecycle\lifecycle-common\2.1.0\\lifecycle-common-2.1.0.jar] (filtered)
>Reading program jar [C:\Users\Administrator\.gradle\caches\moles-2\files-2.1\androidx.arch.core\core-common\2.1.0\\core-common-2.1.0.jar] (filtered)
>Reading program jar [C:\Users\Administrator\.gradle\caches\moles-2\files-2.1\androidx.annotation\annotation\1.1.0\\annotation-1.1.0.jar] (filtered)
>Reading program jar [C:\Users\Administrator\.gradle\caches\moles-2\files-2.1\com.google.guava\listenablefuture\1.0\\listenablefuture-1.0.jar] (filtered)
>Reading program jar [F:\dartSpace\flutter\jiddspace\nfc\build\flutter_downloader\intermediates\intermediate-jars\release\classes.jar] (filtered)
>Reading program jar [F:\dartSpace\flutter\jiddspace\nfc\build\shared_preferences\intermediates\intermediate-jars\release\classes.jar] (filtered)
>Reading program jar [F:\dartSpace\flutter\jiddspace\nfc\build\url_launcher\intermediates\intermediate-jars\release\classes.jar] (filtered)
>Reading program jar [F:\dartSpace\flutter\jiddspace\nfc\build\sqflite\intermediates\intermediate-jars\release\classes.jar] (filtered)
>Reading program jar [F:\dartSpace\flutter\jiddspace\nfc\build\connectivity\intermediates\intermediate-jars\release\classes.jar] (filtered)
>Reading program jar [F:\dartSpace\flutter\jiddspace\nfc\build\path_provider\intermediates\intermediate-jars\release\classes.jar] (filtered)
>Reading program jar [F:\dartSpace\flutter\jiddspace\nfc\build\package_info\intermediates\intermediate-jars\release\classes.jar] (filtered)
>Reading program directory [F:\dartSpace\flutter\jiddspace\nfc\build\app\intermediates\javac\release\compileReleaseJavaWithJavac\classes] (filtered)
>Reading program jar [F:\dartSpace\flutter\jiddspace\nfc\build\app\intermediates\transforms\mergeJavaRes\release\0.jar] (filtered)
>Reading library jar [C:\Users\Administrator\.gradle\caches\moles-2\files-2.1\androidx.annotation\annotation\1.0.0\\annotation-1.0.0.jar] (filtered)
>Reading library jar [E:\work_tool\sdk\android-sdk-windows\platforms\android-28\android.jar]
>Reading library jar [E:\work_tool\sdk\android-sdk-windows\build-tools\28.0.3\core-lambda-stubs.jar]
>Reading library jar [E:\work_tool\sdk\android-sdk-windows\platforms\android-28\optional\org.apache.http.legacy.jar]
>Reading library jar [E:\work_tool\sdk\android-sdk-windows\platforms\android-28\optional\android.test.mock.jar]
>Reading library jar [E:\work_tool\sdk\android-sdk-windows\platforms\android-28\optional\android.test.base.jar]
>Reading library jar [E:\work_tool\sdk\android-sdk-windows\platforms\android-28\optional\android.test.runner.jar]
>Initializing...
>Warning: io.flutter.embedding.android.FlutterView: can't find referenced method 'android.graphics.Insets getSystemGestureInsets()' in library class android.view.WindowInsets
>Warning: io.flutter.embedding.android.FlutterView: can't find referenced class android.graphics.Insets
>Warning: io.flutter.embedding.android.FlutterView: can't find referenced class android.graphics.Insets
>Warning: io.flutter.embedding.android.FlutterView: can't find referenced class android.graphics.Insets
>Warning: io.flutter.embedding.android.FlutterView: can't find referenced class android.graphics.Insets
>Warning: io.flutter.embedding.android.FlutterView: can't find referenced class android.graphics.Insets
>Warning: io.flutter.embedding.android.FlutterView: can't find referenced class android.graphics.Insets
>Warning: io.flutter.view.FlutterView: can't find referenced method 'android.graphics.Insets getSystemGestureInsets()' in library class android.view.WindowInsets
>Warning: io.flutter.view.FlutterView: can't find referenced class android.graphics.Insets
>Warning: io.flutter.view.FlutterView: can't find referenced class android.graphics.Insets
>Note: io.flutter.view.AccessibilityViewEmbedder$ReflectionAccessors: can't find dynamically referenced class android.util.LongArray
>Warning: io.flutter.view.FlutterView: can't find referenced class android.graphics.Insets
>Warning: io.flutter.view.FlutterView: can't find referenced class android.graphics.Insets
>Warning: io.flutter.view.FlutterView: can't find referenced class android.graphics.Insets
>Warning: io.flutter.view.FlutterView: can't find referenced class android.graphics.Insets
>Note: there were 1 unresolved dynamic references to classes or interfaces.
> You should check if you need to specify additional program jars.
> (http://proguard.sourceforge.net/manual/troubleshooting.html#dynamicalclass)
>Warning: Exception while processing task java.io.IOException: Please correct the above warnings first.
>Thread(Tasks limiter_1): destruction
>Warning: there were 12 unresolved references to classes or interfaces.
> You may need to add missing library jars or update their versions.
> If your code works fine without the missing classes, you can suppress
> the warnings with '-dontwarn' options.
> (http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedclass)
>Warning: there were 2 unresolved references to library class members.
> You probably need to update the library versions.
> (http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedlibraryclassmember)
>
>FAILURE: Build failed with an exception.
>
>* What went wrong:
>Execution failed for task ':app:'.
>> Job failed, see logs for details
>
>* Try:
>Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
>
>* Get more help at https://help.gradle.org
>
>BUILD FAILED in 4m 23s
>Running Gradle task 'assembleRelease'...
>Running Gradle task 'assembleRelease'... Done 264.4s (!)
>*******************************************************************************************
>The Gradle failure may have been because of AndroidX incompatibilities in this Flutter app.
>See https://goo.gl/CP92wY for more information on the problem and how to fix it.
>*******************************************************************************************
>Gradle task assembleRelease failed with exit code 1
E. apk反編譯後怎麼植入自己的sdk
一.寫一個簡單的添加廣告Android程序,
1.添加廣告SDK,在主配置文件添加相應許可權
2.創建一個廣告VIEW並添加到頁面中
二。反編譯剛剛寫好的APK
1.找到我們添加ad的反編譯代碼,和對應的JAR反編譯文件
三,反編譯要加入Ad的APK(目標)
1.修改主配置文件添加相應許可權,添加adSDK的反編譯文件。
2.將添加ad的反編譯代碼拷貝到對應的頁面。
四,重新打包,簽名
F. re從零開始的反編譯教程
寫在開頭,引用很喜歡的一句話: 要麼學!要麼不學!學和不學之間沒有中間值 不學就放棄,學就要去認真的學! --致選擇
為了回溯編譯過程(或對程序進行逆向工程),我們使用各種工具來撤銷匯編和編譯過程,這些工具就叫反匯編器和反編譯器。反匯編器撤銷匯編過程,因此我們可以得到匯編語言形式的輸出結果。反編譯器則以匯編語言甚至是機器語言為輸入,其輸出結果為高級語言。
數組的表示方式是:在基本類型前加上前中括弧「[」,例如int數組和float數組分別表示為:[I、[F;對象的表示則以L作為開頭,格式是 LpackageName/objectName;
(注意必須有個分號跟在最後),例如String對象在smali中為: Ljava/lang/String; ,其中 java/lang 對應 java.lang 包,String就是定義在該包中的一個對象。或許有人問,既然類是用 LpackageName/objectName; 來表示,那類裡面的內部類又如何在smali中引用呢?
答案是:在 LpackageName/objectName/subObjectName 的 subObjectName 前加 $ 符號。
方法的定義一般為: Func-Name (Para-Type1Para-Type2Para-Type3...)Return-Type
注意參數與參數之間沒有任何分隔符,同樣舉幾個例子就容易明白
無序列表的使用,在符號"-"後加空格使用。如下:
https://www.jianshu.com/p/1c54c1ccf5cc
https://www.cnblogs.com/onelikeone/p/7594177.html
解決:點擊進去jd-gui,刪除試一試。再不行換最新版本
解析結束後進行編譯報錯
解決方法: https://blog.csdn.net/fuchaosz/article/details/104800802
Failed parse ring installPackageLI: Targeting R+ (version 30 and above) requires the resources.arsc of installed APKs to be stored uncompress
解決方法:
降低gradle里版本,若出現
signatures do not match the previously installed version; ,
使用adb install命令在手機上安裝app時,遇到這個報錯。原因是新裝的app和手機上現有的舊版app沖突了。
解決方法:刪除手機上原來的app,再重新安裝即可。
可是轉念一想如果反編譯的apk都是Version 30 R+以上,難道我解壓後挨個改一遍gradle?太徹淡了,一定有解決方法,所以有了下面探究出現這個問題的解決方法:既然報錯是資源文件高版本不支持,而且沒有4位對齊,那麼不編譯資源文件就好了
APK簽名工具之jarsigner和apksigner:
https://blog.csdn.net/xzytl60937234/article/details/89088215?utm_medium=distribute.pc_relevant.none-task-blog-js_landingword-1&spm=1001.2101.3001.4242
利用apktool反編譯apk,並且重新簽名打包:
https://blog.csdn.net/qq_21007661/article/details/109851522?utm_medium=distribute.pc_relevant.none-task-blog-js_title-4&spm=1001.2101.3001.4242
驗證apktool能否使用
apktool -r d apk名字.apk,不反編譯資源文件,為什麼這么做,先挖個坑
錯誤提示沒有4位對齊和不支持30版本以上的資源文件。所有嘗試不編譯資源文件
解決4位對齊的方法:
查看當前目錄,生成了新文件:abc.keystor
使用JarSigner對apk進行簽名,命令如下
jarsigner -verbose -keystore abc.keystore -signedjar testx.apk src.apk abc.keystore
直接反編譯的apk產生上述錯誤
但是只編譯資源文件的apk安裝時
發現沒有使用V2進行簽名,這時候進行V2簽名, (apksigner,默認同時使用V1和V2簽名 )
所以先對只編譯資源文件的apk進行V2嘗試看能否成功
重復1(進行apktool -r d apk名字.apk)-->2 -->3 -->4( 不使用jarsigner而使用apksigner )
將生成的abc.keystore和打包回的apk( apktoolapp-debugdist 里的app-debug.apk)放入 C:Users aowei.lianAppDataLocalAndroidSdkuild-tools30.0.3 下,因為Android studio的SDK下有apksigner.bat.
對jarsigner只是apk進行了V1簽名;在Android7.0引入了V2簽名,因此,當進入sdk25.0.0及後續版本,會發現一個apksigner.bat執行腳本。
我們可以通過apksigner進行V2簽名,當然,apksigner默認是同時支持V1與V2的,於是:
學習了公鑰和密鑰的使用和區別,使用私鑰的加密演算法稱為對稱加密演算法,這種演算法實現是接收方和發送方公用一道密鑰,優點是效率高,缺點是安全性差,如果被第三人得知密鑰則信息泄露,由此衍生了公鑰加密演算法,也就是非對稱加密演算法,這個演算法是接收方給發送方公鑰,發送方用公鑰加密後發給接收方,接受方再用私鑰解密。這樣即使所有人知道公鑰也不會造成信息泄露。缺點是效率非常低。
此外了解了RSA簽名的大致過程,發送方擁有公鑰和私鑰,對信息進行摘要然後把摘要通過密鑰進行簽名,然後把簽名和信息一起發出去,那麼如何驗證該信息就是發送方發出的呢,這時候就使用到了公鑰驗證,通過公鑰對信息進行解簽,然後使用一樣的摘要演算法得到摘要,如果得到的摘要和解簽後的內容一致則說明是發送方發出。
總結就是公鑰加密,私鑰解密。公鑰驗證,私鑰簽名
RSA 密碼體制是一種公鑰密碼體制,公鑰公開,私鑰保密,它的加密解密演算法是公開的。由公鑰加密的內容可以並且只能由私鑰進行解密,而由私鑰加密的內容可以並且只能由公鑰進行解密。也就是說,RSA 的這一對公鑰、私鑰都可以用來加密和解密,並且一方加密的內容可以由並且只能由對方進行解密。
因為公鑰是公開的,任何公鑰持有者都可以將想要發送給私鑰持有者的信息進行加密後發送,而這個信息只有私鑰持有者才能解密。
它和加密有什麼區別呢?因為公鑰是公開的,所以任何持有公鑰的人都能解密私鑰加密過的密文,所以這個過程並不能保證消息的安全性,但是它卻能保證消息來源的准確性和不可否認性,也就是說,如果使用公鑰能正常解密某一個密文,那麼就能證明這段密文一定是由私鑰持有者發布的,而不是其他第三方發布的,並且私鑰持有者不能否認他曾經發布過該消息。故此將該過程稱為「簽名」。
Android 簽名機制 v1、v2、v3
進入JDK/bin, 輸入命令
參數:
進入Android SDK/build-tools/SDK版本, 輸入命令
參數:
例如:
最後安裝加 -t :
附上參考鏈接:
https://blog.csdn.net/A807296772/article/details/102298970
配置NDK的時候如果按鈕是灰色的,手動配置
直接在javac後面指定編碼是UTF-8就是了。
需要注意的是要加上* -classpath .其中classpath後面的一個黑點是不能省略的。
編譯好後如何導入so庫
成功運行後發現lib目錄下已經apk編進去so了
https://www.52pojie.cn/thread-732298-1-1.html
本節所有到的工具和Demo
IDA
鏈接: https://pan..com/s/15uCX8o6tTSSelgG_RN7kBQ
Demo
鏈接: https://pan..com/s/1vKC1SevvHfeI7f0d2c6IqQ
找到so並打開它 因為我的機型是支持arm的所以我這里打開的是armeabi文件夾下的so 如果機型是x86模式的那麼這里要打開x86模式下的libJniTest.so
編譯過程:
按住鍵盤組合鍵 shift + f12 打開字元串窗口 這個窗口將會列舉出so中所包含的所有字元串 因為上節課我們只編寫了一個字元串 所以這里只有一個hello 52pojie! 如果打開的是x86的so這里還會有一些.so 但是字元串只有這一個
滑鼠點在hello 52pojie!字元串上,打開 Hex mp窗口,修改hello 52pojie!對應內存地址的內容
關於字元對應的16進制可以在網路搜索ascii碼表 找到字元所對應的16進制
因為我要把hello 52pojie!修改成hello world! 是不是只要找到每個字元所對應的hex修改就好了
這里我看到 hello 52pojie!對應的hex是:68 65 6C 6C 6F 20 35 32 70 6F 6A 69 65 21
我在ascii碼表上找到world所對應的十六進制是:77 6F 72 6C 64
所以hello world! 對應的十六進制是:68 65 6C 6C 6F 20 77 6F 72 6C 64 21
注意編輯的時候游標暫停的位置只有先輸入字母才能更改成功,修改好後 右鍵Apply changes應用
退出後保存
此時已經so修改完畢
大功告成,hello 52pojie! --> hello world!
G. 安卓反編譯出來的代碼如何修改重新生成APK
反編譯步驟:
1.
下載apktool
並設置環境變數
2.
命令行進入apk目錄執行:apktool
d
xx.apk
(如果遇到一些錯誤說明apk做了防破解處理)
3.
執行成功後會生成xx文件夾,進入xx文件夾修改需要修改的內容,如果需要修改代碼,進入xx\smali\裡面,需要懂一些smali語法
4.
修改完後回到命令行,執行:apktool
b
xx
,會在xx文件夾裡面生成一個dist文件夾,裡面的apk就是回編譯的,這個apk是沒有簽名的
5.
下載網上的簽名工具對apk簽名,完了就可以安裝了(如果你下載了源碼或者sdk,裡面自帶一個signapk也可以簽名)
