본문 바로가기

보안/모바일

IDA 내부에서 python을 이용하여 함수 이름 출력하기

앱 진단중 루팅 탐지로 인해 계속 막혀 있다. 

아마도 frida 탐지를 하는거 같은데 ida를 통해 솔루션을 실행을 시키면 좌측에 function name이라며 서브루틴들을 확인할수 있다. 

과연 이들중 frida 탐지 전까지 사용되는 서브루틴들을 확인하고 싶다 

그러면 해당 서브루틴들을 frida로 일일히 attach를 하려고 하는데 일일히 받아쓰기에는 서브루틴들이 굉장히 많기에 

꽤나 많은 시간들을 써야한다 

그래서 ida 내부에 python을 사용하여 자동화를 하려고 한다. 

 

File > Script command > scripting language 를 python으로 바꾸기 

from idautils import *
from idaapi import *
from idc import *

ea=BeginEA()

for funcAddr in Functions( SegStart(ea), SegEnd(ea)):
	funcName = GetFunctionName(funcAddr)
	if funcName.find("main")>0 or funcName.find("Main")>0 or funcName.find("Start")>0 or funcName.find("start"):
		print("Function %s is at 0x%x" %(funcName,funcAddr) )

 

interceptor attach 코드까지 바로 출력하기 

from idautils import *
from idaapi import *
from idc import *

ea=BeginEA()

for funcAddr in Functions( SegStart(ea), SegEnd(ea)):
	funcName = GetFunctionName(funcAddr)
	if funcName.find("main")>0 or funcName.find("Main")>0 or funcName.find("Start")>0 or funcName.find("start"):
				print("Interceptor.attach(moduleName.add(0x%x), {\n\t onEnter: function (args) {\n\t\t console.log(\" %s work!\");},\n\t onLeave: function (retval) {} \n});"%(funcAddr,funcName))

 

결과물

 

 

참고 

https://speedr00t.tistory.com/592

 

ida ][ 함수 이름과 주소 출력해보기2

ida ][ 함수 이름과 주소 출력해보기2 ■ 사용법 youtu.be/DOLvi1PmBpA

speedr00t.tistory.com

 

방법2.

#1. ida에 서브루틴이름만 싹 복사해서 aaa.log 텍스트 파일에 붙여넣기 
#2. cmd 창에 python make_all_method_hook.py  실행 
#3. 생성된 all_method_hook.js 파일 확인 
def open_ida_file():
    ida_data = open("./aaa.log", "r")
    result = []
    for line in ida_data:
        result.append(line.split())
        #print(line)
    #print(result)
    return result
def sub_filter(ida_list):
    sub_list = []
    for line in ida_list:
        if "sub_" in line[0]:
            if "nullsub_" not in line[0]:
                sub_list.append(line[0])
                #print(line[0])
    return sub_list
def sub_filter2(ida_list):
    sub_list = []
    for line in ida_list:
        if "sub_" in line[3]:
            if "nullsub_" not in line[3]:
                sub_list.append(line[3])
    return sub_list    

def create_sub_hook(sub_list):
    tmp_list = []
    tmpp = []
    result_sub = []

    for index in sub_list:
        tmp_list = index.split("sub_")
        tmpp.append(tmp_list[1])
    for index in tmpp:
        #필터 잘못 검 모든 문자열에서 0이 사라짐
        #result_sub.append(re.sub('[^1-9A-Z]', '', index))
        result_sub.append(index.lstrip('0'))
    save_hook = open('all_method_hook.js', 'w')
    for index in result_sub:
        code = "var module_base = Module.findBaseAddress('libAppIron-jni_v2.13.19.so');\n" #Module.findBaseAddress('XXXX')  -> ipa 압축 해제 후 바이너리 파일명으로 수정
        code += "var custom = module_base.add("
        code += "0x{}".format(index)
        code += ");\n"
        code += "Interceptor.attach(custom, {"
        code += "\n\t onEnter: function (args) {\n\t\t"
        code += "console.log('"
        code += "0x{}".format(index)
        code += " Call');\n"
        code += "\t}\n"
        code += "});"
        save_hook.write(code + "\n")
    save_hook.close()
ida_list = open_ida_file()
sub_list = sub_filter(ida_list)
create_sub_hook(sub_list)

# 생성된 js 파일 내용 바깥에 if (ObjC.available) {try { <내용> }catch(err) { console.log("[!] Exception2: " + err.message); }} 추가
반응형