有时候开发需要底层的库的支持,或者不方便写在java层的代码都有移到native底层写的需求,最终都是以.so动态库的形式调用,但是有一个问题,使用“nm -A/D libNativeExampleActivity.so”会看到你的.so库中所有写的方法,而如果你的函数命名很规范,并且面向对象,这样会显著降低别人破解的难度,因此最好需要做一下方法混淆,增加一些难度。
也许有人说底层库没必要去做这些,但是如果你的客户端和服务端的一些通信加密算法等重要信息放在这里的话,就需要尽一切手段增加其难度。
看一下这个文件:
#!/usr/bin/python
#coding=utf-8
import random
'''
获取所有需要替换的text,返回一个字典
'''
def get_macros_dict():
my_file = open('macros.txt', 'r')
lines = my_file.readlines()
return [line.strip() for line in lines]
def get_text_dict(s, l):
if l == 1:
return [x for x in s]
else:
return [x+y for x in s for y in get_text_dict(s, l-1)]
def get_min_power(s, min_value):
l = len(s)
i = 1
while l ** i < min_value:
i += 1
print 'i = ', i
return i
'''
字符串s:所用到的替换的字符,不要有重复
'''
def test(s):
macros = get_macros_dict()
power = get_min_power(s, len(macros))
replaces = get_text_dict(s, power+1)
for macro in macros:
if macro is '':
continue
x = random.randint(0, len(replaces)-1)
r = replaces[x]
replaces.remove(r)
print '//'+'-'*10 + macro + '-'*10
print '#ifndef', macro
print ' #define' ,macro ,r
print '#endif'
if __name__ == '__main__':
print '\n'
test('Oo')
print '\n'
上面的程序会打开一个macros.txt文件,然后根据输入的混淆字符,生成混淆方法的宏。比如macros.txt文件中有如下文本:
funcionA
funcionB
funcionC
funcionD
funcionE
运行python macros_replace.py 后会打印出下列宏替换文本:
//----------funcionA----------
#ifndef funcionA
#define funcionA OOoo
#endif
//----------funcionB----------
#ifndef funcionB
#define funcionB ooOO
#endif
//----------funcionC----------
#ifndef funcionC
#define funcionC oOoo
#endif
//----------funcionD----------
#ifndef funcionD
#define funcionD ooOo
#endif
//----------funcionE----------
#ifndef funcionE
#define funcionE oOOO
#endif
然后把这部分直接粘贴到C/C++文件中重新编译即可。
这里还有一个心得,就是输入字符最好是两个看起来类似的字符,比如oO,增加识别记忆难度。