ads: actually analyze *all* syscalls

This commit is contained in:
Lephenixnoir 2022-04-03 21:36:06 +01:00
parent ae1db62314
commit 11ca1cc2fc
Signed by untrusted user: Lephenixnoir
GPG Key ID: 1BBA026E13FC0495
2 changed files with 41 additions and 18 deletions

View File

@ -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)

15
shell/util.h Normal file
View File

@ -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 */