asm.c
/**
* Reverse engineering on the fly
* todo: make it a module
*/
#include "compiler.h"
#include "string.h"
static uint32_t ror(uint32_t word, uint32_t count)
{
return word >> count | word << (32 - count);
}
static uint32_t decode_immediate_shifter_operand(uint32_t insn)
{
uint32_t inmed_8 = insn & 0xFF;
uint32_t rotate_imm = (insn & 0xF00) >> 7;
return ror(inmed_8, rotate_imm);
}
static int seems_to_be_string(char* addr)
{
int len = strlen(addr);
if (len > 4 && len < 100)
{
for (char* c = addr; *c; c++)
{
if (*c < 7 || *c > 127) return 0;
}
return 1;
}
return 0;
}
char* asm_guess_func_name_from_string(uint32_t addr)
{
for (uint32_t i = addr; i < addr + 4 * 20; i += 4 )
{
uint32_t insn = *(uint32_t*)i;
if( (insn & 0xFFFFF000) == 0xe28f2000 ) // add R2, pc, #offset - should catch strings passed to DebugMsg
{
int offset = decode_immediate_shifter_operand(insn);
int pc = i;
int dest = pc + offset + 8;
if (seems_to_be_string((char*) dest))
return (char*) dest;
}
}
return "";
}