修改大型二进制库内部函数名的bash 脚本及其解释

这篇具有很好参考价值的文章主要介绍了修改大型二进制库内部函数名的bash 脚本及其解释。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.大型lib库重命名函数名字

迭代的方式对于大型二进制库改名字的功能脚本

会将源文件中的函数  add_(...) 修改成 nubia_add_(...) 的方式来调用

此脚本分配来修改,可以避免突破资源限制  ulimit -a;

保存为:redef_func_name_01.sh

chmod u+x redef_func_name.sh

如果使能 echo -L "$new"

那么,其中api_symbols=(  )中要写入本lib的公共的暴露出来的api函数名,否则都不能被调用。

#!/bin/bash


apitxt="./funclist.txt"
prefix_name="nubia_"

api_symbols=(  )

#1. 将 库文件的符号导出到本地文本文件
rm -rf ${apitxt}
nm $1 > ${apitxt}

#文本文件总行数
N=$(sed -n '$=' $apitxt)

#sed -n "300, 400" filename 注意p;读出文件的 第300行到第400行


for ((i=1; i<=$N; i+=1000))
do
j=$[i + 999]

#debug
#seg=($(sed -n "${i}, ${j}p" ${apitxt}))
#echo -e ${seg[@]}
#echo $i $j
#取出i行到j行,只保留T类型后面的文本,即库中源代码实现的函数名字,保存进internal_symbols中
internal_symbols=($(
    sed -n "${i}, ${j}p" $apitxt | sed '/^[0-9]\+ T /!d; s///' |
    sort | comm -13 <(printf "%s\n" "${api_symbols[@]}" | sort) -
))

#将 internal_symbols中的变量名字进一步修改成  --redefine-sym 原函数名=修改后的函数名 的方式,待后面丢给 objcopy 来调用
objcopy_args=($(
    printf "%s\n" "${internal_symbols[@]}" |
    while IFS= read -r sym; do
        new="${prefix_name}${sym}"
        # replace the symbol with a prefix
        echo --redefine-sym "$sym=$new"
        # make the symbol local, future
#        echo -L "$new"
    done
))
#执行更换名字动作
objcopy "${objcopy_args[@]}" $1
done

#$1 是脚本的第一个输入参数,即 libxxx.a

使用方式:

$ redef_func_name.sh libface.a

2.加密内部函数名

如果想隐藏加密内部函数名,可以将上述脚本的改名部分使用下面脚本替代:
#在之前的前缀名上,在加入一个前缀, add_() 变成 nicaibudao_nubia_add_(),在经过md5sum处理成“乱码”

more_prefix="nicaibudao_"

md5sum_args=($(
    printf "%s\n" "${private_symbols[@]}" |
    while IFS= read -r sym; do
        new="${more_prefix}$(echo "$sym" | md5sum | cut -d' ' -f1)"
        # replace the symbol with it's md5sum
        echo --redefine-sym "$sym=$new"
        # make the symbol local
        echo -L "$new"
    done
))

objcopy "${md5sum_args[@]}" $1

#$1 是脚本的第一个输入参数,即 libxxx.a

其中api_symbols=(  )中要写入本lib的公共的暴露出来的api函数名,否则都不能被调用,而且不知道函数名是什么。文章来源地址https://www.toymoban.com/news/detail-809065.html

3.小型库重命名

对于小型库,比如nm liblittle.a的信息只有几十或几百行等,可以使用国际友人的如下脚本:
priv.c 源文件中是 内部函数的定义,比如 float add_(float x, float y){ return x+y;}
interface.c 源文件中式 外部api函数定义,比如 float ADD(float a, float b){return add_(a, b);}
如果想隐藏 add_ 并且改名字,而将 ADD暴露出来

#!/bin/bash   

namespace="nubia_"

# compile to object files
gcc -c -o priv.o priv.c
gcc -c -o interface.o interface.c

# rename the object file so the names of files are not visible
nofilename="$(echo "nofilenames" | md5sum | cut -d' ' -f1).o"
echo ${nofilename}
ld -relocatable priv.o interface.o -o "$nofilename"

# create the static library
ar rcs static.a "$nofilename"

# list of interface symbols    
public_symbols=( ADD )

# list of private symbols - all symbols except interface symbols
private_symbols=($(
    nm static.a | sed '/^[0-9]\+ T /!d; s///' |
    sort | comm -13 <(printf "%s\n" "${public_symbols[@]}" | sort) -
))

# strip unused symbols, leave only interface symbols
strip_args=($(printf " -K %s " "${public_symbols[@]}"))
strip --strip-unneeded --strip-debug "${strip_args[@]}" static.a

# rename all private symbols with it's md5sum
objcopy_args=($(
    printf "%s\n" "${private_symbols[@]}" |
    while IFS= read -r sym; do
        new="${namespace}$(echo "$sym" | md5sum | cut -d' ' -f1)"
        # replace the symbol with it's md5sum
        echo --redefine-sym "$sym=$new"
        # make the symbol local
        echo -L "$new"
    done
))
objcopy "${objcopy_args[@]}" static.a

到了这里,关于修改大型二进制库内部函数名的bash 脚本及其解释的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包