Android SO(动态库)---安全防护

在日常的APP开发过程中我们都会遇到安全相关的问题,针对不同的安全需求会有不同的解决方案。那么我们今天来看看与Android动态库相关的安全问题。

今天我们以AndroidSO工程为基础,通过实际的例子来解决一些常见的安全需求。

动态库被第三方APP非法使用

我们辛辛苦苦开发了一个动态库,最终却被非授权的第三方APP用了,那么不是很尴尬嘛。

那么如何防止我们的动态库被第三方非法使用呢?客官往下看~

非授权使用的问题本质上是因为我们的动态库没有做验签功能,接下来就带大家实现对SO调用的签名验证功能。

敏感字符串信息可见

native-lib-static.cpp的JNI函数代码如下。

JNIEXPORT jstring JNICALL
Java_com_demon_so_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    std::string hello = "Hello from static register jni function";
    return env->NewStringUTF(hello.c_str());
}

上面这个图片是我通过IDA(逆向分析工具)打开static-dynamic-so工程生成的libnative-lib.so后截图的信息。

so_string_visible

我们可以很容易看到字符串的信息。与我们代码中的字符串一模一样,很完整被解析出来。

是不是突然感觉很没有安全感,这么随意。。。

我们这个字符串没有什么价值,但是如果我们存放了敏感的字符串信息又如何是好呢?

简单的解决办法有如下两种:

001 定义char数组

字符串信息以数组的方式初始化,比如以下写法:

JNIEXPORT jstring JNICALL
Java_com_demon_so_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    char* hello = ((char[]){'H','e','l','l','o',' ','f','r','o','m',' ','s','t','a','t','i','c',' ','r','e','g','i','s','t','e','r',' ','j','n','i',' ','f','u','n','c','t','i','o','n'});
    return env->NewStringUTF(hello);
}

看到这么一长串的代码是不是要疯了,我擦,一个完整的字符串居然被凌乱掉了。这么写代码要疯掉了。

办法总是有的嘛......

用一个python脚本就可以解决问题了

content = "Hello from static register jni function"
length = len(content)
str = "((char[]){"
for i in range(length):
    str = str+'\''+content[i]+'\''
    if i !=(length-1):
        str=str+','
str = str+"})"
print str

最终输出内容如下:

((char[]){'H','e','l','l','o',' ','f','r','o','m',' ','s','t','a','t','i','c',' ','r','e','g','i','s','t','e','r',' ','j','n','i',' ','f','u','n','c','t','i','o','n'});

注意这种写法只能用在函数内部

002 敏感字符串信息加密

加密分为对称加密非对称加密,常见的对称加密包括DESAES等,非对称加密包括RSA背包算法等。

非对称加密的缺点是加密和解密花费时间长、速度慢,只适合对少量数据进行加密。

对称加密算法的优点是算法公开、计算量小、加密速度快、加密效率高。

在项目针对可以采用DES进行对称加密即可。

JNI函数信息可见

每一个动态库都会包含符号表信息,通过objdump工具在命令行中可以查看到动态库最终包含的符号表。

采用静态方式注册JNI函数会最终会包含在符号表中,那么我们就可以从符号表中看到以Java_开头的所有JNI函数。那么别人就会通过JNI函数来最终分析APK中相应Class对应的动态库文件,进而分析整个APK以及动态库的调用逻辑。

针对AndroidSO工程中的static-dynamic-so工程,我们可以分别设置CMakeLists.txtDYNAMIC_FLAG的取值。

DYNAMIC_FLAG是一个布尔值,为true的时候动态库最终包含native-lib-dynamic.cpp,相反包含native-lib-static.cpp

native-lib-dynamic.cpp采用动态注册JNI的方式,而native-lib-static.cpp采用静态注册JNI的方式。

执行objdump -D libnative-lib.so | grep Java_*
可以查看以Java_开头的符号表信息。

native-lib-static.cpp静态注册输出结果如下:

4118:   52 00 00 ea     b   #328 <Java_com_demon_so_MainActivity_stringFromJNI+0x28>

native-lib-dynamic.cpp动态注册JNI函数输出结果如下:

_ZN7_JavaVM6GetEnvEPPvi:

对比上边的输出结果我们可以很容易看出动态注册的JNI函数就无法看到我们定义的JNI函数了。

采用动态注册的方式即可解决JNI函数可见的问题。

objdump的用法点击直达

Reference:

  1. c/c++字符串混淆方案总结
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,198评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,663评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,985评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,673评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,994评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,399评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,717评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,407评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,112评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,371评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,891评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,255评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,881评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,010评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,764评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,412评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,299评论 2 260

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,544评论 25 707
  • 一,apk以进程的形式运行,进程的创建是由zygote。 参考文章《深入理解Dalvik虚拟机- Android应...
    Kevin_Junbaozi阅读 2,662评论 0 12
  • 老刘今年八十八。 人老了,就想儿女们常回家看看。 拄个棍儿,老刘来到大儿子家,唠叨开了:“老大,你看我都这把年纪了...
    半都阅读 386评论 4 9
  • 早上走的匆忙,到了公司才发现,手机没在包里,第一感觉就是:丢了,被偷了,完蛋了:(,打个电话,通了,才想起是早上走...
    心中的那片海_阅读 310评论 0 1
  • 【柒月影语】20170703学习力践行Day43 今天放学路上,看到广告牌上的字“美甲”竟然识认出来,“四川麻辣烫...
    暖小柒阅读 146评论 0 0