2015-10-06 1 views
0

IDApython fonctionne bien dans IDA pro dans la ligne de commande. Toutefois, en dehors de l'IDA pro dans un éditeur normal lorsque je compile le programme python avec idautis import Je reçois l'erreur:Comment importer des idautils en dehors de ida pro en utilisant python

« Aucun module nommé _idaapi »

from idautils import * 
from idaapi import * 

ea = BeginEA() 
for funcea in Functions(SegStart(ea), SegEnd(ea)): 
    functionName = GetFunctionName(funcea) 
    functionStart = paddAddr(hex(funcea)[2:]) 
    functionEnd = paddAddr(hex(FindFuncEnd(funcea))[2:]) 
    <REST OF THE CODE> 

comment exécuter le code python extérieur IDA pro?

Répondre

3

vous ne pouvez pas exécuter des scripts vraiment IDAPython en dehors de l'IDA, mais vous pouvez faire en sorte IDA est exécuté silencieux et ne pas afficher son interface graphique.

Dans vos scripts, vous devez rediriger stdout vers un fichier, par exemple:

import sys 
import idaapi 
import idc 
import os 

def stdout_to_file(output_file_name, output_dir=None): 
    '''Set stdout to a file descriptor 

    param: output_file_name: name of the file where standard output is written. 
    param: output_dir: output directory for output file, default to script directory. 

    Returns: output file descriptor, original stdout descriptor 
    ''' 
    # obtain this script path and build output path 
    if not output_dir: 
     output_dir = os.path.dirname(os.path.realpath(__file__)) 

    output_file_path = os.path.join(output_dir, output_file_name) 

    # save original stdout descriptor 
    orig_stdout = sys.stdout 

    # create output file 
    f = file(output_file_path, "w") 

    # set stdout to output file descriptor 
    sys.stdout = f 

    return f, orig_stdout 

def main(args): 
    # get original stdout and output file descriptor 
    f, orig_stdout = stdout_to_file("output.txt") 

    if idc.ARGV: 
     for i, arg in enumerate(idc.ARGV): 
      print "[*] arg[{}]: {}".format(i, arg) 

    # call something from IDA (get the original input file name from IDB) 
    print "[*] filename from IDB: {}".format(idaapi.get_root_filename()) 
    print("[*] done, exiting.") 

    # restore stdout, close output file 
    sys.stdout = orig_stdout 
    f.close() 

    # exit IDA 
    idc.Exit(0) 

if __name__ == "__main__": 
    main(sys.argv) 

ensuite sur la ligne de commande, vous pouvez appeler votre script IDAPython (en supposant l'IDA est dans votre PATH):

idaq.exe -A -S"C:\tmp\test_script.py foo bar" "C:\tmp\mydatabase.idb" 
  • -A est pour l'exécution de l'IDA silencieux
  • -S est pour le script path et les arguments de script
  • Le dernier argument est le chemin idb (ou utilisez -t pour générer un idb temporaire)

Vérifiez le fichier d'aide IDA pour obtenir une liste complète de toutes les options disponibles.

sortie, dans le fichier sortie.txt (la BID était à partir du fichier d'entrée 'calc.exe'):

[*] arg[0]: C:\tmp\test_script.py 
[*] arg[1]: foo 
[*] arg[2]: bar 
[*] filename from IDB: calc.exe 
[*] done, exiting. 

Vous pouvez également consulter le blog de rayons hex intitulé "Running scripts from the command line with idascript"