0

バイナリによって呼び出される外部関数を、リンクされた共有ライブラリと一致させる方法を知りたいです。たとえば、逆アセンブルされたファイルの .plt セクションを見れば関数を確認でき、ldd を使用して (または ELF 動的セクションを見れば) 使用されているライブラリを見つけることができます。しかし、各関数をそのライブラリとどのように一致させることができますか?

4

1 に答える 1

0

私は Laszio のヒントに従い、バイナリ ファイル名を取得し、ldd と nm を組み合わせて外部関数と共有ライブラリを含む辞書を返す小さな Python 関数を作成しました。少し混乱するかもしれませんが、うまくいきます:)これがコードです

def get_dynamicOBJ(filename):
   p_nm = subprocess.Popen(["nm", "-D", filename], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
   result_nm = p_nm.stdout.readlines()
   p_ldd = subprocess.Popen(["ldd", filename], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
   result_ldd = p_ldd.stdout.readlines()
   dyn = {}

   for nm_out in result_nm:
       sym_entry = nm_out.split()
       if len(sym_entry) >= 2 and sym_entry[0 if len(sym_entry) == 2 else 1] == "U":
           sym = sym_entry[1 if len(sym_entry) == 2 else 2]
           for lld_out in result_ldd:
               lib_entry = lld_out.split()
               if "=>" in lld_out and len(lib_entry) > 3: # virtual library
                   lib = lib_entry[2]
                   ls_nm = subprocess.Popen(["nm", "-D", lib], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
                   result_lsnm = ls_nm.stdout.readlines()
                   for ls_nm_out in result_lsnm:
                       lib_symbol = ls_nm_out.split()
                       if len(lib_symbol) >= 2 and lib_symbol[0 if len(lib_symbol) == 2 else 1] == "T":                            
                           if sym == lib_symbol[1 if len(lib_symbol) == 2 else 2]:
                               dyn[sym] = lib

   return dyn
于 2013-10-09T22:53:36.610 に答える