如何把ndk编译出来的可执行文件伪装成so打包到apk中

如何把ndk编译出来的可执行文件伪装成so打包到apk中,第1张

ndk编译出来的共享库,eclipse会自动打包到apk中,而编译出来的可执行文件则不会。 要想可执行文件自动被打包到apk中,可以把文件名改成libxxx.so的形式,伪装成so,这样就会被打包进apk。 但是每次编译之后都改一下名字,太麻烦, 写个脚本吧,又有arm, arm

ndk编译出来的共享库,eclipse会自动打包到apk中,而编译出来的可执行文件则不会。

要想可执行文件自动被打包到apk中,可以把文件名改成libxxx.so的形式,伪装成so,这样就会被打包进apk。

但是每次编译之后都改一下名字,太麻烦,

写个脚本吧,又有arm, armv7, x86的麻烦事,

想试着改LOCAL_MODULE_FILENAME来试试,NDK又不允许。

于是稍微看了下NDK的编译脚本,发现如下解决办法。

NDK是通过在Android.mk文件中include $(BUILD_EXECUTABLE)来编译可执行文件,其实就是调用了一个已经写好的脚本——build-executable.mk。(编译脚本都在NDK_ROOT/build/core目录里面)

仔细看脚本的调用过程可以发现,脚本一开始先检查一下变量合法性(前面改LOCAL_MODULE_FILENAME的方法在这里过不去),最终调用include$(BUILD_SYSTEM)/build-module.mk来编译。

于是研究这个脚本,找到决定编译输出的变量,在调用最终的编译脚本之前改成想要的就可以了。

最终我的方案如下:

1. 为了不破坏ndk本来的脚本,将build-executable.mk拷贝一份放在自己的工程目录下面,在倒数第三行插入一句?$(evalLOCAL_BUILT_MODULE := $(TARGET_OUT)/$(MY_LOCAL_MODULE_FILENAME))

2. 在自己的Android.mk文件中定义MY_LOCAL_MODULE_FILENAME变量,当然值就是你想要的文件名啦

3. 编译时不调用系统的include$(BUILD_EXECUTABLE), 而改调用自己的脚本(就是上面拷贝出来且做了修改的那个脚本),为了方便,你可以给自己的脚本定义一个变量来指向它。

就是这样。

写得比较乱,贴几段关键代码吧。

修改后的build-executable.mk代码。

LOCAL_BUILD_SCRIPT := BUILD_EXECUTABLE

LOCAL_MAKEFILE := $(local-makefile)

$(call check-defined-LOCAL_MODULE,$(LOCAL_BUILD_SCRIPT))

$(call check-LOCAL_MODULE,$(LOCAL_MAKEFILE))

$(call check-LOCAL_MODULE_FILENAME)

# we are building target objects

my := TARGET_

$(call handle-module-filename,,)

$(call handle-module-built)

$(eval LOCAL_BUILT_MODULE := $(TARGET_OUT)/$(MY_LOCAL_MODULE_FILENAME))

LOCAL_MODULE_CLASS := EXECUTABLE

include $(BUILD_SYSTEM)/build-module.mk

14行就是我们加的那一行。

上面的文件放在jni根目录,跟目录下的Android.mk代码:

MY_BUILD_EXECUTABLE := $(JNI_ROOT)/build-executable.mk

include $(call all-subdir-makefiles)

需要编译可执行文件的模块这样写:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES := ...

LOCAL_MODULE := xxx

MY_LOCAL_MODULE_FILENAME := libxxx.so

LOCAL_C_INCLUDES := ...

LOCAL_LDLIBS:=-L$(SYSROOT)/usr/lib -llog

LOCAL_CFLAGS := -fPIC

include $(MY_BUILD_EXECUTABLE)。

首先你必须把你的1.apk的包名设置为2.apk的包名,这样安装的2.apk的时候就会安装失败(同包名已存在,安装失败)

反编译2.apk查看AndroidManifest.xml里都有哪些intent-filter和Activity, 找到你希望替代2.apk中的Activity, 修改1.apk源码AndroidManifest.xml, 添加上相同的intent-filter或Activity, 这样, 打开2.apk或是其中的Activity就走到1.apk的实现了。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8051484.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存