IDAPythonのモジュール間で特定のインポート関数を効率的にスキャンする方法はありますか?


0

私は、最初にブレークポイントを_start、_main、またはmainに配置し、次にIDA Proデバッガを起動するスクリプトを作成しています。次に、 "kernel32.dll"を探しているモジュールを列挙し、最終的にモジュールベースアドレスからサイズアドレスにkernel32.dllをスキャンし、各行に関数名 "ExitProcess"をチェックし、見つかった場合はブレークポイントを配置するそれ。最後に、このブレークポイントまで実行する必要があります。

スクリプトが機能していません。それは、IDAは、反復4818の後、完全にProとベースと大きさで、いくつかの数学をやった後、私はモジュールの実際の大きさもこのスクリーンショットで見られるように離れていることに気づいフリーズ:

enter image description here サイズによると、74BF0000 + D0000 = 74CC0000しかし、わかるように、kernel32.dllはそれを遠くに写像しません。これは1つの問題ですが、IDA Proがフリーズして、47BF12D2に私たちを連れて来る過去4710のアドレスを反復した後にクラッシュする理由もわかりません。私のスクリプトは次のとおりです。

import time 
NULL = 0 
# possible refactor to just take the module object so base and size dont need to be passed in like this? 
def get_names(base, size, desired_name): 
    print "inside get_names" 
    print ("Base: %d Size: %d Desired Name: %s" % (base, size, desired_name)) 
    global NULL 
    current_address = base 
    i = 0 
    while current_address <= base+size: 
     print "Made it into current_address loop " 
     i += 1 
     print ("interation #: %d" % (i)) 
     # print hex(current_address) TODO: REMOVE 
     if desired_name in Name(current_address): 
      print "found %s" % (desired_name) 
      return current_address 
     time.sleep(0.02) 
     current_address = NextHead(current_address) 
    print "exiting get_names" 
    return NULL 

# Enumerate modules 
def find_import_routine(the_module, desired_name): 
    print "inside find_import routine" 
    for m in Modules(): 
     if the_module.lower() in m.name.lower(): 
      base = m.base 
      size = m.size 
      analyze_area(base, base+size) 
      begin_text = get_names(base, size, desired_name) 
      if begin_text: #check for null 
       add_bpt(begin_text,0,BPT_SOFT) 
       enable_bpt(begin_text,True) 
       continue_process() 
       GetDebuggerEvent(WFNE_SUSP,-1) 
       #del_bpt(initial_bp_ea) 
       return True #return the bp addr?? 
    print "exiting find_import routine" 
    return False 
def find_start(): 
    print "inside find_start routine" 
    global NULL 
    functions = idautils.Functions() 
    for f in functions: 
     name = get_func_name(f) 
     if name == 'start' or name == '_start' or name =='main' or name == '_main': 
      return f 
    print "exiting find)start" 
    return NULL 

def main(): 
    start_addr = find_start() 
    if start_addr: 
     idc.add_bpt(start_addr) 
     StartDebugger("","",""); 
     print "after StartDebugger()" 
     GetDebuggerEvent(WFNE_SUSP, -1) 
     print "after GetDebuggerEvent" 
     find_import_routine('kernel32.dll','ExitProcess') 
     print "After find_import_routine" 
    else: 
     print "Could not find a start routine. Exiting." 
if __name__ == "__main__": 
    main() 

スリープとプリントは、デバッグの目的でのみ使用されています。

0

これらのデバッグAPIは、私がC++プラグインで使用していたとしても、うまく機能しませんでした。あなたがイベントを処理するためにエンジンを作るために、たくさんのWait()をしなければならないようです。

  0

あなたは 'Wait()'と 'GetDebuggerEvent()'の違いを知っていますか? 12 12月. 172017-12-12 19:34:57

  0

はい、私は数週間前にそれを働かせようとしていましたが、IDAを逆転させてハングアップする場所を理解しましたが、デバッガイベントと逆アセンブリエンジンイベントの間に矛盾があり、本当の理由を見つけることを幸運。 13 12月. 172017-12-13 08:51:14