首页
学习
活动
专区
工具
TVP
发布

宋宝华:一个简单的python脚本看透Linux程序对库的依赖

在下今天写了一个小小的python程序,可以在完全不看源代码的情况下,分析a如果调用b.so的时候,会引用b.so的哪些函数,它的用法如下:

./symbol-dep.py-sa-db.so

把a作为-s参数,把b.so作为-d参数。

它的原理如下:

用nm -D --undefined-only命令可以列出一个程序依赖的需要动态链接的库函数,譬如:

用nm -D --defined-only命令可以列出一个动态链接库给别人提供的函数,譬如:

我们只要把a依赖的函数,与b.so供给的函数中,求一个交集,即可在完全没有源代码的情况下,知道a会call到b.so的哪些函数。核心源代码如下(部分用了省略号方便阅读):

#!/usr/bin/python3

import sys, getopt, os

def main(argv):

...

try:

opts, args = getopt.getopt(...)

except getopt.GetoptError:

...

for opt, arg in opts:

if opt == '-h':

p...

elif opt in ("-s", "--sfile"):

srcfile = arg

elif opt in ("-d", "--dfile"):

dstfile = arg

# get the symbols srcfile depends on

src=os.popen("nm -D --undefined-only "+srcfile)

srclist=src.read().splitlines()

for sline in srclist:

neededsymbols.append(sline.split()[-1])

# get the symbols dstfile exports

dst=os.popen("nm -D --defined-only "+dstfile)

dstlist=dst.read().splitlines()

for dline in dstlist:

exportedsymbols.append(dline.split()[-1])

# intersection of src and dest

for symbol in neededsymbols:

if symbol in exportedsymbols:

print(symbol)

if __name__ == "__main__":

main(sys.argv[1:])

完整源代码高亮后如下:

运行结果如下:

范例中a.out对应的源代码如下:

so easy。

希望你能够喜欢这个小工具。

(欢迎支持原创^-^)

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181220B0WFV000?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券