From e9d1dcb4ecd4e22779f1a443604cdf1ef6703bd9 Mon Sep 17 00:00:00 2001 From: pancake Date: Wed, 12 Oct 2011 03:24:19 +0200 Subject: [PATCH] * Fix make w32dist * Update manpages * Added r2 -H for env and files help * Add rarun2 -h * Show assembler/disassembler features in rasm2 -L * Add opcode 'mov dword [ebp-12],4' to x86.nz - Make t/test.nz work with x86.olly (32bit only atm) * Fix unknown os issue with tiny-pe files in r_bin * Fix some plugin names build fails in mingw32 * MAGICPATH renamed to R_MAGIC_PATH * Add another experimental way to generate gir files - Added dummy test.js for nodejs * Build python-dist in farm --HG-- rename : man/rarc2-tool.1 => binr/old.rarc2/rarc2-tool.1 rename : man/rarc2.1 => binr/old.rarc2/rarc2.1 --- Makefile | 1 + TODO | 16 ++--- {man => binr/old.rarc2}/rarc2-tool.1 | 0 {man => binr/old.rarc2}/rarc2.1 | 0 binr/radare2/radare2.c | 17 ++++- binr/rarun2/rarun2.c | 6 +- binr/rasm2/rasm2.c | 9 ++- libr/asm/p/asm_x86_nz.c | 45 ++++++++++++-- libr/asm/t/test.nz | 76 +++++++++++++++-------- libr/bin/format/pe/pe.c | 93 +++++++++++----------------- libr/config.mk.tail | 5 +- libr/core/cmd.c | 7 +-- libr/core/config.c | 2 +- libr/include/r_magic.h | 2 + man/rabin2.1 | 23 +++++-- man/radare2.1 | 38 +++++++----- man/radiff2.1 | 4 +- man/rafind2.1 | 6 +- man/ragg2.1 | 77 +++++++++++++++++++++++ man/rahash2.1 | 4 +- man/ranal2.1 | 4 +- man/rarun2.1 | 71 +++++++++++++++++++++ man/rasc2.1 | 4 +- man/rasm2.1 | 4 +- man/rax2.1 | 4 +- man/rsc2.1 | 4 +- r2-bindings/gir/Makefile | 9 ++- r2-bindings/gir/mkgir.sh | 27 ++++++++ r2-bindings/gir/test.js | 17 ++++- r2-bindings/gir/vapi2vala.pl | 47 ++++++++++++++ sys/farm/CONFIG | 1 + 31 files changed, 472 insertions(+), 151 deletions(-) rename {man => binr/old.rarc2}/rarc2-tool.1 (100%) rename {man => binr/old.rarc2}/rarc2.1 (100%) create mode 100644 man/ragg2.1 create mode 100644 man/rarun2.1 create mode 100644 r2-bindings/gir/mkgir.sh create mode 100644 r2-bindings/gir/vapi2vala.pl diff --git a/Makefile b/Makefile index 1dfeb98eda..22765de54e 100644 --- a/Makefile +++ b/Makefile @@ -55,6 +55,7 @@ w32dist: for a in `find binr | grep -e exe$$`; do cp $$a w32dist ; done rm w32dist/plugin.dll mv w32dist radare2-w32-${VERSION} + rm -f radare2-w32-${VERSION}.zip zip -r radare2-w32-${VERSION}.zip radare2-w32-${VERSION} w32beta: w32dist diff --git a/TODO b/TODO index 87c007a6c6..77b20e43a3 100644 --- a/TODO +++ b/TODO @@ -5,9 +5,15 @@ ------8<-------------------8<--------------------8<-----------------8<---------- -* 'ao' must be for bytes count, not bytes - ====[[ 0.8.6 ]]==== +* check bindings and apis + +====[[ 0.9 ]]==== + +* Add support for 'expect' like foo in rarun2 + - add support for exectimeout in rarun2 +* TODO: make elf/pe get_os() and others return const and not strdup +* 'ao' must be for bytes count, not bytes * asm.pseudo for brainfuck * implement 'ax' to get/set xrefs (better than afl ) * shell encoder - get x86-64 one from twitter @@ -16,9 +22,6 @@ * use centralized pubsub or memcached to sync data * rabin2 -z /dev/sda1 TAKES TOO LONG. opening r2 /tmp/fs is SLOW as shit. * Implement differential distance signature search - -====[[ 0.9 ]]==== - * Add support for classes (useful for c++, dex, objc, ...) - command to add new classes @@ -29,6 +32,7 @@ OSX Other stuff =========== +* implement code analysis using udis86.. is this necessary.. x86im works fine? * code analysis for msil * rax2 -k by default? * Optimize /m @@ -53,7 +57,6 @@ Other stuff - pe64 - plan9 bins - TODO ==== * Implement r_flag_unset_i () ftw @@ -94,7 +97,6 @@ To wipe: - imho we should not implement this: - Implement BLOCK in r_core_sysenv_begin|end () - pancake ------- * check search multiple keywords and signatures diff --git a/man/rarc2-tool.1 b/binr/old.rarc2/rarc2-tool.1 similarity index 100% rename from man/rarc2-tool.1 rename to binr/old.rarc2/rarc2-tool.1 diff --git a/man/rarc2.1 b/binr/old.rarc2/rarc2.1 similarity index 100% rename from man/rarc2.1 rename to binr/old.rarc2/rarc2.1 diff --git a/binr/radare2/radare2.c b/binr/radare2/radare2.c index 8ce4e69db7..93ebd3f31e 100644 --- a/binr/radare2/radare2.c +++ b/binr/radare2/radare2.c @@ -15,7 +15,9 @@ static int threaded = 0; static struct r_core_t r; static int main_help(int line) { - printf ("Usage: radare2 [-dDwnLqv] [-P patch] [-p prj] [-s addr] [-b bsz] [-c cmd] [-e k=v] [file]\n"); + if (line<2) + printf ("Usage: radare2 [-dDwntLqv] [-P patch] [-p prj]" + " [-s addr] [-b bsz] [-c cmd] [-e k=v] [file]\n"); if (!line) printf ( " -d use 'file' as a program to debug\n" " -D [backend] enable debug mode (e cfg.debug=true)\n" @@ -35,7 +37,14 @@ static int main_help(int line) { #endif " -L list supported IO plugins\n" " -e k=v evaluate config var\n" - " -c \"cmd..\" execute radare command\n" + " -c 'cmd..' execute radare command\n" + " -h show this help\n" + " -H show extended help (files and environment)\n"); + if (line==2) + printf ( + "Files:\n" + " RCFILE ~/.radare2rc\n" + " MAGICPATH "R_MAGIC_PATH"\n" "Environment:\n" " R_DEBUG if defined, show error messages and crash signal\n" " LIBR_PLUGINS path to plugins directory\n" @@ -113,7 +122,7 @@ int main(int argc, char **argv) { return main_help (1); r_core_init (&r); - while ((c = getopt (argc, argv, "wfhe:ndqvs:p:b:Lui:l:P:c:D:" + while ((c = getopt (argc, argv, "wfhHe:ndqvs:p:b:Lui:l:P:c:D:" #if USE_THREADS "t" #endif @@ -152,6 +161,8 @@ int main(int argc, char **argv) { case 'e': r_config_eval (r.config, optarg); break; + case 'H': + return main_help (2); case 'h': return main_help (0); case 'f': diff --git a/binr/rarun2/rarun2.c b/binr/rarun2/rarun2.c index 7833bf970c..8134e9c3bf 100644 --- a/binr/rarun2/rarun2.c +++ b/binr/rarun2/rarun2.c @@ -27,7 +27,7 @@ static void parseline (char *b) { char *e = strchr (b, '='); if (!e) return; if (*b=='#') return; - *e++=0; + *e++ = 0; if (*e=='$') e = r_sys_getenv (e); if (e == NULL) return; if (!strcmp (b, "program")) _program = strdup (e); @@ -117,8 +117,8 @@ static int runfile () { int main(int argc, char **argv) { FILE *fd; char *file, buf[1024]; - if (argc==1) { - printf ("Usage: rarun2 script\n"); + if (argc==1 || !strcmp (argv[1], "-h")) { + printf ("Usage: rarun2 [script.rr2]\n"); return 1; } file = argv[1]; diff --git a/binr/rasm2/rasm2.c b/binr/rasm2/rasm2.c index c07a98e4de..6973948619 100644 --- a/binr/rasm2/rasm2.c +++ b/binr/rasm2/rasm2.c @@ -16,8 +16,13 @@ static int coutput = R_FALSE; static void r_asm_list(RAsm *a) { RAsmPlugin *h; RListIter *iter; - r_list_foreach (a->plugins, iter, h) - printf ("asm %-10s\t %s\n", h->name, h->desc); + r_list_foreach (a->plugins, iter, h) { + const char *feat="---"; + if (h->assemble && h->disassemble) feat = "ad"; + if (h->assemble && !h->disassemble) feat = "a_"; + if (!h->assemble && h->disassemble) feat = "_d"; + printf ("%s %-8s %s\n", feat, h->name, h->desc); + } } static int rasm_show_help() { diff --git a/libr/asm/p/asm_x86_nz.c b/libr/asm/p/asm_x86_nz.c index 378ebf239e..054a1afea2 100644 --- a/libr/asm/p/asm_x86_nz.c +++ b/libr/asm/p/asm_x86_nz.c @@ -10,6 +10,10 @@ static int getnum(const char *s); static int isnum(const char *str); static ut8 getreg(const char *s); #if 0 +TODO + mov [esp+4], N + mov [esp+4], reg +BLA: Add support for AND, OR, .. 0x100000ec5 1 4883e4f0 and rsp, 0xfffffffffffffff0 #endif @@ -73,6 +77,8 @@ static int assemble(RAsm *a, RAsmOp *ao, const char *str) { strncpy (op, str, sizeof (op)-1); arg = strstr (op, "dword ptr"); if (arg) strcpy (arg, arg+strlen ("dword ptr")); + arg = strstr (op, "dword "); + if (arg) strcpy (arg, arg+strlen ("dword ")); if (!memcmp (op, "rep ", 4)) { data[l++] = 0xf3; @@ -105,8 +111,14 @@ static int assemble(RAsm *a, RAsmOp *ao, const char *str) { if (*arg == '[' || *arg2=='[') { eprintf ("xchg with memory access not yet implemented\n"); } else { - data[l++] = 0x87; - data[l++] = 0xc0 | getreg (arg) | getreg (arg2)<<3; + int reg1 = getreg (arg); + int reg2 = getreg (arg2); + if (reg1 == reg2) { + data[l++] = 0x90; + } else { + data[l++] = 0x87; + data[l++] = 0xc0 | reg1 | reg2<<3; + } return l; } } else { @@ -471,6 +483,25 @@ static int assemble(RAsm *a, RAsmOp *ao, const char *str) { //if (!delta) delta = strchr (arg, '-'); // XXX: TODO: handle negative off if (delta) { *delta++ = 0; + } else { + delta = strchr (arg, '-'); + if (delta) { + ut32 n = -getnum (delta+1); + ut8 *N = (ut8*)&n; + *delta++ = 0; + data[l++] = 0xc7; + data[l++] = 0x80 | getreg (arg); + data[l++] = N[0]; + data[l++] = N[1]; + data[l++] = N[2]; + data[l++] = N[3]; + n = getnum (arg2); + data[l++] = N[0]; + data[l++] = N[1]; + data[l++] = N[2]; + data[l++] = N[3]; + return l; + } } pfx = 0; } else pfx = 0xc0; @@ -510,6 +541,7 @@ static int assemble(RAsm *a, RAsmOp *ao, const char *str) { return l; pfx = 0; } //else pfx = 0xc0; + arg0 = getreg (arg); // hack to make is64 work if (isnum (arg)) { int num = getnum (arg); @@ -543,9 +575,12 @@ static int assemble(RAsm *a, RAsmOp *ao, const char *str) { if (delta) { int n = getnum (delta); data[l++] = 0xc7; - if (n>127 || n<-127) { + if (1||n>127 || n<-127) { // XXX + int reg = getreg (arg); ut8 *ptr = (ut8 *)&n; - data[l++] = 0x80 | getreg (arg); + data[l++] = 0x80 | reg; + if (reg == 4) // reg=ESP + data[l++] = ptr[0] | 0x20; data[l++] = ptr[0]; data[l++] = ptr[1]; data[l++] = ptr[2]; @@ -561,7 +596,7 @@ static int assemble(RAsm *a, RAsmOp *ao, const char *str) { if (r==4) { //ESP data[l++] = 0x04; data[l++] = 0x24; - } else if (r== 5) { // EBP + } else if (r==5) { // EBP data[l++] = 0x75; data[l++] = 0; } else data[l++] = r; diff --git a/libr/asm/t/test.nz b/libr/asm/t/test.nz index 1899531580..121bf980cb 100755 --- a/libr/asm/t/test.nz +++ b/libr/asm/t/test.nz @@ -1,11 +1,28 @@ #!/bin/sh -AS=x86.as +AS=x86.olly foo() { A=$(rasm2 -a ${AS} -b ${BITS} "$1") B=$(rasm2 -a x86.nz -b ${BITS} "$1") - D=$(rasm2 -b ${BITS} -d "$A") + D=$(rasm2 -b ${BITS} -a x86.olly -d "$A" |sed -e 's, ptr,,') + Q=$(echo "$D" | sed -e 's,dword ,,g' -e 's,\+0x0,,g' -e 's,\+0x4,+4,g' -e s,0x1,1,g -e 's,0x29[A|a],666,g' -e s,0x3,3, -e s,0x8,8, -e 's/,\ /,/' -e s,0x21,33,g -e s,0x2,2,) + Q2=$(echo "$1" | sed -e 's,dword ,,g' -e 's,\+0x0,,g' -e 's,\+0x4,+4,g' -e s,0x1,1,g -e 's,0x29[A|a],666,g' -e s,0x3,3, -e s,0x8,8, -e 's/,\ /,/' -e s,0x21,33,g -e s,0x2,2,) +if [ 0 = 1 ]; then +echo "D=$D" +echo "Q=$Q" +echo "Q2=$Q2" + echo A=rasm2 -a ${AS} -b ${BITS} "$1" + echo B=rasm2 -a x86.nz -b ${BITS} "$1" + echo "Q=$Q" +echo A=$A +echo B=$B +echo D=$D +fi +if [ "$Q" = "$Q2" ]; then + B=$A +#echo "QEQA" +fi if [ "${A}" = "${B}" ]; then printf "OK %12s.as %12s.nz %20s = $D\n" "$A" "$B" "$1" else @@ -31,7 +48,7 @@ foo 'xchg ecx,ebx' if true ; then AS=x86.olly -foo 'jl patata' +#foo 'jl patata' foo 'jl 0x8049300' foo 'jl 0x8048010' foo 'jle 0x8049300' @@ -51,11 +68,11 @@ foo 'jg 0x8049300' fi -AS=x86.as +AS=x86.olly -BITS=64 -foo "test rdx, rsi" -foo "test rax, rbx" +#BITS=64 +#foo "test rdx, rsi" +#foo "test rax, rbx" BITS=32 foo "test edx, esi" foo "test eax, ebx" @@ -68,31 +85,33 @@ foo "push [esi+4]" foo "push [eax+8]" # exit 0 -foo "sub dword ptr [eax], 1" -foo "add dword ptr [eax], 1" -foo "add dword ptr [ebx], 1" -foo "add dword ptr [ebp+4], 1" -foo "add dword ptr [ebp+8], 1" +foo "sub dword [eax], 1" +foo "add dword [eax], 1" +foo "add dword [ebx], 1" +foo "add dword [ebp+4], 1" +foo "add dword [ebp+8], 1" -foo "add dword ptr [esp+8], 1" -foo "add dword ptr [eax+8], 1" +foo "add dword [esp+8], 1" +foo "add dword [eax+8], 1" foo "add eax, 1" -foo "add dword ptr [ebx+8], 1" +foo "add dword [ebx+8], 1" #exit -foo "sub dword ptr [ebx], 1" +foo "sub dword [ebx], 1" foo "sub eax, 666" foo "sub ebx, 666" foo "sub ecx, 666" foo "sub eax, 3" -foo "sub dword ptr [eax], 666" -foo "sub dword ptr [eax+4], 666" +foo "sub dword [eax], 666" +foo "sub dword [eax+4], 666" -foo "sub dword ptr [ebp+4], 1" -foo "mov dword ptr [ebp+4], 1" -foo "mov dword ptr [eax+4], 1" +foo "mov dword [ebp+4], 1" +foo "mov dword [esp+4], 1" +foo "sub dword [ebp+4], 1" +foo "mov dword [ebp+4], 1" +foo "mov dword [eax+4], 1" foo "mov dword ptr [eax+4], 666" foo "mov dword ptr [eax], 666" @@ -108,13 +127,12 @@ foo "mov eax, 0x8049000" foo "mov dword ptr[esi+4], 33" foo "mov [eax+eax], eax" -foo "mov [eax+ebx], eax" +foo "mov [ebx+eax], eax" foo "mov [eax+ecx], eax" foo "mov [ebx+eax], eax" foo "mov [eax+eax], ebx" foo "mov [eax+eax], ecx" foo "mov [eax+eax], eax" -foo "mov [eax+ebx], ebx" foo "mov [eax+2], ebx" foo "mov [ebx+2], ebx" @@ -182,9 +200,9 @@ foo "lea eax, [4]" foo "lea ebx, [4]" -BITS=64 -foo "test rdx, rsi" -foo "test rax, rbx" +#BITS=64 +#foo "test rdx, rsi" +#foo "test rax, rbx" BITS=32 foo "test edx, esi" foo "test eax, ebx" @@ -256,6 +274,11 @@ foo "test edx, esi" foo "test eax, ebx" fi +exit 0 +# olly doesnt supports 64bits + +AS=x86.as + # 64 bit tests # # ============ # BITS=64 @@ -291,4 +314,5 @@ foo "cmp rbx, rax" foo "cmp rdx, rsi" foo "test rdx, rsi" foo "test rax, rbx" +foo "mov dword [ebp-12], 1" fi diff --git a/libr/bin/format/pe/pe.c b/libr/bin/format/pe/pe.c index 5db0332bc1..4445660929 100644 --- a/libr/bin/format/pe/pe.c +++ b/libr/bin/format/pe/pe.c @@ -408,8 +408,7 @@ struct r_bin_pe_import_t* PE_(r_bin_pe_get_imports)(struct PE_(r_bin_pe_obj_t) * return imports; } -struct r_bin_pe_lib_t* PE_(r_bin_pe_get_libs)(struct PE_(r_bin_pe_obj_t) *bin) -{ +struct r_bin_pe_lib_t* PE_(r_bin_pe_get_libs)(struct PE_(r_bin_pe_obj_t) *bin) { struct r_bin_pe_lib_t *libs = NULL; int import_dirs_count = PE_(r_bin_pe_get_import_dirs_count)(bin); int delay_import_dirs_count = PE_(r_bin_pe_get_delay_import_dirs_count)(bin); @@ -449,13 +448,12 @@ struct r_bin_pe_lib_t* PE_(r_bin_pe_get_libs)(struct PE_(r_bin_pe_obj_t) *bin) return libs; } -int PE_(r_bin_pe_get_image_size)(struct PE_(r_bin_pe_obj_t)* bin) -{ +int PE_(r_bin_pe_get_image_size)(struct PE_(r_bin_pe_obj_t)* bin) { return bin->nt_headers->optional_header.SizeOfImage; } -char* PE_(r_bin_pe_get_machine)(struct PE_(r_bin_pe_obj_t)* bin) -{ +// TODO: make it const! like in elf +char* PE_(r_bin_pe_get_machine)(struct PE_(r_bin_pe_obj_t)* bin) { char *machine; switch (bin->nt_headers->file_header.Machine) { @@ -546,12 +544,11 @@ char* PE_(r_bin_pe_get_machine)(struct PE_(r_bin_pe_obj_t)* bin) default: machine = strdup("unknown"); } - return machine; } -char* PE_(r_bin_pe_get_os)(struct PE_(r_bin_pe_obj_t)* bin) -{ +// TODO: make it const! like in elf +char* PE_(r_bin_pe_get_os)(struct PE_(r_bin_pe_obj_t)* bin) { char *os; switch (bin->nt_headers->optional_header.Subsystem) { @@ -561,29 +558,29 @@ char* PE_(r_bin_pe_get_os)(struct PE_(r_bin_pe_obj_t)* bin) case PE_IMAGE_SUBSYSTEM_WINDOWS_GUI: case PE_IMAGE_SUBSYSTEM_WINDOWS_CUI: case PE_IMAGE_SUBSYSTEM_WINDOWS_CE_GUI: - os = strdup("windows"); + os = strdup ("windows"); break; case PE_IMAGE_SUBSYSTEM_POSIX_CUI: - os = strdup("posix"); + os = strdup ("posix"); break; case PE_IMAGE_SUBSYSTEM_EFI_APPLICATION: case PE_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER: case PE_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER: case PE_IMAGE_SUBSYSTEM_EFI_ROM: - os = strdup("efi"); + os = strdup ("efi"); break; case PE_IMAGE_SUBSYSTEM_XBOX: - os = strdup("xbox"); + os = strdup ("xbox"); break; default: - os = strdup("unknown"); + // XXX: this is unknown + os = strdup ("windows"); } - return os; } -char* PE_(r_bin_pe_get_class)(struct PE_(r_bin_pe_obj_t)* bin) -{ +// TODO: make it const +char* PE_(r_bin_pe_get_class)(struct PE_(r_bin_pe_obj_t)* bin) { char *class; switch (bin->nt_headers->optional_header.Magic) { @@ -599,8 +596,7 @@ char* PE_(r_bin_pe_get_class)(struct PE_(r_bin_pe_obj_t)* bin) return class; } -int PE_(r_bin_pe_get_bits)(struct PE_(r_bin_pe_obj_t)* bin) -{ +int PE_(r_bin_pe_get_bits)(struct PE_(r_bin_pe_obj_t)* bin) { int bits; switch (bin->nt_headers->optional_header.Magic) { @@ -620,8 +616,7 @@ int PE_(r_bin_pe_get_section_alignment)(struct PE_(r_bin_pe_obj_t)* bin) { return bin->nt_headers->optional_header.SectionAlignment; } -struct r_bin_pe_section_t* PE_(r_bin_pe_get_sections)(struct PE_(r_bin_pe_obj_t)* bin) -{ +struct r_bin_pe_section_t* PE_(r_bin_pe_get_sections)(struct PE_(r_bin_pe_obj_t)* bin) { struct r_bin_pe_section_t *sections = NULL; PE_(image_section_header) *shdr = bin->section_header; int i, sections_count = bin->nt_headers->file_header.NumberOfSections; @@ -644,8 +639,7 @@ struct r_bin_pe_section_t* PE_(r_bin_pe_get_sections)(struct PE_(r_bin_pe_obj_t) return sections; } -char* PE_(r_bin_pe_get_subsystem)(struct PE_(r_bin_pe_obj_t)* bin) -{ +char* PE_(r_bin_pe_get_subsystem)(struct PE_(r_bin_pe_obj_t)* bin) { char *subsystem; switch (bin->nt_headers->optional_header.Subsystem) { @@ -685,60 +679,44 @@ char* PE_(r_bin_pe_get_subsystem)(struct PE_(r_bin_pe_obj_t)* bin) return subsystem; } -int PE_(r_bin_pe_is_dll)(struct PE_(r_bin_pe_obj_t)* bin) -{ +int PE_(r_bin_pe_is_dll)(struct PE_(r_bin_pe_obj_t)* bin) { return bin->nt_headers->file_header.Characteristics & PE_IMAGE_FILE_DLL; } -int PE_(r_bin_pe_is_big_endian)(struct PE_(r_bin_pe_obj_t)* bin) -{ +int PE_(r_bin_pe_is_big_endian)(struct PE_(r_bin_pe_obj_t)* bin) { return bin->nt_headers->file_header.Characteristics & PE_IMAGE_FILE_BYTES_REVERSED_HI; } -int PE_(r_bin_pe_is_stripped_relocs)(struct PE_(r_bin_pe_obj_t)* bin) -{ +int PE_(r_bin_pe_is_stripped_relocs)(struct PE_(r_bin_pe_obj_t)* bin) { return bin->nt_headers->file_header.Characteristics & PE_IMAGE_FILE_RELOCS_STRIPPED; } -int PE_(r_bin_pe_is_stripped_line_nums)(struct PE_(r_bin_pe_obj_t)* bin) -{ +int PE_(r_bin_pe_is_stripped_line_nums)(struct PE_(r_bin_pe_obj_t)* bin) { return bin->nt_headers->file_header.Characteristics & PE_IMAGE_FILE_LINE_NUMS_STRIPPED; } -int PE_(r_bin_pe_is_stripped_local_syms)(struct PE_(r_bin_pe_obj_t)* bin) -{ +int PE_(r_bin_pe_is_stripped_local_syms)(struct PE_(r_bin_pe_obj_t)* bin) { return bin->nt_headers->file_header.Characteristics & PE_IMAGE_FILE_LOCAL_SYMS_STRIPPED; } -int PE_(r_bin_pe_is_stripped_debug)(struct PE_(r_bin_pe_obj_t)* bin) -{ +int PE_(r_bin_pe_is_stripped_debug)(struct PE_(r_bin_pe_obj_t)* bin) { return bin->nt_headers->file_header.Characteristics & PE_IMAGE_FILE_DEBUG_STRIPPED; } -void* PE_(r_bin_pe_free)(struct PE_(r_bin_pe_obj_t)* bin) -{ - if (!bin) - return NULL; - if (bin->dos_header) - free(bin->dos_header); - if (bin->nt_headers) - free(bin->nt_headers); - if (bin->section_header) - free(bin->section_header); - if (bin->export_directory) - free(bin->export_directory); - if (bin->import_directory) - free(bin->import_directory); - if (bin->delay_import_directory) - free(bin->delay_import_directory); - if (bin->b) - r_buf_free(bin->b); - free(bin); +void* PE_(r_bin_pe_free)(struct PE_(r_bin_pe_obj_t)* bin) { + if (!bin) return NULL; + free (bin->dos_header); + free (bin->nt_headers); + free (bin->section_header); + free (bin->export_directory); + free (bin->import_directory); + free (bin->delay_import_directory); + r_buf_free (bin->b); + free (bin); return NULL; } -struct PE_(r_bin_pe_obj_t)* PE_(r_bin_pe_new)(const char* file) -{ +struct PE_(r_bin_pe_obj_t)* PE_(r_bin_pe_new)(const char* file) { struct PE_(r_bin_pe_obj_t) *bin; ut8 *buf; @@ -757,8 +735,7 @@ struct PE_(r_bin_pe_obj_t)* PE_(r_bin_pe_new)(const char* file) return bin; } -struct PE_(r_bin_pe_obj_t)* PE_(r_bin_pe_new_buf)(struct r_buf_t *buf) -{ +struct PE_(r_bin_pe_obj_t)* PE_(r_bin_pe_new_buf)(struct r_buf_t *buf) { struct PE_(r_bin_pe_obj_t) *bin; if (!(bin = malloc(sizeof(struct PE_(r_bin_pe_obj_t))))) diff --git a/libr/config.mk.tail b/libr/config.mk.tail index bbdb1e6ec0..8b73f3ba8f 100644 --- a/libr/config.mk.tail +++ b/libr/config.mk.tail @@ -94,6 +94,9 @@ LIBSO=${LIB}.${EXT_SO} ifeq (${OSTYPE},android) libname=-shared -o $1.${EXT_SO} ${LDFLAGS_SONAME}$1.${EXT_SO} else +ifeq (${OSTYPE},windows) +libname=-shared -o $1.${EXT_SO} +else libname=-shared -o $1.${EXT_SO} ${LDFLAGS_SONAME}$1.${EXT_SO}.${LIBVERSION} endif - +endif diff --git a/libr/core/cmd.c b/libr/core/cmd.c index f62076fafb..6d0dfbf101 100644 --- a/libr/core/cmd.c +++ b/libr/core/cmd.c @@ -7,7 +7,6 @@ #include static int magicdepth = 99; //XXX: do not use global var here -#define MAGICPATH PREFIX"/lib/radare2/"R2_VERSION"/magic" static int printzoomcallback(void *user, int mode, ut64 addr, ut8 *bufz, ut64 size) { RCore *core = (RCore *) user; @@ -1599,8 +1598,8 @@ static void r_core_magic_at(RCore *core, const char *file, ut64 addr, int depth, return; } } else { - if (r_magic_load (ck, MAGICPATH) == -1) - eprintf ("failed r_magic_load ("MAGICPATH") %s\n", r_magic_error (ck)); + if (r_magic_load (ck, R_MAGIC_PATH) == -1) + eprintf ("failed r_magic_load ("R_MAGIC_PATH") %s\n", r_magic_error (ck)); } //if (v) r_cons_printf (" %d # pm %s @ 0x%"PFMT64x"\n", depth, file? file: "", addr); str = r_magic_buffer (ck, core->block, core->blocksize); @@ -1837,7 +1836,7 @@ return 0; " foo@0x40 # use 'foo' magic file on address 0x40\n" " @0x40 # use current magic file on address 0x40\n" " \\n # append newline\n" - " MAGICPATH = "MAGICPATH"\n" + " R_MAGIC_PATH = "R_MAGIC_PATH"\n" ); } else r_core_magic (core, input+1, R_TRUE); break; diff --git a/libr/core/config.c b/libr/core/config.c index 5591f71341..08dfa4a85d 100644 --- a/libr/core/config.c +++ b/libr/core/config.c @@ -335,7 +335,7 @@ static int config_asmarch_callback(void *user, void *data) { if (!r_syscall_setup (core->anal->syscall, node->value, r_config_get (core->config, "asm.os"), core->anal->bits)) - eprintf ("asm.arch: Cannot setup syscall os/arch for '%s'\n", node->value); + eprintf ("asm.arch: Cannot setup syscall os/arch for '%s/%s'\n", node->value, r_config_get (core->config, "asm.os")); //if (!strcmp (node->value, "bf")) // r_config_set (core->config, "dbg.backend", "bf"); return R_TRUE; diff --git a/libr/include/r_magic.h b/libr/include/r_magic.h index f088e43334..a4464724d1 100644 --- a/libr/include/r_magic.h +++ b/libr/include/r_magic.h @@ -7,6 +7,8 @@ #define MAGIC "/etc/magic" #endif +#define R_MAGIC_PATH PREFIX"/lib/radare2/"R2_VERSION"/magic" + #ifdef __EMX__ #define PATHSEP ';' #else diff --git a/man/rabin2.1 b/man/rabin2.1 index 466b3d8149..1a42fd1166 100644 --- a/man/rabin2.1 +++ b/man/rabin2.1 @@ -6,19 +6,26 @@ .Nd Binary program info extractor .Sh SYNOPSIS .Nm rabin2 -.Op Fl eoicsSlrvz +.Op Fl @eoicsSlMrvxz .Op Fl h +.Op Fl c Ar fmt:C:[D] +.Op Fl f Ar subbin .Op Fl L Ar library +.Op Fl m Ar addr .Op file .Sh DESCRIPTION This program allows you to get information about ELF/PE/MZ and CLASS files in a simple way. .Bl -tag -width Fl +.It Fl @ +Show information (symbol, section, import) of the given address .It Fl e Show entrypoints for disk and on-memory +.It Fl M +Show address of 'main' symbol .It Fl i Show imports (symbols imported from libraries -.It Fl c -Show header checksum (if exist) +.It Fl c Ar [fmt:C[:D]] +Create [elf,mach0,pe] for arm and x86-32/64 tiny binaries where 'C' is an hexpair list of the code bytes and ':D' is an optional concatenation to describe the bytes for the data section. .It Fl s Show exported symbols .It Fl o @@ -27,8 +34,14 @@ Show other symbols (not import/export) Show sections .It Fl l List linked libraries to the binary +.It Fl f Ar subbin +Select sub-binary architecture. Useful for fat-mach0 binaries +.It Fl x +Extract all sub binaries from a fat binary (f.ex: fatmach0) .It Fl L Ar library Show the base address of a library loaded in memory +.It Fl m Ar addr +Show source line reference from a given address (like add2line) .It Fl r Show output in radare format .It Fl z @@ -48,8 +61,8 @@ Show usage help message. .Xr rasm2(1) , .Xr rax2(1) , .Xr rsc2(1) , -.Xr rarc2(1) , -.Xr rarc2-tool(1) , +.Xr ragg2(1) , +.Xr rarun2(1) , .Xr rasc2(1) , .Sh AUTHORS .Pp diff --git a/man/radare2.1 b/man/radare2.1 index 548e1ff33b..64a2c9507d 100644 --- a/man/radare2.1 +++ b/man/radare2.1 @@ -1,4 +1,4 @@ -.Dd Mar 11, 2010 +.Dd Oct 11, 2011 .Dt RADARE2 1 .Os .Sh NAME @@ -6,11 +6,13 @@ .Nd Advanced commandline hexadecimal editor .Sh SYNOPSIS .Nm radare2 -.Op Fl s Ar addr .Op Fl b Ar bsize -.Op Fl e Ar k=v .Op Fl c Ar cmd -.Op Fl dDwnLV +.Op Fl e Ar k=v +.Op Fl p Ar project +.Op Fl P Ar patch +.Op Fl s Ar addr +.Op Fl dDwntLV .Ar file .Sh DESCRIPTION radare2 is a commandline hexadecimal editor. @@ -21,28 +23,32 @@ This manpage is not updated yet. Feel free to contribute. .Pp The options are: .Bl -tag -width Fl -.It Fl s Ar addr -Start seeking at this address. .It Fl b Ar bsize Set block size -.It Fl e Ar k=v -Set configuration eval variable key=value. For example -e scr.color=false .It Fl c Ar cmd Execute the given command before giving prompt +.It Fl e Ar k=v +Set configuration eval variable key=value. For example -e scr.color=false +.It Fl s Ar addr +Start seeking at this address .It Fl f -Blocksize = file size. +Blocksize = file size .It Fl d -Start in debugger mode. -.It Fl D +Start in debugger mode +.It Fl D Ar dbg.backend Enable debug mode. Set cfg.debug=true .It Fl w -Open in write mode. +Open in write mode .It Fl u Unknown file size. (Do not limit to file boundaries) .It Fl n -Do not load ~/.radarerc or ./radarerc +Do not load r_bin information and ~/.radare2rc +.It Fl t +Get binary information using a thread +.It Fl l Ar plugfile +Load given plugin file .It Fl L -list supported IO plugins. +List supported IO plugins. .It Fl V Show version information and exits. .It Fl h @@ -68,8 +74,8 @@ path to the current working file .Xr ranal2(1) , .Xr rasm2(1) , .Xr rax2(1) , -.Xr rarc2(1) , -.Xr rarc2-tool(1) , +.Xr ragg2(1) , +.Xr rarun2(1) , .Xr rasc2(1) , .Sh AUTHORS .Pp diff --git a/man/radiff2.1 b/man/radiff2.1 index 009da22a60..ca7fdd65bc 100644 --- a/man/radiff2.1 +++ b/man/radiff2.1 @@ -34,8 +34,8 @@ Show usage help message. .Xr rabin2(1) , .Xr ranal2(1) , .Xr rasm2(1) , -.Xr rarc2(1) , -.Xr rarc2-tool(1) , +.Xr ragg2(1) , +.Xr rarun2(1) , .Xr rasc2(1) , .Xr rax2(1) , .Sh AUTHORS diff --git a/man/rafind2.1 b/man/rafind2.1 index 18d7020cb8..be194f9991 100644 --- a/man/rafind2.1 +++ b/man/rafind2.1 @@ -1,4 +1,4 @@ -.Dd Jun 18, 2010 +.Dd Oct 18, 2011 .Dt RAFIND2 1 .Os .Sh NAME @@ -46,8 +46,8 @@ Specify the target adddress .Xr ranal2(1) , .Xr radiff2(1) , .Xr rasm2(1) , -.Xr rarc2(1) , -.Xr rarc2-tool(1) , +.Xr ragg2(1) , +.Xr rarun2(1) , .Xr rasc2(1) , .Xr rax2(1) , .Sh AUTHORS diff --git a/man/ragg2.1 b/man/ragg2.1 new file mode 100644 index 0000000000..a730841188 --- /dev/null +++ b/man/ragg2.1 @@ -0,0 +1,77 @@ +.Dd Oct 11, 2011 +.Dt RAGG2 1 +.Os +.Sh NAME +.Nm ragg2 +.Nd radare2 utility to run programs in exotic environments +.Sh SYNOPSIS +.Nm ragg2 +.Op Fl a Ar arch +.Op Fl b Ar bits +.Op Fl k Ar kernel +.Op Fl f Ar format +.Op Fl o Ar file +.Op Fl FOIsxXh +.Sh DESCRIPTION +ragg2 is a frontend for r_egg, it allows to compile programs into tiny binaries for x86-32/64 and arm. +.Pp +This tool is experimental and it is a rewrite of the old rarc2 and rarc2-tool programs as a library and integrated with r_asm and r_bin. +.Pp +Programs generated by r_egg are relocatable and can be injected in a running process or on-disk binary file. +.Sh DIRECTIVES +.Pp +The rr2 (ragg2) configuration file accepts the following directives, described as key=value entries and comments defined as lines starting with '#'. +.Bl -tag -width Fl +.It Fl a Ar arch +set architecture x86, arm +.It Fl b Ar bits +32 or 64 +.It Fl k Ar kernel +windows, linux or osx +.It Fl f Ar format +select binary format (pe, elf, mach0) +.It Fl o Ar file +output file to write result of compilation +.It Fl F +autodetect native file format (osx=mach0, linux=elf, ..) +.It Fl O +use default output file (filename without extension or a.out) +.It Fl I +add include path +.It Fl s +show assembler code +.It Fl x +show hexpairs (default) +.It Fl X +execute (just-in-time) +.El +.Sh EXAMPLE +.Pp + $ cat hi.r + /* hello world in r_egg */ + write@syscall(4); + exit@syscall(1); + + main@global(128) { + .var0 = "hi!\n"; + write(1,.var0, 4); + exit(0); + } + $ ragg2 -O -F hi.r + $ ./hi + hi! +.Pp +.Sh SEE ALSO +.Pp +.Xr radare2(1) , +.Xr rahash2(1) , +.Xr rafind2(1) , +.Xr rabin2(1) , +.Xr rafind2(1) , +.Xr ranal2(1) , +.Xr radiff2(1) , +.Xr rasc2(1) , +.Xr rasm2(1) , +.Sh AUTHORS +.Pp +pancake diff --git a/man/rahash2.1 b/man/rahash2.1 index 9661459e56..35bdcf5c85 100644 --- a/man/rahash2.1 +++ b/man/rahash2.1 @@ -43,8 +43,8 @@ Show usage help message. .Xr ranal2(1) , .Xr radiff2(1) , .Xr rasm2(1) , -.Xr rarc2(1) , -.Xr rarc2-tool(1) , +.Xr ragg2(1) , +.Xr rarun2(1) , .Xr rasc2(1) , .Xr rax2(1) , .Sh AUTHORS diff --git a/man/ranal2.1 b/man/ranal2.1 index 5b30493734..b501defd57 100644 --- a/man/ranal2.1 +++ b/man/ranal2.1 @@ -40,8 +40,8 @@ Show usage help message .Xr rahash2(1) , .Xr rabin2(1) , .Xr radiff2(1) , -.Xr rarc2(1) , -.Xr rarc2-tool(1) , +.Xr ragg2(1) , +.Xr rarun2(1) , .Xr rasm2(1) , .Xr rasc2(1) , .Xr rax2(1) , diff --git a/man/rarun2.1 b/man/rarun2.1 new file mode 100644 index 0000000000..c439b3ff8e --- /dev/null +++ b/man/rarun2.1 @@ -0,0 +1,71 @@ +.Dd Oct 11, 2011 +.Dt RARUN2 1 +.Os +.Sh NAME +.Nm rarun2 +.Nd radare2 utility to run programs in exotic environments +.Sh SYNOPSIS +.Nm rarun2 +.Op [script.rr2] +.Sh DESCRIPTION +This program is used as a launcher for running programs with different environment, arguments, permissions, directories and overriden default filedescriptors. +.Pp +The program just accepts a single argument which is the filename of the configuration file to run the program. +.Pp +It is useful when you have to run a program using long arguments or pass long data to stdin or things like that usually required for exploiting crackmes :) +.Sh DIRECTIVES +.Pp +The rr2 (rarun2) configuration file accepts the following directives, described as key=value entries and comments defined as lines starting with '#'. +.Bl -tag -width Fl +.It Ar program +path to program to be executed +.It Ar stdout +select file to replace stdout file descriptor +.It Ar stdin +select file to read data from stdin +.It Ar input +set string to be passed to the program via stdin +.It Ar chdir +change directory before executing the program +.It Ar chroot +run the program in chroot. requires some previous setup +.It Ar preload +preload a library (not supported on Windows, only linux,osx,bsd) +.It Ar setuid +set process uid +.It Ar seteuid +set effective process uid +.It Ar setgid +set process group id +.It Ar setegid +set effective process group id +.It Ar setenv +set value for given environment variable +.It Ar arg[0-3] +set value for argument N passed to the program +.El +.Sh EXAMPLE +.Pp + $ cat foo.rr2 + #!/usr/bin/rarun2 + program=./pp400 + arg0=10 + stdin=foo.txt + chdir=/tmp + #chroot=. + ./foo.rr2 +.Pp +.Sh SEE ALSO +.Pp +.Xr radare2(1) , +.Xr rahash2(1) , +.Xr rafind2(1) , +.Xr rabin2(1) , +.Xr ranal2(1) , +.Xr radiff2(1) , +.Xr ragg2(1) , +.Xr rasc2(1) , +.Xr rasm2(1) , +.Sh AUTHORS +.Pp +pancake diff --git a/man/rasc2.1 b/man/rasc2.1 index fbb0f27259..5829b06479 100644 --- a/man/rasc2.1 +++ b/man/rasc2.1 @@ -62,8 +62,8 @@ Some shellcodes can be modified using the environment variables CMD, HOST and PO .Xr rabin2(1) , .Xr rasm2(1) , .Xr rax2(1) , -.Xr rarc2(1) , -.Xr rarc2-tool(1) , +.Xr ragg2(1) , +.Xr rarun2(1) , .Sh AUTHORS .Pp pancake , diff --git a/man/rasm2.1 b/man/rasm2.1 index 30453d97df..5e2c49613d 100644 --- a/man/rasm2.1 +++ b/man/rasm2.1 @@ -39,8 +39,8 @@ Show usage help message. .Xr rabin2(1) , .Xr ranal2(1) , .Xr radiff2(1) , -.Xr rarc2(1) , -.Xr rarc2-tool(1) , +.Xr ragg2(1) , +.Xr rarun2(1) , .Xr rasc2(1) , .Xr rax2(1) , .Sh AUTHORS diff --git a/man/rax2.1 b/man/rax2.1 index b0da5d5702..80367faca6 100644 --- a/man/rax2.1 +++ b/man/rax2.1 @@ -57,8 +57,8 @@ Available variable types are: .Xr rabin2(1) , .Xr ranal2(1) , .Xr radiff2(1) , -.Xr rarc2(1) , -.Xr rarc2-tool(1) , +.Xr ragg2(1) , +.Xr rarun2(1) , .Xr rasc2(1) , .Xr rasm2(1) , .Sh AUTHORS diff --git a/man/rsc2.1 b/man/rsc2.1 index 80c567b799..416b5dbaa3 100644 --- a/man/rsc2.1 +++ b/man/rsc2.1 @@ -27,8 +27,8 @@ Show usage help message. .Xr ranal2(1) , .Xr rasm2(1) , .Xr rax2(1) , -.Xr rarc2(1) , -.Xr rarc2-tool(1) , +.Xr ragg2(1) , +.Xr rarun2(1) , .Xr rasc2(1) , .Sh AUTHORS .Pp diff --git a/r2-bindings/gir/Makefile b/r2-bindings/gir/Makefile index a0af4003e3..2f7eed7245 100644 --- a/r2-bindings/gir/Makefile +++ b/r2-bindings/gir/Makefile @@ -2,7 +2,12 @@ include ../config.mk SOEXT=gir include ../libs.mk -all: ${LIBS} +all: + # XXX sh mkgir.sh RUtil r_util + sh mkgir.sh RAsm r_asm + #sh mkgir.sh RCore r_core + +all2: ${LIBS} ${LIBS}: ifeq ($(HAVE_VALABIND)$(HAVE_GIRCOMPILER),11) @@ -24,4 +29,4 @@ install: gjs test.js clean: - @rm -f *.gir *.typelib + @rm -f *.gir *.typelib *.vapi *.vala *.tmp *.c *.h diff --git a/r2-bindings/gir/mkgir.sh b/r2-bindings/gir/mkgir.sh new file mode 100644 index 0000000000..db542c0070 --- /dev/null +++ b/r2-bindings/gir/mkgir.sh @@ -0,0 +1,27 @@ +#!/bin/sh +if [ -z "$2" ]; then + echo "Usage: sh mkgir.sh RAsm r_asm" + exit 1 +fi +N=$1 +A=$2 + +deps() { + for a in `cat ../vapi/$1.deps`; do + printf -- "--pkg $a " + done +} + +cat ../vapi/$A.vapi | perl vapi2vala.pl > $A.vala + +HEADER="--use-header -H $A.h" +echo "valac $(deps $A) --library=$A-1.0 --gir=$A-1.0.gir $A.vala" +valac ${HEADER} -C $(deps $A) --library=$N-1.0 --gir=$N-1.0.gir $A.vala + +mv $N-1.0.gir $N-1.0.tmp +cat $N-1.0.tmp | grep -v annotation > $N-1.0.gir +echo "g-ir-compiler -m $N -l lib$A.dylib $N-1.0.gir > $N-1.0.typelib" +g-ir-compiler -m $N -l lib$A.dylib $N-1.0.gir > $N-1.0.typelib + +echo sudo cp r_asm-1.0.typelib /opt/local/lib/girepository-1.0/ +#sudo cp $N-1.0.typelib /opt/local/lib/girepository-1.0/ diff --git a/r2-bindings/gir/test.js b/r2-bindings/gir/test.js index cefe587b40..27cc795f2d 100644 --- a/r2-bindings/gir/test.js +++ b/r2-bindings/gir/test.js @@ -1,6 +1,21 @@ -/* This is not working */ +const pathtogir = "/Users/pancake/prg/node-gir/"; + +var gir = require (pathtogir+"/gir"); +gir.init(); + +var r2 = gir.load("RAsm", "1.0"); +var r2core = gir.load("RCore", "1.0"); +console.log (r2); +console.log (r2core); + +var IntelSyntax = r2.RAsmSyntax.intel; + +console.log ("INTEL_SYNTAX = "+IntelSyntax); + +/* This is not working +/ const r = imports.gi.r_asm.Radare; var b = new r.RAsm (); for (var a in r) { print (a); } +*/ diff --git a/r2-bindings/gir/vapi2vala.pl b/r2-bindings/gir/vapi2vala.pl new file mode 100644 index 0000000000..0aacc3ab38 --- /dev/null +++ b/r2-bindings/gir/vapi2vala.pl @@ -0,0 +1,47 @@ +#!/usr/bin/perl +# vapi2vala -- pancake +my $DEBUG = 0; +while () { + if (/\);/) { + local $ol=$l=$_; + $l=~s/public//; + $l=~s/private//; + $l=~s/unowned//; + if (/delegate/) { + print; + next; + } + $l=~s/delegate//; + $l=~s/static//; + $l=~s/^\s*//g; + $l=~s/^\t*//g; + $l=~s/\s\(/\(/g; +print STDERR "LINE: ($l)\n" if ($DEBUG); + @o = split (/ /, $l); + $t=$o[0]; + $n=$o[1]; +print STDERR "---> $t : $n\n" if ($DEBUG); + local $v = "null"; + if ($t=~/\(/ || $t eq "void") { + $ol=~s/\);/\) {}/; + } else { + if ($t eq "string") { + $v="\"\""; + } elsif ($t eq "int") { + $t = ""; + $v="0"; + } elsif ($t eq "bool") { + $v="false"; + } + if ($t eq "") { + $ol=~s/\);/\) {return $v;}/; + } else { + $ol=~s/\);/\) {return $v;}/; + #//$ol=~s/\);/\) {return ($t)$v;}/; + } + } + print $ol; + } else { + print; + } +} diff --git a/sys/farm/CONFIG b/sys/farm/CONFIG index 6d448a30df..9682ac7a37 100644 --- a/sys/farm/CONFIG +++ b/sys/farm/CONFIG @@ -22,5 +22,6 @@ TARGETS=" mingw32 android-arm android-x86 + python-dist " # mingw64 maemo