当前位置:首页 » 安卓系统 » 反编译android

反编译android

发布时间: 2025-10-12 11:34:50

㈠ Android/Linux so动态库分析和反编译

Android/Linux so动态库分析和反编译的答案如下

一、so动态库文件头分析

  1. 本质与查看方法

    • so动态库文件的本质是ELF文件。
    • 可以通过将armeabiv7a类型的so动态库文件放置于Linux系统路径中,然后在Linux终端进入文件目录,执行readelf h xxxx.so命令来查看文件头部信息。
  2. 文件头部信息详解

    • Magic/e_ident[]:用于标识ELF目标文件。
    • Class:标记文件类型为32位ELF格式。
    • Data:指示数据组织格式,如小端格式。
    • Version:当前文件头版本号,通常为1。
    • OS/ABI:描述操作系统类。
    • ABI Version:ABI版本号,通常为0。
    • Type/e_type:指明文件类型,这里是共享库。
    • Machine/e_machine:显示机器平台类型,如ARM类型。
    • Entry point address/e_entry:表示程序入口地址。
    • Stars of program headers/e_phoff:记录程序头表文件偏移。
    • Stars of section headers/e_shoff:记录节区头文件偏移。
    • Flags/e_flags:处理器相关标识。
    • Size of this header/e_ehsize:表示ELF头文件大小。
    • Number of program headers/e_phnum:表示程序头表条目数量。
    • Size of section headers/shentsize:表示节区头表条目大小。
    • Number of section headers/e_shnum:为节区头表条目数量。
    • 节区头字符表索引/e_shstrndx:其他相关信息。

二、反编译so动态库方法

  1. 使用IDA软件

    • 解压IDA安装包,并按照ReadMe文档进行安装,注意避免中文路径。
    • 安装完成后,打开IDA软件,点击“GO”按钮。
    • 拖拽so动态库文件至工作区,点击“OK”按钮等待反编译完成。
  2. 反编译后查看内容

    • 反编译后,工作区会显示包含机器码的Hex View1窗口、汇编代码的IDA ViewA窗口以及保存函数名的Function window窗口。
    • 可以通过双击函数名定位到对应函数的汇编代码。
    • 使用Ctrl+F搜索特定函数名,双击函数名查看汇编代码。
    • 按下F5键,可以将汇编代码转换为C代码进行查看。

以上就是对Android/Linux so动态库进行文件头分析和反编译的详细步骤和方法。

㈡ 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的,不敢保证其它版本包括以后版本的玩法都一样。

㈢ 濡备綍鍙岖紪璇悭ndroid搴旂敤骞堕吨鏂版墦鍖

涓.鐪媋ndroid镄勬簮浠g爜

銆銆1)灏咥pkd.apk 鐢▃ip瑙e帇钖庯纴鍑虹幇浜嗕竴涓猚lasses.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)杩涘叆鍒癫ex2jar鐩褰曚腑锛岃繍琛屾儏鍐靛备笅锛
銆銆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.
銆銆鍦╝pk镓鍦ㄧ殑鐩褰曚细鍑虹幇 classes_dex2jar.jar 鏂囦欢銆
銆銆3) 鐢↗D-GUI瀵筳ar鍖呰繘琛屾煡鐪嬶纴鍙浠ユ煡鐪嬫簮鏂囦欢

銆銆浜.鍙岖紪璇悭pk

銆銆1.鍦ㄣ涓嬭浇銆APKTOOL涓镄勪笁涓鏂囦欢锛坅apt.exe銆乤pktool.bat銆乤pktool.jar锛夎В铡嬬缉鍒颁綘镄刉indows瀹夎呯洰褰曚笅锛屼互鏂逛究浣跨敤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.杩涘叆鍒瘾pktool.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婧愭枃浠讹纸鏄鐢╯mali璇瑷鍐欑殑锛屽彲浠ュ圭収java鐪嬶级銆

銆銆涓.APKTOOL镄勪娇鐢

銆銆1).decode
銆銆璇ュ懡浠ょ敤浜庤繘琛屽弽缂栬疟apk鏂囦欢锛屼竴鑸鐢ㄦ硶涓
銆銆apktool d

銆銆浠h〃浜呜佸弽缂栬疟镄刟pk鏂囦欢镄勮矾寰勶纴链濂藉啓缁濆硅矾寰勶纴姣斿侰:\MusicPlayer.apk
銆銆浠h〃浜嗗弽缂栬疟钖庣殑鏂囦欢镄勫瓨鍌ㄤ綅缃锛屾瘆濡侰:\MusicPlayer
銆銆濡傛灉浣犵粰瀹氱殑宸茬粡瀛桦湪锛岄偅涔堣緭鍏ュ畬璇ュ懡浠ゅ悗浼氭彁绀轰綘锛屽苟涓旀棤娉曟墽琛岋纴闇瑕佷綘閲嶆柊淇鏀瑰懡浠ゅ姞鍏-f鎸囦护
銆銆apktool d 钬揻

銆銆杩欐牱灏变细寮鸿岃嗙洊宸茬粡瀛桦湪镄勬枃浠
銆銆2).build
銆銆璇ュ懡浠ょ敤浜庣紪璇戜慨鏀瑰ソ镄勬枃浠讹纴涓鑸鐢ㄦ硶涓
銆銆apktool b

銆銆杩欓噷镄
銆銆灏辨槸鍒氭墠浣犲弽缂栬疟镞惰緭鍏ョ殑
銆銆锛埚侰:\MusicPlayer锛,杈揿叆杩栾屽懡浠ゅ悗锛屽傛灉涓鍒囨e父锛屼綘浼氩彂鐜癈:\MusicPlayer鍐呭氢简2涓鏂囦欢澶筨uild鍜宒ist锛屽叾涓鍒嗗埆瀛桦偍镌缂栬疟杩囩▼涓阃愪釜缂栬疟镄勬枃浠朵互鍙婃渶缁堟墦鍖呯殑apk鏂囦欢銆
銆銆3).install-framework
銆銆璇ュ懡浠ょ敤浜庝负APKTool瀹夎呯壒瀹氱殑framework-res.apk鏂囦欢锛屼互鏂逛究杩涜屽弽缂栬疟涓浜涗笌ROM鐩镐簰渚濊禆镄𪞝PK鏂囦欢銆傚叿浣撴儏鍐佃风湅甯歌侀梾棰

銆銆锲.smali涓巎ava婧愮爜瀵圭収锛屽苟锅氩嚭鐩稿簲镄勪慨鏀

銆銆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;
銆銆}

銆銆}

銆銆瀵瑰簲镄剆mali婧愪唬镰侊细
銆銆.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

銆銆阃氲繃瀵规瘆鍙浠ョ湅鍒帮纴甯搁噺鏄娌℃湁蹇呭彉镄勶纴鍙浠ユ牴鎹镄剆mali镄勮娉曪纴杩涜岀浉搴旂殑淇鏀

銆銆浜.3銆佹墦鍖呫佺惧悕鍜屽畨瑁呬慨鏀瑰悗镄刟pk

銆銆淇鏀瑰畬浜嗭纴灏卞彲浠ユ墦鍖呭洖apk浜嗐傛墽琛屼互涓嫔懡浠わ细
銆銆apktool b decode_dir
銆銆鍦╩ygame鐩褰曚笅镄刣ist鍦ㄤ细鐪嫔埌镓揿寘濂界殑apk銆
銆銆褰撶劧锛岀幇鍦ㄤ竴鑸鏄镞犳硶瀹夎呯殑锛屽洜涓篴pk杩樻病链夌惧悕銆备笅闱㈠氨𨱒ョ惧悕銆傜惧悕闇瑕乲eystore鏂囦欢锛屾垜宸茬粡链変笓鐢ㄧ殑keystore浜嗭纴濡傛灉杩樻病链夛纴璇峰弬阒呰繖閲岃繘琛岀敓鎴愩
銆銆镓ц屼互涓嫔懡浠や负閲嶆柊缂栬疟镄刴y_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 姝g‘钖楋纻
銆銆[钖]锛 y

銆銆杈揿叆镄勪富瀵嗙爜
銆銆锛埚傛灉鍜 keystore 瀵嗙爜鐩稿悓锛屾寜锲炶溅锛夛细

銆銆D:\developer\tools\test_apk\new\decode\dist>jarsigner -verbose -keystore demo.keystore Apkd.apk demo.keystore
銆銆杈揿叆瀵嗛挜搴撶殑鍙d护鐭璇锛
銆銆姝e湪娣诲姞锛 META-INF/MANIFEST.MF
銆銆姝e湪娣诲姞锛 META-INF/DEMO_KEY.SF
銆銆姝e湪娣诲姞锛 META-INF/DEMO_KEY.RSA
銆銆姝e湪绛惧悕锛 res/drawable-hdpi/ic_launcher.png
銆銆姝e湪绛惧悕锛 res/drawable-mdpi/ic_launcher.png
銆銆姝e湪绛惧悕锛 res/drawable-xhdpi/ic_launcher.png
銆銆姝e湪绛惧悕锛 res/drawable-xxhdpi/ic_launcher.png
銆銆姝e湪绛惧悕锛 res/layout/activity_main.xml
銆銆姝e湪绛惧悕锛 res/menu/main.xml
銆銆姝e湪绛惧悕锛 AndroidManifest.xml
銆銆姝e湪绛惧悕锛 classes.dex
銆銆姝e湪绛惧悕锛 resources.arsc

銆銆D:\developer\tools\test_apk\new\decode\dist>
銆銆鍒版や负姝锛屼慨鏀瑰悗镄刟pk鍙浠ユe父镄勫畨瑁呬简锛屼笉杩囷纴鍦ㄥ畨瑁呬箣鍓嶏纴蹇呴’瑕佸厛鍗歌浇浠ュ墠镄刟pk锛屼笉鑳界洿鎺ユ浛鎹锛埚洜涓虹惧悕涓崭竴镙凤级

热点内容
wlan密码怎么设置 发布:2025-10-12 14:12:12 浏览:829
微信置顶聊天折叠怎么设置安卓 发布:2025-10-12 14:01:48 浏览:885
小米5软件访问网络设置在哪里设置 发布:2025-10-12 13:38:04 浏览:998
自如密码锁初始密码一般多少 发布:2025-10-12 13:27:03 浏览:623
java重新输入 发布:2025-10-12 12:51:19 浏览:846
c语言中的排序 发布:2025-10-12 11:55:21 浏览:599
手机怎么做脚本 发布:2025-10-12 11:55:19 浏览:896
ftp打开文件命令 发布:2025-10-12 11:54:29 浏览:970
配置好的车有什有什么 发布:2025-10-12 11:47:05 浏览:491
老是显示服务器无响应为什么 发布:2025-10-12 11:41:05 浏览:78