mirror of
https://github.com/radareorg/radare2.git
synced 2025-04-18 09:29:57 +00:00
* Add rax2 -x to calculate string hash
* Use trim to avoid noisy chars in symbol names for egg/lang * Properly handle osx/w32 os strings in r_egg * Make string construction works in r_egg * Initial work on while() constructs
This commit is contained in:
parent
06e98dadb1
commit
168d38fc44
@ -5,10 +5,16 @@ all:
|
||||
|
||||
hello:
|
||||
rm -f a.out
|
||||
$R -s hello.r
|
||||
$R -s hello.r | tee hello.s
|
||||
$R -f mach0 -o a.out hello.r
|
||||
-./a.out ; RET=$$? ; if [ $$RET = 0 ]; then echo It Works ; else echo Oops.. Fail ; fi
|
||||
|
||||
hi:
|
||||
rm -f a.out
|
||||
$R -s hi.r
|
||||
$R -f mach0 -o a.out hi.r
|
||||
-./a.out ; RET=$$? ; if [ $$RET = 0 ]; then echo It Works ; else echo Oops.. Fail ; fi
|
||||
|
||||
customsyscall:
|
||||
rm -f a.out
|
||||
$R -s customsyscall.r
|
||||
|
@ -3,7 +3,11 @@ write@syscall(4);
|
||||
exit@syscall(1);
|
||||
|
||||
main@global(128) {
|
||||
.var0 = "hi!\n";
|
||||
write(1,.var0, 4);
|
||||
exit(0);
|
||||
.var0 = 4;
|
||||
.var4 = "Hello World\n";
|
||||
while (.var0) {
|
||||
write (1, .var4, 12);
|
||||
.var0 -= 1;
|
||||
}
|
||||
exit (0);
|
||||
}
|
||||
|
9
binr/ragg2/t/hi.r
Normal file
9
binr/ragg2/t/hi.r
Normal file
@ -0,0 +1,9 @@
|
||||
/* hello world in r_egg */
|
||||
write@syscall(4);
|
||||
exit@syscall(1);
|
||||
|
||||
main@global(128) {
|
||||
.var0 = "hi!\n";
|
||||
write(1,.var0, 4);
|
||||
exit(0);
|
||||
}
|
@ -1,7 +1,9 @@
|
||||
BIN=rarun2
|
||||
OBJ=main.o
|
||||
|
||||
all: ${OBJ}
|
||||
all: ${BIN}
|
||||
|
||||
${BIN}: ${OBJ}
|
||||
${CC} -o ${BIN} ${OBJ}
|
||||
|
||||
mrproper clean:
|
||||
|
@ -57,6 +57,7 @@ static int help () {
|
||||
" -s hexstr -> bin ; rax2 -s 43 4a 50\n"
|
||||
" -S bin -> hexstr ; rax2 -S C J P\n"
|
||||
" -V version ; rax2 -V\n"
|
||||
" -x hash string ; rax2 -x linux osx\n"
|
||||
" -h help ; rax2 -h\n");
|
||||
return R_TRUE;
|
||||
}
|
||||
@ -80,6 +81,9 @@ static int rax (char *str, int last) {
|
||||
case 'b':
|
||||
flags ^= 8;
|
||||
break;
|
||||
case 'x':
|
||||
flags ^= 16;
|
||||
break;
|
||||
case 'V':
|
||||
printf ("rax2 v"R2_VERSION"\n");
|
||||
break;
|
||||
@ -123,6 +127,11 @@ static int rax (char *str, int last) {
|
||||
printf ("%c", buf[i]);
|
||||
return R_TRUE;
|
||||
}
|
||||
if (flags & 16) {
|
||||
int h = r_str_hash (str);
|
||||
printf ("%s 0x%x\n", str, h);
|
||||
return R_TRUE;
|
||||
}
|
||||
|
||||
if (str[0]=='0' && str[1]=='x') {
|
||||
out_mode = 'I';
|
||||
|
@ -92,6 +92,23 @@ static void emit_syscall_args(REgg *egg, int nargs) {
|
||||
}
|
||||
|
||||
static void emit_set_string(REgg *egg, const char *dstvar, const char *str, int j) {
|
||||
char *p, str2[64];
|
||||
int i, oj = j;
|
||||
for (i=4; i<oj; i+=4) {
|
||||
/* XXX endian and 32/64bit issues */
|
||||
int *n = (int *)(str+i-4);
|
||||
p = r_egg_mkvar (egg, str2, dstvar, i);
|
||||
if (attsyntax) r_egg_printf (egg, " movl $0x%x, %s\n", *n, p);
|
||||
else r_egg_printf (egg, " mov %s, 0x%x\n", p, *n);
|
||||
j -= 4;
|
||||
}
|
||||
p = r_egg_mkvar (egg, str2, dstvar, j);
|
||||
if (attsyntax) r_egg_printf (egg, " lea %s, %%"R_AX"\n", p);
|
||||
else r_egg_printf (egg, " lea "R_AX", %s\n", p);
|
||||
p = r_egg_mkvar (egg, str2, dstvar, 0);
|
||||
if (attsyntax) r_egg_printf (egg, " mov %%"R_AX", %s\n", p);
|
||||
else r_egg_printf (egg, " mov %s, "R_AX"\n", p);
|
||||
#if 0
|
||||
char *p, str2[64];
|
||||
int i, oj = j;
|
||||
for (i=0; i<oj; i+=4) {
|
||||
@ -108,6 +125,7 @@ static void emit_set_string(REgg *egg, const char *dstvar, const char *str, int
|
||||
p = r_egg_mkvar (egg, str2, dstvar, 0);
|
||||
if (attsyntax) r_egg_printf (egg, " mov %%"R_AX", %s\n", p);
|
||||
else r_egg_printf (egg, " mov %s, "R_AX"\n", p);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void emit_call(REgg *egg, const char *str, int atr) {
|
||||
@ -159,15 +177,17 @@ static void emit_get_while_end (REgg *egg, char *str, const char *ctxpush, const
|
||||
}
|
||||
|
||||
static void emit_while_end (REgg *egg, const char *labelback) {
|
||||
#if 0
|
||||
if (attsyntax) {
|
||||
r_egg_printf (egg, " pop %%"R_AX"\n");
|
||||
r_egg_printf (egg, " cmp $0, %%"R_AX"\n"); // XXX MUST SUPPORT != 0 COMPARE HERE
|
||||
r_egg_printf (egg, " jnz %s\n", labelback);
|
||||
} else {
|
||||
#endif
|
||||
r_egg_printf (egg, " pop "R_AX"\n");
|
||||
r_egg_printf (egg, " test "R_AX", "R_AX"\n"); // XXX MUST SUPPORT != 0 COMPARE HERE
|
||||
r_egg_printf (egg, " jnz %s\n", labelback);
|
||||
}
|
||||
// }
|
||||
}
|
||||
|
||||
static void emit_get_var (REgg *egg, int type, char *out, int idx) {
|
||||
@ -228,7 +248,7 @@ static void emit_branch(REgg *egg, char *b, char *g, char *e, char *n, int sz, c
|
||||
arg = e+1;
|
||||
op = "jne";
|
||||
} else {
|
||||
arg = "$0";
|
||||
arg = attsyntax? "$0": "0";
|
||||
if (n) op = "jnz";
|
||||
else op ="jz";
|
||||
}
|
||||
@ -241,7 +261,7 @@ static void emit_branch(REgg *egg, char *b, char *g, char *e, char *n, int sz, c
|
||||
r_egg_printf (egg, " cmp%c %s, %%"R_AX"\n", sz, p);
|
||||
} else {
|
||||
r_egg_printf (egg, " pop "R_AX"\n"); /* TODO: add support for more than one arg get arg0 */
|
||||
r_egg_printf (egg, " cmp %s, "R_AX"\n", p);
|
||||
r_egg_printf (egg, " cmp "R_AX", %s\n", p);
|
||||
}
|
||||
// if (context>0)
|
||||
r_egg_printf (egg, " %s %s\n", op, dst);
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* radare - LGPL - Copyright 2011 pancake<@nopcode.org> */
|
||||
/* radare - LGPL - Copyright 2010-2011 pancake<@nopcode.org> */
|
||||
|
||||
#include <r_egg.h>
|
||||
|
||||
@ -76,6 +76,16 @@ static const char *skipspaces(const char *s) {
|
||||
return s;
|
||||
}
|
||||
|
||||
static char *trim(char *s) {
|
||||
char *o;
|
||||
for (o=s; *s; s++)
|
||||
if (isspace (*s)) {
|
||||
*s = 0;
|
||||
break;
|
||||
}
|
||||
return o;
|
||||
}
|
||||
|
||||
#define SYNTAX_ATT 0
|
||||
#if SYNTAX_ATT
|
||||
#define FRAME_FMT ".LC%d_%d_frame%d"
|
||||
@ -281,19 +291,20 @@ static void rcc_fun(REgg *egg, const char *str) {
|
||||
char *ptr, *ptr2;
|
||||
str = skipspaces (str);
|
||||
if (context) {
|
||||
ptr = strchr(str, '=');
|
||||
ptr = strchr (str, '=');
|
||||
if (ptr) {
|
||||
*ptr = '\0';
|
||||
free (dstvar);
|
||||
dstvar = strdup (skipspaces (str));
|
||||
ptr2 = (char *)skipspaces(ptr+1);
|
||||
if (*ptr2)
|
||||
callname = strdup (skipspaces (ptr+1));
|
||||
if (*ptr2) {
|
||||
callname = trim (strdup (skipspaces (ptr+1)));
|
||||
}
|
||||
} else {
|
||||
str = skipspaces (str);
|
||||
egg->emit->comment (egg, "rcc_fun %d (%s)", context, str);
|
||||
free (callname);
|
||||
callname = strdup (skipspaces (str));
|
||||
callname = trim (strdup (skipspaces (str)));
|
||||
egg->emit->comment (egg, "rcc_fun %d (%s)", context, callname);
|
||||
}
|
||||
} else {
|
||||
ptr = strchr (str, '@');
|
||||
@ -396,7 +407,7 @@ static int parsedatachar(REgg *egg, char c) {
|
||||
/* capture value between parenthesis foo@data(NNN) { ... } */
|
||||
if (c==')') {
|
||||
stackframe = atoi (dstval);
|
||||
ndstval=0;
|
||||
ndstval = 0;
|
||||
} else dstval[ndstval++] = c;
|
||||
return 0;
|
||||
}
|
||||
@ -408,9 +419,7 @@ static int parsedatachar(REgg *egg, char c) {
|
||||
slurp = 0;
|
||||
mode = NORMAL;
|
||||
/* register */
|
||||
if (dstval == NULL || dstvar == NULL) {
|
||||
eprintf ("FUCK FUCK\n");
|
||||
} else {
|
||||
if (dstval != NULL && dstvar != NULL) {
|
||||
dstval[ndstval]='\0';
|
||||
egg->emit->comment (egg, "data (%s)(%s)size=(%d)\n",
|
||||
dstvar, dstval, stackframe);
|
||||
@ -430,7 +439,7 @@ static int parsedatachar(REgg *egg, char c) {
|
||||
ndstval = 0;
|
||||
context = 0;
|
||||
return 1;
|
||||
}
|
||||
} else eprintf ("FUCK FUCK\n");
|
||||
}
|
||||
}
|
||||
dstval[ndstval++] = c;
|
||||
@ -487,6 +496,7 @@ static void rcc_next(REgg *egg) {
|
||||
|
||||
docall = 1;
|
||||
if (callname) {
|
||||
callname = trim (callname);
|
||||
char *str, *ptr = strchr (callname, '=');
|
||||
if (ptr) {
|
||||
*ptr = '\0';
|
||||
|
@ -52,6 +52,7 @@ R_API int r_syscall_setup(RSyscall *ctx, const char *arch, const char *os) {
|
||||
// ignored
|
||||
return R_TRUE;
|
||||
}
|
||||
// TODO: use r_str_hash.. like in r_egg
|
||||
if (!strcmp (arch, "mips")) {
|
||||
ctx->regs = fastcall_mips;
|
||||
if (!strcmp (os, "linux"))
|
||||
@ -66,7 +67,7 @@ R_API int r_syscall_setup(RSyscall *ctx, const char *arch, const char *os) {
|
||||
if (!strcmp (os, "linux"))
|
||||
ctx->sysptr = syscalls_linux_arm;
|
||||
else
|
||||
if (!strcmp (os, "macos") || !strcmp (os, "darwin"))
|
||||
if (!strcmp (os, "macos") || !strcmp (os, "darwin") || !strcmp (os, "osx"))
|
||||
ctx->sysptr = syscalls_darwin_arm;
|
||||
else {
|
||||
eprintf ("r_syscall_setup: Unknown OS '%s'\n", os);
|
||||
@ -83,9 +84,9 @@ R_API int r_syscall_setup(RSyscall *ctx, const char *arch, const char *os) {
|
||||
ctx->sysptr = syscalls_freebsd_x86;
|
||||
else if (!strcmp (os, "openbsd"))
|
||||
ctx->sysptr = syscalls_openbsd_x86;
|
||||
else if ((!strcmp (os, "darwin")) || (!strcmp (os, "macos")))
|
||||
else if ((!strcmp (os, "darwin")) || (!strcmp (os, "macos")) || (!strcmp (os, "osx")))
|
||||
ctx->sysptr = syscalls_darwin_x86;
|
||||
else if (!strcmp (os, "windows")) //win7
|
||||
else if (!strcmp (os, "windows") || (!strcmp (os, "w32"))) //win7
|
||||
ctx->sysptr = syscalls_win7_x86;
|
||||
else {
|
||||
eprintf ("r_syscall_setup: Unknown os '%s'\n", os);
|
||||
|
Loading…
x
Reference in New Issue
Block a user