ads: actually analyze *all* syscalls
This commit is contained in:
parent
ae1db62314
commit
11ca1cc2fc
44
shell/a.cpp
44
shell/a.cpp
|
@ -2,6 +2,7 @@
|
|||
#include "parser.h"
|
||||
#include "commands.h"
|
||||
#include "errors.h"
|
||||
#include "util.h"
|
||||
|
||||
#include <fxos/disassembly.h>
|
||||
#include <fxos/vspace.h>
|
||||
|
@ -228,51 +229,58 @@ static void ad_disassemble_all(VirtualSpace &space,
|
|||
std::vector<uint32_t> const &addresses, bool force)
|
||||
{
|
||||
std::vector<std::string> passes = { "cfg", "pcrel", "syscall" };
|
||||
int successes=0, errors=0;
|
||||
|
||||
for(auto pass: passes) {
|
||||
Timer timer;
|
||||
timer.start();
|
||||
|
||||
bool ok = true;
|
||||
uint32_t error_addr = -1;
|
||||
|
||||
if(pass == "cfg") {
|
||||
CfgPass p(space.disasm);
|
||||
for(uint32_t addr: addresses) {
|
||||
ok &= p.run(addr);
|
||||
if(!ok) { error_addr = addr; break; }
|
||||
printr("[cfg] Disassembling %08x...", addr);
|
||||
if(!p.run(addr)) {
|
||||
FxOS_log(ERR, "while processing %08x", addr);
|
||||
errors++;
|
||||
if(!force) break;
|
||||
}
|
||||
else successes++;
|
||||
}
|
||||
}
|
||||
else if(pass == "pcrel") {
|
||||
printr("[pcrel] Resolving PC-relative addressing modes...");
|
||||
PcrelPass p(space.disasm);
|
||||
ok = p.run();
|
||||
if(!ok) break;
|
||||
if(!p.run()) {
|
||||
errors++;
|
||||
if(!force) break;
|
||||
}
|
||||
}
|
||||
else if(pass == "syscall") {
|
||||
printr("[syscall] Finding syscall references...");
|
||||
OS *os = space.os_analysis();
|
||||
if(os) {
|
||||
SyscallPass p(space.disasm, os);
|
||||
ok = p.run();
|
||||
if(!ok) break;
|
||||
if(!p.run()) {
|
||||
errors++;
|
||||
if(!force) break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
FxOS_log(ERR, "unknown pass <%s>", pass);
|
||||
ok = false;
|
||||
break;
|
||||
}
|
||||
printf("\n");
|
||||
|
||||
timer.stop();
|
||||
FxOS_log(LOG, "Finished pass <%s> in %s", pass, timer.format_time());
|
||||
|
||||
if(!ok) {
|
||||
if(error_addr != (uint32_t)-1)
|
||||
FxOS_log(ERR, "entry %08x: pass <%s> failed", error_addr,pass);
|
||||
else
|
||||
FxOS_log(ERR, "pass <%s> failed", pass);
|
||||
if(!force)
|
||||
break;
|
||||
}
|
||||
if(errors && !force)
|
||||
break;
|
||||
}
|
||||
|
||||
printf("Successfully analyzed %d functions (%d errors)\n",
|
||||
successes, errors);
|
||||
}
|
||||
|
||||
static std::vector<uint32_t> parse_ad(Session &session, Parser &parser)
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
//---
|
||||
// fxos-shell.util: General application-independent utilities
|
||||
//---
|
||||
|
||||
#ifndef FXOS_UTIL_H
|
||||
#define FXOS_UTIL_H
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#define printr(fmt, ...) do { \
|
||||
printf("\x1b[K" fmt "\r", ##__VA_ARGS__); \
|
||||
fflush(stdout); \
|
||||
} while(0)
|
||||
|
||||
#endif /* FXOS_UTIL_H */
|
Loading…
Reference in New Issue