// Somehow, a == NO_ADDRESS has come to mean decode anything not already decoded void FrontEnd::decode(Prog *prog, ADDRESS a) { if (a != NO_ADDRESS) { std::cout<<"decode main at a!= NOADDRESS\n"; prog->setNewProc(a); if (VERBOSE) LOG << "starting decode at address " << a << "\n"; UserProc* p = (UserProc*)prog->findProc(a); if (p == NULL) { if (VERBOSE) LOG << "no proc found at address " << a << "\n"; return; } if (p->isLib()) { LOG << "NOT decoding library proc at address 0x" << a << "\n"; return; } std::ofstream os; PROGMAP::const_iterator it; for (Proc *pProc = prog->getFirstProc(it); pProc != NULL; pProc = prog->getNextProc(it)) { std::cout<<"Proc name Before main "<<pProc->getName()<<"\n"; } processProc(a, p, os); for (Proc *pProc = prog->getFirstProc(it); pProc != NULL; pProc = prog->getNextProc(it)) { std::cout<<"Proc name After decode main "<<pProc->getName()<<"\n"; } p->setDecoded(); } else { // a == NO_ADDRESS std::cout<<"decode child proc\n"; bool change = true; while (change) { change = false; PROGMAP::const_iterator it; for (Proc *pProc = prog->getFirstProc(it); pProc != NULL; pProc = prog->getNextProc(it)) { if (pProc->isLib()) continue; UserProc *p = (UserProc*)pProc; if (p->isDecoded()) continue; // undecoded userproc.. decode it change = true; std::ofstream os; std::cout<<"Signature Before :"<<p->getSignature()->prints()<<"\n"; int res = processProc(p->getNativeAddress(), p, os); std::cout<<"Signature After :"<<p->getSignature()->prints()<<"\n"; //std::cout<<"Sig type:"<<p->getSignature()->prints()<<"\n"; std::cout<<"process Proc finish< res:"<<res<<"\n"; if (res == 1) p->setDecoded(); else break; // Break out of the loops if not decoding children if (Boomerang::get()->noDecodeChildren) break; } if (Boomerang::get()->noDecodeChildren) break; } } prog->wellForm(); }
/** * Parse and execute a command supplied in interactive mode. * * \param argc The number of arguments. * \param argv Pointers to the arguments. * * \return A value indicating what happened. * * \retval 0 Success * \retval 1 Faillure * \retval 2 The user exited with \a quit or \a exit */ int Boomerang::parseCmd(int argc, const char **argv) { static Prog *prog = NULL; if (!strcmp(argv[0], "decode")) { if (argc <= 1) { std::cerr << "not enough arguments for cmd\n"; return 1; } const char *fname = argv[1]; Prog *p = loadAndDecode(fname); if (p == NULL) { std::cerr << "failed to load " << fname << "\n"; return 1; } prog = p; #if USE_XML } else if (!strcmp(argv[0], "load")) { if (argc <= 1) { std::cerr << "not enough arguments for cmd\n"; return 1; } const char *fname = argv[1]; XMLProgParser *p = new XMLProgParser(); Prog *pr = p->parse(fname); if (pr == NULL) { // try guessing pr = p->parse((outputPath + fname + "/" + fname + ".xml").c_str()); if (pr == NULL) { std::cerr << "failed to read xml " << fname << "\n"; return 1; } } prog = pr; } else if (!strcmp(argv[0], "save")) { if (prog == NULL) { std::cerr << "need to load or decode before save!\n"; return 1; } XMLProgParser *p = new XMLProgParser(); p->persistToXML(prog); #endif } else if (!strcmp(argv[0], "decompile")) { if (argc > 1) { Proc *proc = prog->findProc(argv[1]); if (proc == NULL) { std::cerr << "cannot find proc " << argv[1] << "\n"; return 1; } if (proc->isLib()) { std::cerr << "cannot decompile a lib proc\n"; return 1; } int indent = 0; ((UserProc*)proc)->decompile(new ProcList, indent); } else { prog->decompile(); } } else if (!strcmp(argv[0], "codegen")) { if (argc > 1 ) { Cluster *cluster = prog->findCluster(argv[1]); if (cluster == NULL) { std::cerr << "cannot find cluster " << argv[1] << "\n"; return 1; } prog->generateCode(cluster); } else { prog->generateCode(); } } else if (!strcmp(argv[0], "move")) { if (argc <= 1) { std::cerr << "not enough arguments for cmd\n"; return 1; } if (!strcmp(argv[1], "proc")) { if (argc <= 3) { std::cerr << "not enough arguments for cmd\n"; return 1; } Proc *proc = prog->findProc(argv[2]); if (proc == NULL) { std::cerr << "cannot find proc " << argv[2] << "\n"; return 1; } Cluster *cluster = prog->findCluster(argv[3]); if (cluster == NULL) { std::cerr << "cannot find cluster " << argv[3] << "\n"; return 1; } proc->setCluster(cluster); } else if (!strcmp(argv[1], "cluster")) { if (argc <= 3) { std::cerr << "not enough arguments for cmd\n"; return 1; } Cluster *cluster = prog->findCluster(argv[2]); if (cluster == NULL) { std::cerr << "cannot find cluster " << argv[2] << "\n"; return 1; } Cluster *parent = prog->findCluster(argv[3]); if (parent == NULL) { std::cerr << "cannot find cluster " << argv[3] << "\n"; return 1; } parent->addChild(cluster); } else { std::cerr << "don't know how to move a " << argv[1] << "\n"; return 1; } } else if (!strcmp(argv[0], "add")) { if (argc <= 1) { std::cerr << "not enough arguments for cmd\n"; return 1; } if (!strcmp(argv[1], "cluster")) { if (argc <= 2) { std::cerr << "not enough arguments for cmd\n"; return 1; } Cluster *cluster = new Cluster(argv[2]); if (cluster == NULL) { std::cerr << "cannot create cluster " << argv[2] << "\n"; return 1; } Cluster *parent = prog->getRootCluster(); if (argc > 3) { parent = prog->findCluster(argv[3]); if (cluster == NULL) { std::cerr << "cannot find cluster " << argv[3] << "\n"; return 1; } } parent->addChild(cluster); } else { std::cerr << "don't know how to add a " << argv[1] << "\n"; return 1; } } else if (!strcmp(argv[0], "delete")) { if (argc <= 1) { std::cerr << "not enough arguments for cmd\n"; return 1; } if (!strcmp(argv[1], "cluster")) { if (argc <= 2) { std::cerr << "not enough arguments for cmd\n"; return 1; } Cluster *cluster = prog->findCluster(argv[2]); if (cluster == NULL) { std::cerr << "cannot find cluster " << argv[2] << "\n"; return 1; } if (cluster->hasChildren() || cluster == prog->getRootCluster()) { std::cerr << "cluster " << argv[2] << " is not empty\n"; return 1; } if (prog->clusterUsed(cluster)) { std::cerr << "cluster " << argv[2] << " is not empty\n"; return 1; } unlink(cluster->getOutPath("xml")); unlink(cluster->getOutPath("c")); assert(cluster->getParent()); cluster->getParent()->removeChild(cluster); } else { std::cerr << "don't know how to delete a " << argv[1] << "\n"; return 1; } } else if (!strcmp(argv[0], "rename")) { if (argc <= 1) { std::cerr << "not enough arguments for cmd\n"; return 1; } if (!strcmp(argv[1], "proc")) { if (argc <= 3) { std::cerr << "not enough arguments for cmd\n"; return 1; } Proc *proc = prog->findProc(argv[2]); if (proc == NULL) { std::cerr << "cannot find proc " << argv[2] << "\n"; return 1; } Proc *nproc = prog->findProc(argv[3]); if (nproc != NULL) { std::cerr << "proc " << argv[3] << " already exists\n"; return 1; } proc->setName(argv[3]); } else if (!strcmp(argv[1], "cluster")) { if (argc <= 3) { std::cerr << "not enough arguments for cmd\n"; return 1; } Cluster *cluster = prog->findCluster(argv[2]); if (cluster == NULL) { std::cerr << "cannot find cluster " << argv[2] << "\n"; return 1; } Cluster *ncluster = prog->findCluster(argv[3]); if (ncluster == NULL) { std::cerr << "cluster " << argv[3] << " already exists\n"; return 1; } cluster->setName(argv[3]); } else { std::cerr << "don't know how to rename a " << argv[1] << "\n"; return 1; } } else if (!strcmp(argv[0], "info")) { if (argc <= 1) { std::cerr << "not enough arguments for cmd\n"; return 1; } if (!strcmp(argv[1], "prog")) { std::cout << "prog " << prog->getName() << ":\n"; std::cout << "\tclusters:\n"; prog->getRootCluster()->printTree(std::cout); std::cout << "\n\tlibprocs:\n"; PROGMAP::const_iterator it; for (Proc *p = prog->getFirstProc(it); p; p = prog->getNextProc(it)) if (p->isLib()) std::cout << "\t\t" << p->getName() << "\n"; std::cout << "\n\tuserprocs:\n"; for (Proc *p = prog->getFirstProc(it); p; p = prog->getNextProc(it)) if (!p->isLib()) std::cout << "\t\t" << p->getName() << "\n"; std::cout << "\n"; return 0; } else if (!strcmp(argv[1], "cluster")) { if (argc <= 2) { std::cerr << "not enough arguments for cmd\n"; return 1; } Cluster *cluster = prog->findCluster(argv[2]); if (cluster == NULL) { std::cerr << "cannot find cluster " << argv[2] << "\n"; return 1; } std::cout << "cluster " << cluster->getName() << ":\n"; if (cluster->getParent()) std::cout << "\tparent = " << cluster->getParent()->getName() << "\n"; else std::cout << "\troot cluster.\n"; std::cout << "\tprocs:\n"; PROGMAP::const_iterator it; for (Proc *p = prog->getFirstProc(it); p; p = prog->getNextProc(it)) if (p->getCluster() == cluster) std::cout << "\t\t" << p->getName() << "\n"; std::cout << "\n"; return 0; } else if (!strcmp(argv[1], "proc")) { if (argc <= 2) { std::cerr << "not enough arguments for cmd\n"; return 1; } Proc *proc = prog->findProc(argv[2]); if (proc == NULL) { std::cerr << "cannot find proc " << argv[2] << "\n"; return 1; } std::cout << "proc " << proc->getName() << ":\n"; std::cout << "\tbelongs to cluster " << proc->getCluster()->getName() << "\n"; std::cout << "\tnative address " << std::hex << proc->getNativeAddress() << std::dec << "\n"; if (proc->isLib()) std::cout << "\tis a library proc.\n"; else { std::cout << "\tis a user proc.\n"; UserProc *p = (UserProc*)proc; if (p->isDecoded()) std::cout << "\thas been decoded.\n"; //if (p->isAnalysed()) // std::cout << "\thas been analysed.\n"; } std::cout << "\n"; return 0; } else { std::cerr << "don't know how to print info about a " << argv[1] << "\n"; return 1; } } else if (!strcmp(argv[0], "print")) { if (argc <= 1) { std::cerr << "not enough arguments for cmd\n"; return 1; } Proc *proc = prog->findProc(argv[1]); if (proc == NULL) { std::cerr << "cannot find proc " << argv[1] << "\n"; return 1; } if (proc->isLib()) { std::cerr << "cannot print a libproc.\n"; return 1; } ((UserProc*)proc)->print(std::cout); std::cout << "\n"; return 0; } else if (!strcmp(argv[0], "exit")) { return 2; } else if (!strcmp(argv[0], "quit")) { return 2; } else if (!strcmp(argv[0], "help")) { helpcmd(); return 0; } else { std::cerr << "unknown cmd " << argv[0] << ".\n"; return 1; } return 0; }