首页
论坛
课程
招聘
[原创]NDK入门一:关于设备的ABI(小白白文,做好心理准备)
2021-4-27 10:17 7655

[原创]NDK入门一:关于设备的ABI(小白白文,做好心理准备)

2021-4-27 10:17
7655

跟着肉师傅学习逆向已经来到了第二个月,这个月只要是Native开发相关的内容,分享下,记录下自己学会的姿势。这是一篇小小小白白白白白白文,希望各位爱看不看。

一 查看自己设备支持的ABI

不同的 Android 设备使用不同的 CPU,而不同的 CPU 支持不同的指令集。CPU 与指令集的每种组合都有专属的应用二进制接口 (ABI)。
那么我们自己手上的设备支持什么ABI呢?
ABI官方文档

1.查看Android设备的CPU信息

uname -a 或者 getprop ro.product.cpu.abi

1
2
3
4
5
6
7
8
9
MacBook-Pro-3 ॐ  ~:
4329 ◯  adb shell
walleye:/ $ uname -a
Linux localhost 4.4.88-g3acf2d53921d #1 SMP PREEMPT Thu May 17 20:37:50 UTC 2018 aarch64
walleye:/ $ adb shell getprop ro.product.cpu.abi
/system/bin/sh: adb: not found
127|walleye:/ $ getprop ro.product.cpu.abi
arm64-v8a
walleye:/ $

AArch64是ARMv8 架构的一种执行状态。这说明我手机架构是arm64-v8a

2.查看自己设备支持的ABI

查看Android API官方文档可知,SUPPORTED_ABIS包含了我们想要的信息
图片描述

An ordered list of ABIs supported by this device. The most preferred ABI is the first element in the list.
此设备支持的abi的有序列表。最常用的ABI是列表中的第一个元素。

 

从官方文档中得知 我们想要的信息存在类Build的域中

方法一 在android程序中打印出Build.SUPPORTED_ABIS
1
Log.d("abi", Arrays.toString(Build.SUPPORTED_ABIS)); //显示出支持的指令集类型
方法二 使用Objection的Wallbreaker插件查看android.os.Build中域的值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
┌──(rootkali)-[~]
└─# objection -g com.example.myeasymd5 explore
Using USB device `Google Pixel 2`
Agent injected and responds ok!
 
     _   _         _   _
 ___| |_|_|___ ___| |_|_|___ ___
| . | . | | -_|  _|  _| | . |   |
|___|___| |___|___|_| |_|___|_|_|
      |___|(object)inject(ion) v1.8.4
 
     Runtime Mobile Exploration
        by: @leonjza from @sensepost
 
[tab] for command suggestions
com.example.myeasymd5 on (google: 8.1.0) [usb] # plugin load /root/.objection/plugins/Wallbreaker                         
Loaded plugin: wallbreaker
com.example.myeasymd5 on (google: 8.1.0) [usb] # plugin wallbreaker classdump android.os.Build                            
 
package android.os
 
class Build {
 
        /* static fields */
        static String BOARD; => walleye
        static String BOOTLOADER; => mw8998-002.0069.00
        static String BRAND; => google
        static String CPU_ABI; => arm64-v8a
        static String CPU_ABI2; =>
        static String DEVICE; => walleye
        static String DISPLAY; => OPM4.171019.021.Q1
        static String FINGERPRINT; => google/walleye/walleye:8.1.0/OPM4.171019.021.Q1/4820346:user/release-keys
        static String HARDWARE; => walleye
        static String HOST; => abfarm087
        static String ID; => OPM4.171019.021.Q1
                .
                .
                .
        static String[] SUPPORTED_32_BIT_ABIS; => armeabi-v7a,armeabi
        static String[] SUPPORTED_64_BIT_ABIS; => arm64-v8a
        static String[] SUPPORTED_ABIS; => arm64-v8a,armeabi-v7a,armeabi
                .
                .
                .
 
}

可以看到该设备支持3类ABI,其中最常用的是arm64-v8a

二 让android项目编译出指定架构的.so文件

我们已经知道了自己的手机的CPU架构、所能支持的ABI。那么如何让我们创建的Android项目编译出指定架构的.so文件呢?
ABI官方文档中可以看到,可以通过以下方式,指定abi构建
图片描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
android {
    compileSdkVersion 30
    buildToolsVersion "30.0.3"
 
    defaultConfig {
        applicationId "com.example.myeasymd5"
        minSdkVersion 16
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"
 
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                cppFlags ""
            }
 
        }
        ndk {
            abiFilters 'arm64-v8a','armeabi-v7a','x86','x86_64'
        }
    }

我添加上所有的系统架构

三 查看对应的SO文件

将手机与studio断开,构建项目。

1.查看APP包中的libnative-lib.so的生产情况

将生成的APP解包。在lib目录下发现了4个文件夹,每个文件夹下都有一个libnative-lib.so文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
┌──(rootkali)-[~/Desktop/2W/2021_4/4_6/myeasymd5/app/build/outputs/apk/debug]
└─# 7z x app-debug.apk
┌──(rootkali)-[~/Desktop/2W/2021_4/4_6/myeasymd5/app/build/outputs/apk/debug]
└─# cd lib                                                                                                                
┌──(rootkali)-[~/Desktop/2W/2021_4/4_6/myeasymd5/app/build/outputs/apk/debug/lib]                                       
└─# ls                                                                                                                    
arm64-v8a  armeabi-v7a  x86  x86_64                                                                                       
┌──(rootkali)-[~/Desktop/2W/2021_4/4_6/myeasymd5/app/build/outputs/apk/debug/lib]                                       
└─# ls *                                                                                                                  
arm64-v8a:                                                                                                                
libnative-lib.so
 
armeabi-v7a:
libnative-lib.so
 
x86:
libnative-lib.so
 
x86_64:
libnative-lib.so

查看arm64-v8a/libnative-lib.so

1
2
3
4
5
6
┌──(rootkali)-[~/Desktop/2W/2021_4/4_6/myeasymd5/app/build/outputs/apk/debug/lib]
└─# file arm64-v8a/libnative-lib.so                                                                                       
arm64-v8a/libnative-lib.so: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, BuildID[sha1]=09923a1f2e02c8b38405370b1f50d3a08268a57e, stripped
┌──(rootkali)-[~/Desktop/2W/2021_4/4_6/myeasymd5/app/build/outputs/apk/debug/lib]
└─# md5sum arm64-v8a/libnative-lib.so                                                                                     
3d8db1ebf3f19e53757bf54e58af5c40  arm64-v8a/libnative-lib.so

2.在设备中查看此APP的libnative-lib.so

1
2
3
4
adb install -t -r app-debug.apk
adb shell
su
cd /data/app/com.example.myeasymd5-pRV3rFlJQouTngYj3x0ssg==/lib

将该APP安装到设备上后,并进入到该APP目录下的lib文件夹下,发现有一个叫arm64的文件夹,里面有个libnative-lib.so的文件
图片描述
那么问题来了,这个so文件会是原本项目中编译出来那4个中的那一呢?

1
2
3
4
walleye:/data/app/com.example.myeasymd5-pRV3rFlJQouTngYj3x0ssg==/lib/arm64 # file libnative-lib.so                                                                                             
libnative-lib.so: ELF shared object, 64-bit LSB arm64, BuildID=09923a1f2e02c8b38405370b1f50d3a08268a57e, for Android 21, built by NDK r21b (6352462), stripped
walleye:/data/app/com.example.myeasymd5-pRV3rFlJQouTngYj3x0ssg==/lib/arm64 # md5sum libnative-lib.so                                                                                           
3d8db1ebf3f19e53757bf54e58af5c40  libnative-lib.so

通过MD5计算,发现该文件的结果等于源项目中arm64-v8a/libnative-lib.so文件。 这也正验证官方文档上面说的,最常用的是arm64-v8a

四 那么我要是在build.gradle中去掉'arm64-v8a'呢?

图片描述
解包发现只生产了3种架构的so文件
图片描述
将APP安装并查看设备上的so文件
图片描述
发现,此so文件就是armeabi-v7a下面的so文件

五 那么我们再将'armeabi-v7a'去掉呢

图片描述
将apk解包,依旧看到对应的生产的so文件
图片描述但是这个APP是安装不到我的手机上的
图片描述

六 那么我们什么也不写呢

图片描述
项目默认生成了所有类型的so
图片描述
那么如果安装到设备生后,肯定是对应的arm64-v8a
图片描述

六 总结

首先感谢您能看到这里!
您要是问我看了这篇文章,您能干什么,其实,您不能多干些什么惊天地泣鬼神的事情。只是您可能会明白怎样让您开发的NDK项目去适配不同架构的设备。


[招生]科锐逆向工程师培训46期预科班将于 2023年02月09日 正式开班

最后于 2021-4-27 11:03 被网虫Spider编辑 ,原因: 修改图片,修改语句
收藏
点赞1
打赏
分享
最新回复 (3)
雪    币: 665
活跃值: 活跃值 (4020)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
suuuuu 活跃值 2021-4-28 14:44
2
0
吃瓜群众路过
雪    币: 124
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
万里星河 活跃值 2021-4-29 12:12
3
0
支持一下
雪    币: 335
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
逆向小白白 活跃值 2022-2-22 19:51
4
0
卧槽,竟然看到你在水贴?喵了喵了
游客
登录 | 注册 方可回帖
返回