2013-10-09 3 views
0

바이너리에 의해 호출 된 외부 함수를 링크 된 공유 라이브러리와 어떻게 대응시킬 수 있는지 알고 싶습니다. 예를 들어, 디스 어셈블 된 파일의 .plt 섹션을 보는 함수를 볼 수 있으며 ldd를 사용하여 사용 된 라이브러리를 찾을 수 있습니다 (또는 ELF 동적 섹션 참조). 하지만 각 기능을 라이브러리와 어떻게 대응시킬 수 있습니까?공유 라이브러리로 외부 함수 일치하기

+0

또는 공유 라이브러리). –

답변

0

나는 Laszio 힌트를 따랐고 바이너리 파일 이름을 얻는 작은 파이썬 함수를 만들었고 ldd와 nm을 섞어 공유 라이브러리에 외부 함수가 들어있는 사전을 반환합니다. 아마 조금 혼란이지만, 여기에 :) 작동이 코드입니다

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 
당신은 바이너리 (프로그램 내에서 덤프에게`nm` 유틸리티를 심볼 정의와 외부 기호의 참조 목록을 사용할 수 있습니다
관련 문제