Compare commits

...
31 Commits
Author SHA1 Message Date
pancake e4a73ccf07 Release 4.3.0 2020-03-04 01:25:03 +01:00
Sylvain Pelissier fc564166bd Update test folder to radare2/test and add test for yara in Travis (#233) 2020-03-02 21:36:20 +08:00
pancake 7cc5d343af Enable bcl in travis 2020-03-02 12:24:32 +01:00
pancake 854e6f38ed Fix build of BCL plugins (asm, anal, bin) 2020-03-02 12:23:57 +01:00
Sylvain Pelissier 8da191d171 Add print string option to yara 2020-03-01 20:57:48 +01:00
pancake 2749dedb1e The retdec pkg doesnt needs to be tested by us 2020-02-12 00:25:10 +01:00
pancake 327898bac1 Fix build for pcap and swf 2020-02-12 00:22:22 +01:00
pancake 046efbdae8 Fix more plugins 2020-02-11 15:58:45 +01:00
pancake cc4a103ff3 Fix swf build 2020-02-11 15:53:42 +01:00
pancake b9723c5629 Fix nios build 2020-02-11 15:48:36 +01:00
pancake ae90621fe0 Initial implementation of the r2svd tool 2020-02-11 12:23:20 +01:00
Khairulmizam Samsudin 2e53b36308 Code cleanup 2020-02-06 17:55:28 +01:00
Khairulmizam Samsudin 26838fc56f Implement disassembler for Python >=3.6
- Used architecture bits to diffrentiate Python operand size
- Default to Python >=3.6
2020-02-06 17:55:28 +01:00
Khairulmizam Samsudin 986b99a6fe Implement disassembler for Python <3.6 2020-02-06 17:55:28 +01:00
Khairulmizam Samsudin 4c9a552d06 Change line ending to unix 2020-02-06 17:55:28 +01:00
Khairulmizam Samsudin ef5771f7ce Various fix for section detection (#226)
- Correct pointer offset after finding entry point
- Define the right size for Python object type
- Prevent memory corruption problem when naming section
2020-02-04 17:57:38 +01:00
Sylvain Pelissier 8ba3432f5c Microblaze ESIL load and store with immediate 2020-02-03 15:13:39 +01:00
Sylvain Pelissier 271369f8ee Move RAnalOpMask into parameter 2020-02-03 15:13:39 +01:00
Sylvain Pelissier 145e685c60 Logical instructions with immediate 2020-02-03 15:13:39 +01:00
Sylvain Pelissier 730433360e Microblaze ESIL: handle carry flag 2020-02-03 15:13:39 +01:00
Khairulmizam Samsudin f1f617f791 Implement new method to find entrypoint
- Detect entrypoint for ALL cpython version
- Detection does not depend on correct bytecode magic number
2020-02-02 11:13:26 +01:00
Khairulmizam Samsudin c3d8e433bd Refactor pyc_version struct
- Update latest magic from github.com/python/cpython
- Simplify the structure of pyc_version
- remove unicode information from pyc_version struct
2020-02-02 11:13:26 +01:00
Khairulmizam Samsudin 934c08364f Add base address information 2020-01-28 18:07:58 +01:00
Khairulmizam Samsudin 6e8b2ed5db Fix bytecode version detection 2020-01-28 18:07:58 +01:00
Khairulmizam Samsudin 2434f97937 Replace CORELIB with R2_PLUGIN_INCORE 2020-01-28 18:07:58 +01:00
procfs 3319911179 fix overflow bugs in pyc module 2020-01-27 16:58:39 +01:00
Khairulmizam Samsudin 5eb18b3e3b Disable TYPE_LONG due to dependencies to libgmp 2020-01-27 07:45:37 +01:00
Khairulmizam Samsudin 91eeb7b154 Updated using new RBuffer struct 2020-01-27 07:45:37 +01:00
Khairulmizam Samsudin b01f0180ea Updated using new RBinPlugin struct 2020-01-27 07:45:37 +01:00
Khairulmizam Samsudin 16e27dc9e9 Ignore tags 2020-01-27 07:45:37 +01:00
Sylvain Pelissier 5f6f945498 Microblaze ESIL for shift and sign extension (#216) 2019-10-28 16:53:50 +01:00
40 changed files with 1424 additions and 1297 deletions

No files matched your search

+3
View File
@@ -18,3 +18,6 @@
*.un~
/Makefile
/options.mk
# misc
tags
+8 -8
View File
@@ -32,19 +32,19 @@ addons:
env:
- TESTS="r2pm -i armthumb"
- TESTS="r2pm -i baleful"
# - TESTS="r2pm -i bcl" [BR] https://travis-ci.org/radareorg/radare2-extras/builds/157522362
- TESTS="r2pm -i bcl"
- TESTS="r2pm -i blackfin"
- TESTS="r2pm -i blessr2"
# - TESTS="r2pm -i bpf" [BR] https://travis-ci.org/radareorg/radare2-extras/builds/157522362
# - TESTS="r2pm -i dlang" [BR] https://travis-ci.org/radareorg/radare2-extras/builds/157522362
- TESTS="r2pm -i dirtycow"
# ONLY FOR LINUX - TESTS="r2pm -i dirtycow"
- TESTS="r2pm -i lang-duktape"
- TESTS="git clone git://git.code.sf.net/p/libdwarf/code libdwarf-code && cd libdwarf-code && ./configure && make && cd .. && r2pm -i dwarf-parser && cd radare2-regressions && ./r2r dwarf && cd .. && r2pm -u libdwarf && rm -rf libdwarf-code" #need to remove libdwarf? or travis destroys the vm so no issue in that?
# - TESTS="git clone git://git.code.sf.net/p/libdwarf/code libdwarf-code && cd libdwarf-code && ./configure && make && cd .. && r2pm -i dwarf-parser && cd radare2-regressions && ./r2r dwarf && cd .. && r2pm -u libdwarf && rm -rf libdwarf-code" #need to remove libdwarf? or travis destroys the vm so no issue in that?
- TESTS="r2pm -i r2frida"
# - TESTS="r2pm -i io-ewf" # https://github.com/travis-ci/apt-package-whitelist/issues/3205
# - TESTS="r2pm -i keystone-lib && r2pm -i keystone && cd radare2-regressions && make keystone && cd .." [BR] https://travis-ci.org/radareorg/radare2-extras/builds/157522362
- TESTS="r2pm -i mc6809"
- TESTS="r2pm -i microblaze && cd radare2-regressions && make microblaze"
- TESTS="r2pm -i microblaze && cd radare2/test && make microblaze && cd ../.."
- TESTS="r2pm -i msil"
- TESTS="r2pm -i pcap"
- TESTS="r2pm -i ppcdisasm"
@@ -60,8 +60,8 @@ env:
- TESTS="r2pm -i radare2"
# - TESTS="r2pm -i r2snow" https://travis-ci.org/radareorg/radare2-extras/jobs/199500082
# - TESTS="r2pm -i radeco" [BR] https://travis-ci.org/radare/radare2-extras/builds/157522362
- TESTS="r2pm -i retdec"
- TESTS="r2pm -i swf && cd radare2-regressions && make swf && cd .."
# - TESTS="r2pm -i retdec"
- TESTS="r2pm -i swf && cd radare2/test && make swf && cd ../.."
# - TESTS="r2pm -i m68k-net && cd radare2-regressions && make m68k-extras && cd .." [BR] https://travis-ci.org/radare/radare2-extras/builds/387043680
# - TESTS="r2pm -i swig" Sorry. This package cannot be installed in your home.
- TESTS="r2pm -i syms2elf"
@@ -79,9 +79,9 @@ env:
- TESTS="r2pm -i x86udis"
- TESTS="r2pm -i x86bea"
- TESTS="r2pm -i x86tab"
- TESTS="r2pm -i x86olly && cd radare2-regressions && make olly-extras && cd .."
- TESTS="r2pm -i x86olly && cd radare2/test && make olly-extras && cd ../.."
- TESTS="r2pm -i z80-nc"
- TESTS="r2pm -i yara && r2pm -i yara-r2"
- TESTS="r2pm -i yara && r2pm -i yara-r2 && cd radare2/test && make yara && cd ../.."
- TESTS="r2pm -i x86zyan"
language:
- rust
+1 -1
View File
@@ -37,7 +37,7 @@ static int findpair(ut64 addr, const ut8 *buf, int len, int base) {
return 0;
}
static int bcl_op(RAnal *anal, RAnalOp *op, ut64 addr, const ut8 *buf, int len) {
static int bcl_op(RAnal *anal, RAnalOp *op, ut64 addr, const ut8 *buf, int len, RAnalOpMask mask) {
int i;
char cache[256] = {0};
ut64 dst = 0LL;
+6 -3
View File
@@ -9,21 +9,23 @@ static int disassemble(RAsm *a, RAsmOp *op, const ut8 *buf, int len) {
const char *bases = "ACGT";
if (a->pc == 0) {
ut32 *clusters = (ut32*)buf;
snprintf (op->buf_asm, sizeof (op->buf_asm), "clusters %d\n", *clusters);
r_strbuf_setf (&op->buf_asm, "clusters %d", *clusters);
// snprintf (op->buf_asm, sizeof (op->buf_asm), "clusters %d\n", *clusters);
return op->size = 4;
}
if (*buf != 0) {
char base = bases[*buf & 3];
int qual = *buf >> 2;
snprintf (op->buf_asm, sizeof (op->buf_asm), "%c ; %d", base, qual);
r_strbuf_setf (&op->buf_asm, "%c ; %d", base, qual);
op->size = 1;
return 1;
}
strcpy (op->buf_asm, ".");
r_strbuf_setf (&op->buf_asm, ".");
return 0;
}
static int assemble(RAsm *a, RAsmOp *op, const char *buf) {
#if 0
bool qmode = false;
int quality = 0;
int outsz = 128;
@@ -76,6 +78,7 @@ static int assemble(RAsm *a, RAsmOp *op, const char *buf) {
out[op->size] = (quality<<2) | base;
op->size ++;
}
#endif
return op->size;
}
+65 -90
View File
@@ -5,8 +5,11 @@
#include <r_lib.h>
#include <r_bin.h>
static int check_bytes(const ut8 *buf, ut64 length) {
if (buf && length >= 4) {
static bool __check_buffer(RBuffer *b) {
ut8 buf[8];
int length = r_buf_size (b);
int r = r_buf_read_at (b, 0, buf, sizeof (buf));
if (r == sizeof (buf)) {
ut32 cls = r_mem_get_num (buf, 4);
ut32 cls2 = r_mem_get_num (buf + 4, 4);
if (cls + 4 == length && !cls2) {
@@ -16,64 +19,49 @@ static int check_bytes(const ut8 *buf, ut64 length) {
return false;
}
static int check(RBinFile *arch) {
const ut8 *bytes = arch ? r_buf_buffer (arch->buf) : NULL;
ut64 sz = arch ? r_buf_size (arch->buf): 0;
return check_bytes (bytes, sz);
static bool load_buffer(RBinFile *bf, void **bin_obj, RBuffer *buf, ut64 loadaddr, Sdb *sdb) {
return __check_buffer (buf);
}
static Sdb* get_sdb (RBinObject *o) {
if (!o) return NULL;
//struct r_bin_[NAME]_obj_t *bin = (struct r_bin_r_bin_[NAME]_obj_t *) o->bin_obj;
//if (bin->kv) return kv;
return NULL;
}
static void * load_bytes(RBinFile *arch, const ut8 *buf, ut64 sz, ut64 loadaddr, Sdb *sdb){
return (void*)(size_t)check_bytes (buf, sz);
}
static int load(RBinFile *arch) {
return check(arch);
}
static int destroy (RBinFile *arch) {
return true;
}
static ut64 baddr(RBinFile *arch) {
static ut64 baddr(RBinFile *bf) {
return 4;
}
static RBinAddr* binsym(RBinFile *arch, int type) {
static RBinAddr* binsym(RBinFile *bf, int type) {
return NULL; // TODO
}
static ut64 findEntry(RBuffer *buf, int n) {
ut8 b;
ut64 buf_size = r_buf_size (buf);
int i;
for (i=4;i<buf->length; i++) {
if (buf->buf[i] != 0) {
for (i = 4; i < buf_size; i++) {
if (r_buf_read_at (buf, i, &b, 1) != 1) {
break;
}
if (b != 0) {
if (n == 0) {
return i;
}
n--;
for (++i; i<buf->length; i++) {
if (!buf->buf[i])
for (++i; i < buf_size && b; i++) {
if (r_buf_read_at (buf, i, &b, 1) != 1) {
break;
}
}
}
}
return 0;
}
static RList* entries(RBinFile *arch) {
static RList* entries(RBinFile *bf) {
RList* ret = r_list_newf (free);
RBinAddr *ptr = NULL;
if (ret) {
if ((ptr = R_NEW0 (RBinAddr))) {
ut64 entry = findEntry (arch->buf, 2);
if (!entry) entry = findEntry (arch->buf, 1);
if (!entry) entry = findEntry (arch->buf, 0);
ut64 entry = findEntry (bf->buf, 2);
if (!entry) entry = findEntry (bf->buf, 1);
if (!entry) entry = findEntry (bf->buf, 0);
if (!entry) entry = 4;
ptr->paddr = entry;
ptr->vaddr = entry;
@@ -86,79 +74,74 @@ static RList* entries(RBinFile *arch) {
return ret;
}
static RList* sections(RBinFile *arch) {
static RList* sections(RBinFile *bf) {
RList *ret = NULL;
RBinSection *ptr = NULL;
ut64 textsize, datasize, symssize, spszsize, pcszsize;
ut64 entry0 = findEntry (arch->buf, 0);
ut64 entry1 = findEntry (arch->buf, 1);
ut64 entry2 = findEntry (arch->buf, 2);
ut64 entry0 = findEntry (bf->buf, 0);
ut64 entry1 = findEntry (bf->buf, 1);
ut64 entry2 = findEntry (bf->buf, 2);
if (!(ret = r_list_newf (free))) {
return NULL;
}
// add text segment
textsize = r_mem_get_num (arch->buf->buf + 4, 4);
ut8 str[4] = {0};
r_buf_read_at (bf->buf, 4, str, 4);
textsize = r_mem_get_num (str, 4);
if (!(ptr = R_NEW0 (RBinSection))) {
return ret;
}
if (!entry1) {
entry1 = arch->buf->length;
entry1 = r_buf_size (bf->buf);
}
strncpy (ptr->name, "init", R_BIN_SIZEOF_STRINGS);
ptr->size = entry1-entry0;
ptr->vsize = entry1-entry0;
ptr->name = strdup ("init");
ptr->size = entry1 - entry0;
ptr->vsize = entry1 - entry0;
ptr->paddr = entry0 + 4;
ptr->vaddr = entry0;
ptr->srwx = R_BIN_SCN_READABLE | R_BIN_SCN_EXECUTABLE | R_BIN_SCN_MAP; // r-x
ptr->add = true;
ptr->perm = R_PERM_RX;
r_list_append (ret, ptr);
if (entry1) {
if (entry2) {
if (!(ptr = R_NEW0 (RBinSection)))
if (!(ptr = R_NEW0 (RBinSection))) {
return ret;
strncpy (ptr->name, "fini", R_BIN_SIZEOF_STRINGS);
ptr->size = entry2-entry1;
ptr->vsize = entry2-entry1;
}
ptr->name = strdup ("fini");
ptr->size = entry2 - entry1;
ptr->vsize = entry2 - entry1;
ptr->paddr = entry1 + 4;
ptr->vaddr = entry1;
ptr->srwx = R_BIN_SCN_READABLE | R_BIN_SCN_EXECUTABLE | R_BIN_SCN_MAP; // r-x
ptr->perm = R_PERM_RX;
ptr->add = true;
r_list_append (ret, ptr);
} else {
entry2 = entry1;
}
}
if (entry2) {
if (!(ptr = R_NEW0 (RBinSection)))
if (!(ptr = R_NEW0 (RBinSection))) {
return ret;
strncpy (ptr->name, "text", R_BIN_SIZEOF_STRINGS);
ptr->size = arch->buf->length - entry2;
ptr->vsize = arch->buf->length - entry2;
}
ptr->name = strdup ("text");
ut64 filesize = r_buf_size (bf->buf);
ptr->size = filesize - entry2;
ptr->vsize = filesize - entry2;
ptr->paddr = entry2 + 4;
ptr->vaddr = entry2;
ptr->srwx = R_BIN_SCN_READABLE | R_BIN_SCN_EXECUTABLE | R_BIN_SCN_MAP; // r-x
ptr->perm = R_PERM_RX;
ptr->add = true;
r_list_append (ret, ptr);
}
return ret;
}
static RList* symbols(RBinFile *arch) {
// TODO: parse symbol table
return NULL;
}
static RList* imports(RBinFile *arch) {
return NULL;
}
static RList* libs(RBinFile *arch) {
return NULL;
}
static RBinInfo* info(RBinFile *arch) {
static RBinInfo* info(RBinFile *bf) {
RBinInfo *ret = R_NEW0 (RBinInfo);
if (ret) {
ret->file = strdup (arch->file);
ret->file = strdup (bf->file);
ret->bclass = strdup ("dna");
ret->rclass = strdup ("bcl");
ret->os = strdup ("Illumina DNA Sequences");
@@ -174,18 +157,17 @@ static RBinInfo* info(RBinFile *arch) {
return ret;
}
static ut64 size(RBinFile *arch) {
ut64 text, data, syms, spsz;
int big_endian;
if (!arch->o->info) {
arch->o->info = info (arch);
static ut64 size(RBinFile *bf) {
if (!bf->o->info) {
bf->o->info = info (bf);
}
big_endian = arch->o->info->big_endian;
ut8 str[32] = {0};
r_buf_read_at (bf->buf, 0, str, 32);
// TODO: reuse section list
text = r_mem_get_num (arch->buf->buf + 4, 4);
data = r_mem_get_num (arch->buf->buf + 8, 4);
syms = r_mem_get_num (arch->buf->buf + 16, 4);
spsz = r_mem_get_num (arch->buf->buf + 24, 4);
ut64 text = r_mem_get_num (str + 4, 4);
ut64 data = r_mem_get_num (str + 8, 4);
ut64 syms = r_mem_get_num (str + 16, 4);
ut64 spsz = r_mem_get_num (str + 24, 4);
return text + data + syms + spsz + (6 * 4);
}
@@ -193,25 +175,18 @@ RBinPlugin r_bin_plugin_bcl = {
.name = "bcl",
.desc = "Base Call DNA Illumina",
.license = "BSD",
.get_sdb = &get_sdb,
.load = &load,
.load_bytes = &load_bytes,
.load_buffer = &load_buffer,
.check_buffer = &__check_buffer,
.size = &size,
.destroy = &destroy,
.check = &check,
.check_bytes = &check_bytes,
.baddr = &baddr,
.binsym = &binsym,
.entries = &entries,
.sections = &sections,
.symbols = &symbols,
.imports = &imports,
.info = &info,
.libs = &libs,
};
#ifndef CORELIB
struct r_lib_struct_t radare_plugin = {
RLibStruct radare_plugin = {
.type = R_LIB_TYPE_BIN,
.data = &r_bin_plugin_bcl,
.version = R2_VERSION
Vendored
+6 -6
View File
@@ -1,5 +1,5 @@
#!/bin/sh
# This script was automatically generated by ACR v1.7.2
# This script was automatically generated by ACR v1.8.1
# @author: pancake <nopcode.org>
# @url: http://www.nopcode.org
# @repo: git clone https://github.com/radare/acr
@@ -105,12 +105,12 @@ done
: ${INSTALL_PROGRAM_STRIP:=${INSTALL} -m 755 -s}
: ${INSTALL_MAN:=${INSTALL} -m 444}
: ${INSTALL_LIB:=${INSTALL} -m 755 -c}
PKGNAME='radare2-extras' ; VERSION='4.0.0' ; CONTACT_MAIL="[email protected]" ; CONTACT_NAME="pancake" ; CONTACT="pancake <[email protected]>" ;
PKGNAME='radare2-extras' ; VERSION='4.3.0' ; VERSION_MAJOR=4; VERSION_MINOR=3; VERSION_PATCH=0; VERSION_NUMBER=40300; CONTACT_MAIL="[email protected]" ; CONTACT_NAME="pancake" ; CONTACT="pancake <[email protected]>" ;
}
show_usage() {
cat <<EOF2
'configure' configures radare2-extras-4.0.0 to adapt to many kinds of systems.
'configure' configures radare2-extras-4.3.0 to adapt to many kinds of systems.
Usage: ./configure [OPTION]... [VAR=VALUE]...
@@ -180,7 +180,7 @@ take_environ() {
}
show_version() {
echo "radare2-extras-4.0.0 configuration script done with acr v1.7.2.
echo "radare2-extras-4.3.0 configuration script done with acr v1.8.1.
The 'Free Software Foundation' message is only for autodetection.
Originally written by pancake <nopcode.org>."
exit 0
@@ -204,7 +204,7 @@ case $flag in
show_version ; ;;
-r|--r|--report)
echo "PKGNAME: radare2-extras"
echo "VERSION: 4.0.0"
echo "VERSION: 4.3.0"
echo "LANGS: c"
echo "OPTIONAL: libewf libyara"
echo "PKG-CONFIG: r_core libewf unicorn yara"
@@ -273,7 +273,7 @@ parse_options "$1"
shift
done
ENVWORDS="MANDIR INFODIR LIBDIR INCLUDEDIR LOCALSTATEDIR SYSCONFDIR DATADIR DOCDIR LIBEXECDIR SBINDIR BINDIR EPREFIX PREFIX SPREFIX TARGET HOST BUILD INSTALL INSTALL_LIB INSTALL_MAN INSTALL_PROGRAM INSTALL_PROGRAM_STRIP INSTALL_DIR INSTALL_SCRIPT INSTALL_DATA HOST_OS HOST_CPU BUILD_OS BUILD_CPU TARGET_OS TARGET_CPU PKGNAME VPATH VERSION CONTACT CONTACT_NAME CONTACT_MAIL CC CFLAGS CPPFLAGS LDFLAGS HAVE_LANG_C R2_CFLAGS R2_LDFLAGS HAVE_PKGCFG_R_CORE USEROSTYPE HAVE_LIB_EWF EWF_CFLAGS EWF_LDFLAGS HAVE_PKGCFG_LIBEWF WANT_EWF UC_CFLAGS UC_LDFLAGS HAVE_PKGCFG_UNICORN HAVE_LIB_YARA YARA_CFLAGS YARA_LDFLAGS HAVE_PKGCFG_YARA"
ENVWORDS="MANDIR INFODIR LIBDIR INCLUDEDIR LOCALSTATEDIR SYSCONFDIR DATADIR DOCDIR LIBEXECDIR SBINDIR BINDIR EPREFIX PREFIX SPREFIX TARGET HOST BUILD INSTALL INSTALL_LIB INSTALL_MAN INSTALL_PROGRAM INSTALL_PROGRAM_STRIP INSTALL_DIR INSTALL_SCRIPT INSTALL_DATA HOST_OS HOST_CPU BUILD_OS BUILD_CPU TARGET_OS TARGET_CPU VERSION VERSION_MAJOR VERSION_MINOR VERSION_PATCH VERSION_NUMBER PKGNAME VPATH CONTACT CONTACT_NAME CONTACT_MAIL CC CFLAGS CPPFLAGS LDFLAGS HAVE_LANG_C R2_CFLAGS R2_LDFLAGS HAVE_PKGCFG_R_CORE USEROSTYPE HAVE_LIB_EWF EWF_CFLAGS EWF_LDFLAGS HAVE_PKGCFG_LIBEWF WANT_EWF UC_CFLAGS UC_LDFLAGS HAVE_PKGCFG_UNICORN HAVE_LIB_YARA YARA_CFLAGS YARA_LDFLAGS HAVE_PKGCFG_YARA"
create_environ
+1 -1
View File
@@ -1,5 +1,5 @@
PKGNAME radare2-extras
VERSION 4.0.0
VERSION 4.3.0
CONTACT pancake ; [email protected]
REPORT PREFIX ;
+4 -4
View File
@@ -1,5 +1,5 @@
#!/bin/sh
# This script was automatically generated by ACR v1.7.2
# This script was automatically generated by ACR v1.8.1
# @author: pancake <nopcode.org>
# @url: http://www.nopcode.org
# @repo: git clone https://github.com/radare/acr
@@ -103,7 +103,7 @@ done
: ${INSTALL_PROGRAM_STRIP:=${INSTALL} -m 755 -s}
: ${INSTALL_MAN:=${INSTALL} -m 444}
: ${INSTALL_LIB:=${INSTALL} -m 755 -c}
PKGNAME='radare2-keystone' ; VERSION='0.1' ; CONTACT_MAIL="[email protected]" ; CONTACT_NAME="pancake" ; CONTACT="pancake <[email protected]>" ;
PKGNAME='radare2-keystone' ; VERSION='0.1' ; VERSION_MAJOR=0; VERSION_MINOR=1; VERSION_PATCH=0; VERSION_NUMBER=00100; CONTACT_MAIL="[email protected]" ; CONTACT_NAME="pancake" ; CONTACT="pancake <[email protected]>" ;
}
show_usage() {
@@ -177,7 +177,7 @@ take_environ() {
}
show_version() {
echo "radare2-keystone-0.1 configuration script done with acr v1.7.2.
echo "radare2-keystone-0.1 configuration script done with acr v1.8.1.
The 'Free Software Foundation' message is only for autodetection.
Originally written by pancake <nopcode.org>."
exit 0
@@ -267,7 +267,7 @@ parse_options "$1"
shift
done
ENVWORDS="MANDIR INFODIR LIBDIR INCLUDEDIR LOCALSTATEDIR SYSCONFDIR DATADIR DOCDIR LIBEXECDIR SBINDIR BINDIR EPREFIX PREFIX SPREFIX TARGET HOST BUILD INSTALL INSTALL_LIB INSTALL_MAN INSTALL_PROGRAM INSTALL_PROGRAM_STRIP INSTALL_DIR INSTALL_SCRIPT INSTALL_DATA HOST_OS HOST_CPU BUILD_OS BUILD_CPU TARGET_OS TARGET_CPU PKGNAME VPATH VERSION CONTACT CONTACT_NAME CONTACT_MAIL CC CFLAGS CPPFLAGS LDFLAGS HAVE_LANG_C CXX CXXFLAGS HAVE_LANG_CXX HAVE_LIB_KEYSTONE R2_CFLAGS R2_LDFLAGS HAVE_PKGCFG_R_ASM"
ENVWORDS="MANDIR INFODIR LIBDIR INCLUDEDIR LOCALSTATEDIR SYSCONFDIR DATADIR DOCDIR LIBEXECDIR SBINDIR BINDIR EPREFIX PREFIX SPREFIX TARGET HOST BUILD INSTALL INSTALL_LIB INSTALL_MAN INSTALL_PROGRAM INSTALL_PROGRAM_STRIP INSTALL_DIR INSTALL_SCRIPT INSTALL_DATA HOST_OS HOST_CPU BUILD_OS BUILD_CPU TARGET_OS TARGET_CPU VERSION VERSION_MAJOR VERSION_MINOR VERSION_PATCH VERSION_NUMBER PKGNAME VPATH CONTACT CONTACT_NAME CONTACT_MAIL CC CFLAGS CPPFLAGS LDFLAGS HAVE_LANG_C CXX CXXFLAGS HAVE_LANG_CXX HAVE_LIB_KEYSTONE R2_CFLAGS R2_LDFLAGS HAVE_PKGCFG_R_ASM"
create_environ
+1
View File
@@ -53,6 +53,7 @@ clean:
rm -f p/asm_x86_bea.$(LIBEXT)
rm -f p/asm_x86_tab.$(LIBEXT)
rm -f p/asm_x86_olly.$(LIBEXT)
rm -f p/asm_pyc.$(LIBEXT)
rm -f p/asm_m68k.$(LIBEXT)
rm -f p/asm_x86_zyan.$(LIBEXT)
rm -f p/asm_atombios.{$(LIBEXT),o}
+2
View File
@@ -37,6 +37,7 @@ static void add_insn_to_hash_chain (CGEN_INSN_LIST *,
CGEN_INSN_LIST **,
unsigned int);
#if 0
bfd_uint64_t
bfd_get_bits (const void *p, int bits, bfd_boolean big_p)
{
@@ -59,6 +60,7 @@ bfd_get_bits (const void *p, int bits, bfd_boolean big_p)
return data;
}
#endif
void
bfd_put_bits (bfd_uint64_t data, void *p, int bits, bfd_boolean big_p)
+2
View File
@@ -1054,10 +1054,12 @@ nios_cgen_assemble_insn (CGEN_CPU_DESC cd,
str = start;
#if 0
/* Skip this insn if str doesn't look right lexically. */
if (CGEN_INSN_RX (insn) != NULL &&
regexec ((regex_t *) CGEN_INSN_RX (insn), str, 0, NULL, 0) == REG_NOMATCH)
continue;
#endif
/* Allow parse/insert handlers to obtain length of insn. */
CGEN_FIELDS_BITSIZE (fields) = CGEN_INSN_BITSIZE (insn);
+4 -2
View File
@@ -1612,9 +1612,10 @@ nios_cgen_cpu_open_1 (const char *mach_name, enum cgen_endian endian)
void
nios_cgen_cpu_close (CGEN_CPU_DESC cd)
{
unsigned int i;
const CGEN_INSN *insns;
#if 0
const CGEN_INSN *insns;
unsigned int i;
if (cd->macro_insn_table.init_entries)
{
insns = cd->macro_insn_table.init_entries;
@@ -1630,6 +1631,7 @@ nios_cgen_cpu_close (CGEN_CPU_DESC cd)
if (CGEN_INSN_RX (insns))
regfree (CGEN_INSN_RX (insns));
}
#endif
if (cd->macro_insn_table.init_entries)
free ((CGEN_INSN *) cd->macro_insn_table.init_entries);
+162 -154
View File
@@ -1,154 +1,162 @@
#define STOP_CODE 0
#define POP_TOP 1
#define ROT_TWO 2
#define ROT_THREE 3
#define DUP_TOP 4
#define ROT_FOUR 5
#define NOP 9
#define UNARY_POSITIVE 10
#define UNARY_NEGATIVE 11
#define UNARY_NOT 12
#define UNARY_CONVERT 13
#define UNARY_INVERT 15
#define BINARY_POWER 19
#define BINARY_MULTIPLY 20
#define BINARY_DIVIDE 21
#define BINARY_MODULO 22
#define BINARY_ADD 23
#define BINARY_SUBTRACT 24
#define BINARY_SUBSCR 25
#define BINARY_FLOOR_DIVIDE 26
#define BINARY_TRUE_DIVIDE 27
#define INPLACE_FLOOR_DIVIDE 28
#define INPLACE_TRUE_DIVIDE 29
#define SLICE 30
/* Also uses 31-33 */
#define SLICE_1 31
#define SLICE_2 32
#define SLICE_3 33
#define STORE_SLICE 40
/* Also uses 41-43 */
#define STORE_SLICE_1 41
#define STORE_SLICE_2 42
#define STORE_SLICE_3 43
#define DELETE_SLICE 50
/* Also uses 51-53 */
#define DELETE_SLICE_1 51
#define DELETE_SLICE_2 52
#define DELETE_SLICE_3 53
#define STORE_MAP 54
#define INPLACE_ADD 55
#define INPLACE_SUBTRACT 56
#define INPLACE_MULTIPLY 57
#define INPLACE_DIVIDE 58
#define INPLACE_MODULO 59
#define STORE_SUBSCR 60
#define DELETE_SUBSCR 61
#define BINARY_LSHIFT 62
#define BINARY_RSHIFT 63
#define BINARY_AND 64
#define BINARY_XOR 65
#define BINARY_OR 66
#define INPLACE_POWER 67
#define GET_ITER 68
#define PRINT_EXPR 70
#define PRINT_ITEM 71
#define PRINT_NEWLINE 72
#define PRINT_ITEM_TO 73
#define PRINT_NEWLINE_TO 74
#define INPLACE_LSHIFT 75
#define INPLACE_RSHIFT 76
#define INPLACE_AND 77
#define INPLACE_XOR 78
#define INPLACE_OR 79
#define BREAK_LOOP 80
#define WITH_CLEANUP 81
#define LOAD_LOCALS 82
#define RETURN_VALUE 83
#define IMPORT_STAR 84
#define EXEC_STMT 85
#define YIELD_VALUE 86
#define POP_BLOCK 87
#define END_FINALLY 88
#define BUILD_CLASS 89
#define HAVE_ARGUMENT 90 /* Opcodes from here have an argument: */
#define STORE_NAME 90 /* Index in name list */
#define DELETE_NAME 91 /* "" */
#define UNPACK_SEQUENCE 92 /* Number of sequence items */
#define FOR_ITER 93
#define LIST_APPEND 94
#define STORE_ATTR 95 /* Index in name list */
#define DELETE_ATTR 96 /* "" */
#define STORE_GLOBAL 97 /* "" */
#define DELETE_GLOBAL 98 /* "" */
#define DUP_TOPX 99 /* number of items to duplicate */
#define LOAD_CONST 100 /* Index in const list */
#define LOAD_NAME 101 /* Index in name list */
#define BUILD_TUPLE 102 /* Number of tuple items */
#define BUILD_LIST 103 /* Number of list items */
#define BUILD_SET 104 /* Number of set items */
#define BUILD_MAP 105 /* Always zero for now */
#define LOAD_ATTR 106 /* Index in name list */
#define COMPARE_OP 107 /* Comparison operator */
#define IMPORT_NAME 108 /* Index in name list */
#define IMPORT_FROM 109 /* Index in name list */
#define JUMP_FORWARD 110 /* Number of bytes to skip */
#define JUMP_IF_FALSE_OR_POP 111 /* Target byte offset from beginning
of code */
#define JUMP_IF_TRUE_OR_POP 112 /* "" */
#define JUMP_ABSOLUTE 113 /* "" */
#define POP_JUMP_IF_FALSE 114 /* "" */
#define POP_JUMP_IF_TRUE 115 /* "" */
#define LOAD_GLOBAL 116 /* Index in name list */
#define CONTINUE_LOOP 119 /* Start of loop (absolute) */
#define SETUP_LOOP 120 /* Target address (relative) */
#define SETUP_EXCEPT 121 /* "" */
#define SETUP_FINALLY 122 /* "" */
#define LOAD_FAST 124 /* Local variable number */
#define STORE_FAST 125 /* Local variable number */
#define DELETE_FAST 126 /* Local variable number */
#define RAISE_VARARGS 130 /* Number of raise arguments (1, 2 or 3) */
/* CALL_FUNCTION_XXX opcodes defined below depend on this definition */
#define CALL_FUNCTION 131 /* #args + (#kwargs<<8) */
#define MAKE_FUNCTION 132 /* #defaults */
#define BUILD_SLICE 133 /* Number of items */
#define MAKE_CLOSURE 134 /* #free vars */
#define LOAD_CLOSURE 135 /* Load free variable from closure */
#define LOAD_DEREF 136 /* Load and dereference from closure cell */
#define STORE_DEREF 137 /* Store into cell */
/* The next 3 opcodes must be contiguous and satisfy
(CALL_FUNCTION_VAR - CALL_FUNCTION) & 3 == 1 */
#define CALL_FUNCTION_VAR 140 /* #args + (#kwargs<<8) */
#define CALL_FUNCTION_KW 141 /* #args + (#kwargs<<8) */
#define CALL_FUNCTION_VAR_KW 142 /* #args + (#kwargs<<8) */
#define SETUP_WITH 143
/* Support for opargs more than 16 bits long */
#define EXTENDED_ARG 145
#define SET_ADD 146
#define MAP_ADD 147
char *op_name[0xff + 1];
/* radare - LGPL3 - Copyright 2016-2020 - c0riolis, x0urc3 */
#ifndef OPCODE_H
#define OPCODE_H
#define STOP_CODE 0
#define POP_TOP 1
#define ROT_TWO 2
#define ROT_THREE 3
#define DUP_TOP 4
#define ROT_FOUR 5
#define NOP 9
#define UNARY_POSITIVE 10
#define UNARY_NEGATIVE 11
#define UNARY_NOT 12
#define UNARY_CONVERT 13
#define UNARY_INVERT 15
#define BINARY_POWER 19
#define BINARY_MULTIPLY 20
#define BINARY_DIVIDE 21
#define BINARY_MODULO 22
#define BINARY_ADD 23
#define BINARY_SUBTRACT 24
#define BINARY_SUBSCR 25
#define BINARY_FLOOR_DIVIDE 26
#define BINARY_TRUE_DIVIDE 27
#define INPLACE_FLOOR_DIVIDE 28
#define INPLACE_TRUE_DIVIDE 29
#define SLICE 30
/* Also uses 31-33 */
#define SLICE_1 31
#define SLICE_2 32
#define SLICE_3 33
#define STORE_SLICE 40
/* Also uses 41-43 */
#define STORE_SLICE_1 41
#define STORE_SLICE_2 42
#define STORE_SLICE_3 43
#define DELETE_SLICE 50
/* Also uses 51-53 */
#define DELETE_SLICE_1 51
#define DELETE_SLICE_2 52
#define DELETE_SLICE_3 53
#define STORE_MAP 54
#define INPLACE_ADD 55
#define INPLACE_SUBTRACT 56
#define INPLACE_MULTIPLY 57
#define INPLACE_DIVIDE 58
#define INPLACE_MODULO 59
#define STORE_SUBSCR 60
#define DELETE_SUBSCR 61
#define BINARY_LSHIFT 62
#define BINARY_RSHIFT 63
#define BINARY_AND 64
#define BINARY_XOR 65
#define BINARY_OR 66
#define INPLACE_POWER 67
#define GET_ITER 68
#define PRINT_EXPR 70
#define PRINT_ITEM 71
#define PRINT_NEWLINE 72
#define PRINT_ITEM_TO 73
#define PRINT_NEWLINE_TO 74
#define INPLACE_LSHIFT 75
#define INPLACE_RSHIFT 76
#define INPLACE_AND 77
#define INPLACE_XOR 78
#define INPLACE_OR 79
#define BREAK_LOOP 80
#define WITH_CLEANUP 81
#define LOAD_LOCALS 82
#define RETURN_VALUE 83
#define IMPORT_STAR 84
#define EXEC_STMT 85
#define YIELD_VALUE 86
#define POP_BLOCK 87
#define END_FINALLY 88
#define BUILD_CLASS 89
#define HAVE_ARGUMENT 90 /* Opcodes from here have an argument: */
#define STORE_NAME 90 /* Index in name list */
#define DELETE_NAME 91 /* "" */
#define UNPACK_SEQUENCE 92 /* Number of sequence items */
#define FOR_ITER 93
#define LIST_APPEND 94
#define STORE_ATTR 95 /* Index in name list */
#define DELETE_ATTR 96 /* "" */
#define STORE_GLOBAL 97 /* "" */
#define DELETE_GLOBAL 98 /* "" */
#define DUP_TOPX 99 /* number of items to duplicate */
#define LOAD_CONST 100 /* Index in const list */
#define LOAD_NAME 101 /* Index in name list */
#define BUILD_TUPLE 102 /* Number of tuple items */
#define BUILD_LIST 103 /* Number of list items */
#define BUILD_SET 104 /* Number of set items */
#define BUILD_MAP 105 /* Always zero for now */
#define LOAD_ATTR 106 /* Index in name list */
#define COMPARE_OP 107 /* Comparison operator */
#define IMPORT_NAME 108 /* Index in name list */
#define IMPORT_FROM 109 /* Index in name list */
#define JUMP_FORWARD 110 /* Number of bytes to skip */
#define JUMP_IF_FALSE_OR_POP 111 /* Target byte offset from beginning
of code */
#define JUMP_IF_TRUE_OR_POP 112 /* "" */
#define JUMP_ABSOLUTE 113 /* "" */
#define POP_JUMP_IF_FALSE 114 /* "" */
#define POP_JUMP_IF_TRUE 115 /* "" */
#define LOAD_GLOBAL 116 /* Index in name list */
#define CONTINUE_LOOP 119 /* Start of loop (absolute) */
#define SETUP_LOOP 120 /* Target address (relative) */
#define SETUP_EXCEPT 121 /* "" */
#define SETUP_FINALLY 122 /* "" */
#define LOAD_FAST 124 /* Local variable number */
#define STORE_FAST 125 /* Local variable number */
#define DELETE_FAST 126 /* Local variable number */
#define RAISE_VARARGS 130 /* Number of raise arguments (1, 2 or 3) */
/* CALL_FUNCTION_XXX opcodes defined below depend on this definition */
#define CALL_FUNCTION 131 /* #args + (#kwargs<<8) */
#define MAKE_FUNCTION 132 /* #defaults */
#define BUILD_SLICE 133 /* Number of items */
#define MAKE_CLOSURE 134 /* #free vars */
#define LOAD_CLOSURE 135 /* Load free variable from closure */
#define LOAD_DEREF 136 /* Load and dereference from closure cell */
#define STORE_DEREF 137 /* Store into cell */
/* The next 3 opcodes must be contiguous and satisfy
(CALL_FUNCTION_VAR - CALL_FUNCTION) & 3 == 1 */
#define CALL_FUNCTION_VAR 140 /* #args + (#kwargs<<8) */
#define CALL_FUNCTION_KW 141 /* #args + (#kwargs<<8) */
#define CALL_FUNCTION_VAR_KW 142 /* #args + (#kwargs<<8) */
#define SETUP_WITH 143
/* Support for opargs more than 16 bits long */
#define EXTENDED_ARG 145
#define SET_ADD 146
#define MAP_ADD 147
#define HAS_ARG(op) ((op) >= HAVE_ARGUMENT)
char *op_name[0xff + 1];
#endif
@@ -1,307 +1,310 @@
#include "pyc_dis.h"
void init_opname_table () {
int i;
for(i = 0; i < 0xff+1; i++)
op_name[i] = NULL;
op_name[STOP_CODE] = "STOP_CODE";
op_name[POP_TOP] = "POP_TOP";
op_name[ROT_TWO] = "ROT_TWO";
op_name[ROT_THREE] = "ROT_THREE";
op_name[DUP_TOP] = "DUP_TOP";
op_name[ROT_FOUR] = "ROT_FOUR";
op_name[NOP] = "NOP";
op_name[UNARY_POSITIVE] = "UNARY_POSITIVE";
op_name[UNARY_NEGATIVE] = "UNARY_NEGATIVE";
op_name[UNARY_NOT] = "UNARY_NOT";
op_name[UNARY_CONVERT] = "UNARY_CONVERT";
op_name[UNARY_INVERT] = "UNARY_INVERT";
op_name[BINARY_POWER] = "BINARY_POWER";
op_name[BINARY_MULTIPLY] = "BINARY_MULTIPLY";
op_name[BINARY_DIVIDE] = "BINARY_DIVIDE";
op_name[BINARY_MODULO] = "BINARY_MODULO";
op_name[BINARY_ADD] = "BINARY_ADD";
op_name[BINARY_SUBTRACT] = "BINARY_SUBTRACT";
op_name[BINARY_SUBSCR] = "BINARY_SUBSCR";
op_name[BINARY_FLOOR_DIVIDE] = "BINARY_FLOOR_DIVIDE";
op_name[BINARY_TRUE_DIVIDE] = "BINARY_TRUE_DIVIDE";
op_name[INPLACE_FLOOR_DIVIDE] = "INPLACE_FLOOR_DIVIDE";
op_name[INPLACE_TRUE_DIVIDE] = "INPLACE_TRUE_DIVIDE";
op_name[SLICE] = "SLICE";
op_name[SLICE_1] = "SLICE_1";
op_name[SLICE_2] = "SLICE_2";
op_name[SLICE_3] = "SLICE_3";
op_name[STORE_SLICE] = "STORE_SLICE";
op_name[STORE_SLICE_1] = "STORE_SLICE_1";
op_name[STORE_SLICE_2] = "STORE_SLICE_2";
op_name[STORE_SLICE_3] = "STORE_SLICE_3";
op_name[DELETE_SLICE] = "DELETE_SLICE";
op_name[DELETE_SLICE_1] = "DELETE_SLICE_1";
op_name[DELETE_SLICE_2] = "DELETE_SLICE_2";
op_name[DELETE_SLICE_3] = "DELETE_SLICE_3";
op_name[STORE_MAP] = "STORE_MAP";
op_name[INPLACE_ADD] = "INPLACE_ADD";
op_name[INPLACE_SUBTRACT] = "INPLACE_SUBTRACT";
op_name[INPLACE_MULTIPLY] = "INPLACE_MULTIPLY";
op_name[INPLACE_DIVIDE] = "INPLACE_DIVIDE";
op_name[INPLACE_MODULO] = "INPLACE_MODULO";
op_name[STORE_SUBSCR] = "STORE_SUBSCR";
op_name[DELETE_SUBSCR] = "DELETE_SUBSCR";
op_name[BINARY_LSHIFT] = "BINARY_LSHIFT";
op_name[BINARY_RSHIFT] = "BINARY_RSHIFT";
op_name[BINARY_AND] = "BINARY_AND";
op_name[BINARY_XOR] = "BINARY_XOR";
op_name[BINARY_OR] = "BINARY_OR";
op_name[INPLACE_POWER] = "INPLACE_POWER";
op_name[GET_ITER] = "GET_ITER";
op_name[PRINT_EXPR] = "PRINT_EXPR";
op_name[PRINT_ITEM] = "PRINT_ITEM";
op_name[PRINT_NEWLINE] = "PRINT_NEWLINE";
op_name[PRINT_ITEM_TO] = "PRINT_ITEM_TO";
op_name[PRINT_NEWLINE_TO] = "PRINT_NEWLINE_TO";
op_name[INPLACE_LSHIFT] = "INPLACE_LSHIFT";
op_name[INPLACE_RSHIFT] = "INPLACE_RSHIFT";
op_name[INPLACE_AND] = "INPLACE_AND";
op_name[INPLACE_XOR] = "INPLACE_XOR";
op_name[INPLACE_OR] = "INPLACE_OR";
op_name[BREAK_LOOP] = "BREAK_LOOP";
op_name[WITH_CLEANUP] = "WITH_CLEANUP";
op_name[LOAD_LOCALS] = "LOAD_LOCALS";
op_name[RETURN_VALUE] = "RETURN_VALUE";
op_name[IMPORT_STAR] = "IMPORT_STAR";
op_name[EXEC_STMT] = "EXEC_STMT";
op_name[YIELD_VALUE] = "YIELD_VALUE";
op_name[POP_BLOCK] = "POP_BLOCK";
op_name[END_FINALLY] = "END_FINALLY";
op_name[BUILD_CLASS] = "BUILD_CLASS";
op_name[HAVE_ARGUMENT] = "HAVE_ARGUMENT";
op_name[STORE_NAME] = "STORE_NAME";
op_name[DELETE_NAME] = "DELETE_NAME";
op_name[UNPACK_SEQUENCE] = "UNPACK_SEQUENCE";
op_name[FOR_ITER] = "FOR_ITER";
op_name[LIST_APPEND] = "LIST_APPEND";
op_name[STORE_ATTR] = "STORE_ATTR";
op_name[DELETE_ATTR] = "DELETE_ATTR";
op_name[STORE_GLOBAL] = "STORE_GLOBAL";
op_name[DELETE_GLOBAL] = "DELETE_GLOBAL";
op_name[DUP_TOPX] = "DUP_TOPX";
op_name[LOAD_CONST] = "LOAD_CONST";
op_name[LOAD_NAME] = "LOAD_NAME";
op_name[BUILD_TUPLE] = "BUILD_TUPLE";
op_name[BUILD_LIST] = "BUILD_LIST";
op_name[BUILD_SET] = "BUILD_SET";
op_name[BUILD_MAP] = "BUILD_MAP";
op_name[LOAD_ATTR] = "LOAD_ATTR";
op_name[COMPARE_OP] = "COMPARE_OP";
op_name[IMPORT_NAME] = "IMPORT_NAME";
op_name[IMPORT_FROM] = "IMPORT_FROM";
op_name[JUMP_FORWARD] = "JUMP_FORWARD";
op_name[JUMP_IF_FALSE_OR_POP] = "JUMP_IF_FALSE_OR_POP";
op_name[JUMP_IF_TRUE_OR_POP] = "JUMP_IF_TRUE_OR_POP";
op_name[JUMP_ABSOLUTE] = "JUMP_ABSOLUTE";
op_name[POP_JUMP_IF_FALSE] = "POP_JUMP_IF_FALSE";
op_name[POP_JUMP_IF_TRUE] = "POP_JUMP_IF_TRUE";
op_name[LOAD_GLOBAL] = "LOAD_GLOBAL";
op_name[CONTINUE_LOOP] = "CONTINUE_LOOP";
op_name[SETUP_LOOP] = "SETUP_LOOP";
op_name[SETUP_EXCEPT] = "SETUP_EXCEPT";
op_name[SETUP_FINALLY] = "SETUP_FINALLY";
op_name[LOAD_FAST] = "LOAD_FAST";
op_name[STORE_FAST] = "STORE_FAST";
op_name[DELETE_FAST] = "DELETE_FAST";
op_name[RAISE_VARARGS] = "RAISE_VARARGS";
op_name[CALL_FUNCTION] = "CALL_FUNCTION";
op_name[MAKE_FUNCTION] = "MAKE_FUNCTION";
op_name[BUILD_SLICE] = "BUILD_SLICE";
op_name[MAKE_CLOSURE] = "MAKE_CLOSURE";
op_name[LOAD_CLOSURE] = "LOAD_CLOSURE";
op_name[LOAD_DEREF] = "LOAD_DEREF";
op_name[STORE_DEREF] = "STORE_DEREF";
op_name[CALL_FUNCTION_VAR] = "CALL_FUNCTION_VAR";
op_name[CALL_FUNCTION_KW] = "CALL_FUNCTION_KW";
op_name[CALL_FUNCTION_VAR_KW] = "CALL_FUNCTION_VAR_KW";
op_name[SETUP_WITH] = "SETUP_WITH";
op_name[EXTENDED_ARG] = "EXTENDED_ARG";
op_name[SET_ADD] = "SET_ADD";
op_name[MAP_ADD] = "MAP_ADD";
}
int r_pyc_disasm (RAsmOp *opstruct, const ut8 *code, RList *cobjs, RList *interned_table, ut64 pc) {
pyc_code_object *cobj = NULL, *t = NULL;
ut32 extended_arg = 0, i = 0, oparg;
st64 start_offset, end_offset;
RListIter *iter = NULL;
char *name = NULL;
char *arg = NULL;
RList *varnames;
RList *consts;
RList *names;
ut8 op;
r_list_foreach (cobjs, iter, t) {
start_offset = t->start_offset;
end_offset = t->end_offset;
if (pc > start_offset && pc < end_offset) {
cobj = t;
break;
}
}
if (cobj != NULL) {
/* TODO: adding line number and offset */
varnames = cobj->varnames->data;
consts = cobj->consts->data;
names = cobj->names->data;
op = code[i];
i += 1;
name = op_name[op];
r_strbuf_set (&opstruct->buf_asm, name);
if (name == NULL) {
return 0;
}
if (op >= HAVE_ARGUMENT) {
oparg = code[i] + code[i+1]*256 + extended_arg;
extended_arg = 0;
i += 2;
if (op == EXTENDED_ARG)
extended_arg = oparg*65536;
arg = parse_arg (op, oparg, names, consts, varnames, interned_table);
if (arg != NULL) {
r_strbuf_appendf (&opstruct->buf_asm, "%20s", arg);
}
}
return i;
}
return 0;
}
char *parse_arg (ut8 op, ut32 oparg, RList *names, RList *consts, RList *varnames, RList *interned_table) {
pyc_object *t = NULL;
char *arg = NULL;
switch (op) {
case DUP_TOPX:
case UNPACK_SEQUENCE:
case BUILD_TUPLE:
case BUILD_LIST: //checked
case BUILD_SET:
case JUMP_FORWARD:
case CONTINUE_LOOP:
case SETUP_LOOP:
case BUILD_SLICE:
case CALL_FUNCTION:
case POP_JUMP_IF_FALSE:
case POP_JUMP_IF_TRUE:
case JUMP_ABSOLUTE:
case JUMP_IF_TRUE_OR_POP:
case JUMP_IF_FALSE_OR_POP:
case LOAD_CLOSURE:
case LOAD_DEREF:
case CALL_FUNCTION_KW:
arg = r_str_newf ("%u", oparg);
break;
case LOAD_FAST:
case STORE_FAST:
case DELETE_FAST:
t = (pyc_object*)r_list_get_n (varnames, oparg);
if (t == NULL)
return NULL;
arg = t->data;
break;
case LOAD_CONST:
t = (pyc_object*)r_list_get_n (consts, oparg);
if (t == NULL)
return NULL;
switch (t->type) {
case TYPE_CODE_v1:
arg = strdup("CodeObject");
break;
case TYPE_TUPLE:
arg = generic_array_obj_to_string (t->data);
break;
case TYPE_STRING:
case TYPE_INTERNED:
case TYPE_STRINGREF:
arg = r_str_newf ("'%s'", t->data);
break;
default:
arg = t->data;
}
break;
case STORE_NAME:
case STORE_ATTR:
case LOAD_NAME:
case LOAD_ATTR:
case IMPORT_NAME:
case IMPORT_FROM:
case LOAD_GLOBAL:
t = (pyc_object*)r_list_get_n (names, oparg);
if (t == NULL)
return NULL;
arg = t->data;
break;
}
return arg;
}
/* for debugging purpose */
void dump (RList *l) {
RListIter *it;
pyc_object *e = NULL;
r_list_foreach (l, it, e) {
if (e->type == TYPE_TUPLE) {
eprintf ("[TYPE_TUPLE] %s\n", generic_array_obj_to_string(e->data));
return;
}
eprintf("[DATA] %s\n", (char *)e->data);
}
}
char *generic_array_obj_to_string (RList *l) {
RListIter *iter = NULL;
pyc_object *e = NULL;
ut32 size = 256, used = 0;
char *r = NULL, *buf = NULL;
buf = (char*)calloc (1024, 0);
r_list_foreach (l, iter, e) {
while ( !(strlen (e->data) < size) ) {
size *= 2;
buf = realloc (buf, used + size);
if (!buf) {
eprintf ("generic_array_obj_to_string cannot request more memory");
return NULL;
}
}
strcat (buf, e->data);
strcat (buf, ",");
size -= strlen (e->data) + 1;
used += strlen (e->data) + 1;
}
/* remove last , */
buf[ strlen(buf)-1 ] = '\0';
r = r_str_newf ("(%s)", buf);
free(buf);
return r;
}
void dump_cobj (pyc_code_object *c) {
eprintf("[DUMP]\n");
eprintf("name: %s\n", (char *)c->name->data);
eprintf("const_start\n");
dump(c->consts->data);
eprintf("consts_end\n");
eprintf("names_start\n");
dump(c->names->data);
eprintf("names_end\n");
eprintf("varnames_start\n");
dump(c->varnames->data);
eprintf("varnames_end\n");
}
/* radare - LGPL3 - Copyright 2016-2020 - c0riolis, x0urc3 */
#include "pyc_dis.h"
void init_opname_table () {
int i;
for(i = 0; i < 0xff+1; i++)
op_name[i] = NULL;
op_name[STOP_CODE] = "STOP_CODE";
op_name[POP_TOP] = "POP_TOP";
op_name[ROT_TWO] = "ROT_TWO";
op_name[ROT_THREE] = "ROT_THREE";
op_name[DUP_TOP] = "DUP_TOP";
op_name[ROT_FOUR] = "ROT_FOUR";
op_name[NOP] = "NOP";
op_name[UNARY_POSITIVE] = "UNARY_POSITIVE";
op_name[UNARY_NEGATIVE] = "UNARY_NEGATIVE";
op_name[UNARY_NOT] = "UNARY_NOT";
op_name[UNARY_CONVERT] = "UNARY_CONVERT";
op_name[UNARY_INVERT] = "UNARY_INVERT";
op_name[BINARY_POWER] = "BINARY_POWER";
op_name[BINARY_MULTIPLY] = "BINARY_MULTIPLY";
op_name[BINARY_DIVIDE] = "BINARY_DIVIDE";
op_name[BINARY_MODULO] = "BINARY_MODULO";
op_name[BINARY_ADD] = "BINARY_ADD";
op_name[BINARY_SUBTRACT] = "BINARY_SUBTRACT";
op_name[BINARY_SUBSCR] = "BINARY_SUBSCR";
op_name[BINARY_FLOOR_DIVIDE] = "BINARY_FLOOR_DIVIDE";
op_name[BINARY_TRUE_DIVIDE] = "BINARY_TRUE_DIVIDE";
op_name[INPLACE_FLOOR_DIVIDE] = "INPLACE_FLOOR_DIVIDE";
op_name[INPLACE_TRUE_DIVIDE] = "INPLACE_TRUE_DIVIDE";
op_name[SLICE] = "SLICE";
op_name[SLICE_1] = "SLICE_1";
op_name[SLICE_2] = "SLICE_2";
op_name[SLICE_3] = "SLICE_3";
op_name[STORE_SLICE] = "STORE_SLICE";
op_name[STORE_SLICE_1] = "STORE_SLICE_1";
op_name[STORE_SLICE_2] = "STORE_SLICE_2";
op_name[STORE_SLICE_3] = "STORE_SLICE_3";
op_name[DELETE_SLICE] = "DELETE_SLICE";
op_name[DELETE_SLICE_1] = "DELETE_SLICE_1";
op_name[DELETE_SLICE_2] = "DELETE_SLICE_2";
op_name[DELETE_SLICE_3] = "DELETE_SLICE_3";
op_name[STORE_MAP] = "STORE_MAP";
op_name[INPLACE_ADD] = "INPLACE_ADD";
op_name[INPLACE_SUBTRACT] = "INPLACE_SUBTRACT";
op_name[INPLACE_MULTIPLY] = "INPLACE_MULTIPLY";
op_name[INPLACE_DIVIDE] = "INPLACE_DIVIDE";
op_name[INPLACE_MODULO] = "INPLACE_MODULO";
op_name[STORE_SUBSCR] = "STORE_SUBSCR";
op_name[DELETE_SUBSCR] = "DELETE_SUBSCR";
op_name[BINARY_LSHIFT] = "BINARY_LSHIFT";
op_name[BINARY_RSHIFT] = "BINARY_RSHIFT";
op_name[BINARY_AND] = "BINARY_AND";
op_name[BINARY_XOR] = "BINARY_XOR";
op_name[BINARY_OR] = "BINARY_OR";
op_name[INPLACE_POWER] = "INPLACE_POWER";
op_name[GET_ITER] = "GET_ITER";
op_name[PRINT_EXPR] = "PRINT_EXPR";
op_name[PRINT_ITEM] = "PRINT_ITEM";
op_name[PRINT_NEWLINE] = "PRINT_NEWLINE";
op_name[PRINT_ITEM_TO] = "PRINT_ITEM_TO";
op_name[PRINT_NEWLINE_TO] = "PRINT_NEWLINE_TO";
op_name[INPLACE_LSHIFT] = "INPLACE_LSHIFT";
op_name[INPLACE_RSHIFT] = "INPLACE_RSHIFT";
op_name[INPLACE_AND] = "INPLACE_AND";
op_name[INPLACE_XOR] = "INPLACE_XOR";
op_name[INPLACE_OR] = "INPLACE_OR";
op_name[BREAK_LOOP] = "BREAK_LOOP";
op_name[WITH_CLEANUP] = "WITH_CLEANUP";
op_name[LOAD_LOCALS] = "LOAD_LOCALS";
op_name[RETURN_VALUE] = "RETURN_VALUE";
op_name[IMPORT_STAR] = "IMPORT_STAR";
op_name[EXEC_STMT] = "EXEC_STMT";
op_name[YIELD_VALUE] = "YIELD_VALUE";
op_name[POP_BLOCK] = "POP_BLOCK";
op_name[END_FINALLY] = "END_FINALLY";
op_name[BUILD_CLASS] = "BUILD_CLASS";
op_name[HAVE_ARGUMENT] = "HAVE_ARGUMENT";
op_name[STORE_NAME] = "STORE_NAME";
op_name[DELETE_NAME] = "DELETE_NAME";
op_name[UNPACK_SEQUENCE] = "UNPACK_SEQUENCE";
op_name[FOR_ITER] = "FOR_ITER";
op_name[LIST_APPEND] = "LIST_APPEND";
op_name[STORE_ATTR] = "STORE_ATTR";
op_name[DELETE_ATTR] = "DELETE_ATTR";
op_name[STORE_GLOBAL] = "STORE_GLOBAL";
op_name[DELETE_GLOBAL] = "DELETE_GLOBAL";
op_name[DUP_TOPX] = "DUP_TOPX";
op_name[LOAD_CONST] = "LOAD_CONST";
op_name[LOAD_NAME] = "LOAD_NAME";
op_name[BUILD_TUPLE] = "BUILD_TUPLE";
op_name[BUILD_LIST] = "BUILD_LIST";
op_name[BUILD_SET] = "BUILD_SET";
op_name[BUILD_MAP] = "BUILD_MAP";
op_name[LOAD_ATTR] = "LOAD_ATTR";
op_name[COMPARE_OP] = "COMPARE_OP";
op_name[IMPORT_NAME] = "IMPORT_NAME";
op_name[IMPORT_FROM] = "IMPORT_FROM";
op_name[JUMP_FORWARD] = "JUMP_FORWARD";
op_name[JUMP_IF_FALSE_OR_POP] = "JUMP_IF_FALSE_OR_POP";
op_name[JUMP_IF_TRUE_OR_POP] = "JUMP_IF_TRUE_OR_POP";
op_name[JUMP_ABSOLUTE] = "JUMP_ABSOLUTE";
op_name[POP_JUMP_IF_FALSE] = "POP_JUMP_IF_FALSE";
op_name[POP_JUMP_IF_TRUE] = "POP_JUMP_IF_TRUE";
op_name[LOAD_GLOBAL] = "LOAD_GLOBAL";
op_name[CONTINUE_LOOP] = "CONTINUE_LOOP";
op_name[SETUP_LOOP] = "SETUP_LOOP";
op_name[SETUP_EXCEPT] = "SETUP_EXCEPT";
op_name[SETUP_FINALLY] = "SETUP_FINALLY";
op_name[LOAD_FAST] = "LOAD_FAST";
op_name[STORE_FAST] = "STORE_FAST";
op_name[DELETE_FAST] = "DELETE_FAST";
op_name[RAISE_VARARGS] = "RAISE_VARARGS";
op_name[CALL_FUNCTION] = "CALL_FUNCTION";
op_name[MAKE_FUNCTION] = "MAKE_FUNCTION";
op_name[BUILD_SLICE] = "BUILD_SLICE";
op_name[MAKE_CLOSURE] = "MAKE_CLOSURE";
op_name[LOAD_CLOSURE] = "LOAD_CLOSURE";
op_name[LOAD_DEREF] = "LOAD_DEREF";
op_name[STORE_DEREF] = "STORE_DEREF";
op_name[CALL_FUNCTION_VAR] = "CALL_FUNCTION_VAR";
op_name[CALL_FUNCTION_KW] = "CALL_FUNCTION_KW";
op_name[CALL_FUNCTION_VAR_KW] = "CALL_FUNCTION_VAR_KW";
op_name[SETUP_WITH] = "SETUP_WITH";
op_name[EXTENDED_ARG] = "EXTENDED_ARG";
op_name[SET_ADD] = "SET_ADD";
op_name[MAP_ADD] = "MAP_ADD";
}
int r_pyc_disasm (RAsmOp *opstruct, const ut8 *code, RList *cobjs, RList *interned_table, ut64 pc) {
pyc_code_object *cobj = NULL, *t = NULL;
ut32 extended_arg = 0, i = 0, oparg;
st64 start_offset, end_offset;
RListIter *iter = NULL;
char *name = NULL;
char *arg = NULL;
RList *varnames;
RList *consts;
RList *names;
ut8 op;
r_list_foreach (cobjs, iter, t) {
start_offset = t->start_offset;
end_offset = t->end_offset;
if (pc > start_offset && pc < end_offset) {
cobj = t;
break;
}
}
if (cobj != NULL) {
/* TODO: adding line number and offset */
varnames = cobj->varnames->data;
consts = cobj->consts->data;
names = cobj->names->data;
op = code[i];
i += 1;
name = op_name[op];
r_strbuf_set (&opstruct->buf_asm, name);
if (name == NULL) {
return 0;
}
if (op >= HAVE_ARGUMENT) {
oparg = code[i] + code[i+1]*256 + extended_arg;
extended_arg = 0;
i += 2;
if (op == EXTENDED_ARG)
extended_arg = oparg*65536;
arg = parse_arg (op, oparg, names, consts, varnames, interned_table);
if (arg != NULL) {
r_strbuf_appendf (&opstruct->buf_asm, "%20s", arg);
}
}
return i;
}
return 0;
}
char *parse_arg (ut8 op, ut32 oparg, RList *names, RList *consts, RList *varnames, RList *interned_table) {
pyc_object *t = NULL;
char *arg = NULL;
switch (op) {
case DUP_TOPX:
case UNPACK_SEQUENCE:
case BUILD_TUPLE:
case BUILD_LIST: //checked
case BUILD_SET:
case JUMP_FORWARD:
case CONTINUE_LOOP:
case SETUP_LOOP:
case BUILD_SLICE:
case CALL_FUNCTION:
case POP_JUMP_IF_FALSE:
case POP_JUMP_IF_TRUE:
case JUMP_ABSOLUTE:
case JUMP_IF_TRUE_OR_POP:
case JUMP_IF_FALSE_OR_POP:
case LOAD_CLOSURE:
case LOAD_DEREF:
case CALL_FUNCTION_KW:
arg = r_str_newf ("%u", oparg);
break;
case LOAD_FAST:
case STORE_FAST:
case DELETE_FAST:
t = (pyc_object*)r_list_get_n (varnames, oparg);
if (t == NULL)
return NULL;
arg = t->data;
break;
case LOAD_CONST:
t = (pyc_object*)r_list_get_n (consts, oparg);
if (t == NULL)
return NULL;
switch (t->type) {
case TYPE_CODE_v1:
arg = strdup("CodeObject");
break;
case TYPE_TUPLE:
arg = generic_array_obj_to_string (t->data);
break;
case TYPE_STRING:
case TYPE_INTERNED:
case TYPE_STRINGREF:
arg = r_str_newf ("'%s'", t->data);
break;
default:
arg = t->data;
}
break;
case STORE_NAME:
case STORE_ATTR:
case LOAD_NAME:
case LOAD_ATTR:
case IMPORT_NAME:
case IMPORT_FROM:
case LOAD_GLOBAL:
t = (pyc_object*)r_list_get_n (names, oparg);
if (t == NULL)
return NULL;
arg = t->data;
break;
}
return arg;
}
/* for debugging purpose */
void dump (RList *l) {
RListIter *it;
pyc_object *e = NULL;
r_list_foreach (l, it, e) {
if (e->type == TYPE_TUPLE) {
eprintf ("[TYPE_TUPLE] %s\n", generic_array_obj_to_string(e->data));
return;
}
eprintf("[DATA] %s\n", (char *)e->data);
}
}
char *generic_array_obj_to_string (RList *l) {
RListIter *iter = NULL;
pyc_object *e = NULL;
ut32 size = 256, used = 0;
char *r = NULL, *buf = NULL;
// add good enough space
buf = (char*)calloc (size+10, 1);
r_list_foreach (l, iter, e) {
while ( !(strlen (e->data) < size) ) {
size *= 2;
buf = realloc (buf, used + size);
if (!buf) {
eprintf ("generic_array_obj_to_string cannot request more memory");
return NULL;
}
}
strcat (buf, e->data);
strcat (buf, ",");
size -= strlen (e->data) + 1;
used += strlen (e->data) + 1;
}
/* remove last , */
buf[ strlen(buf)-1 ] = '\0';
r = r_str_newf ("(%s)", buf);
free(buf);
return r;
}
void dump_cobj (pyc_code_object *c) {
eprintf("[DUMP]\n");
eprintf("name: %s\n", (char *)c->name->data);
eprintf("const_start\n");
dump(c->consts->data);
eprintf("consts_end\n");
eprintf("names_start\n");
dump(c->names->data);
eprintf("names_end\n");
eprintf("varnames_start\n");
dump(c->varnames->data);
eprintf("varnames_end\n");
}
+83 -76
View File
@@ -1,76 +1,83 @@
#include <r_types.h>
#include <r_lib.h>
#include <r_util.h>
#include <r_asm.h>
#include "opcode.h"
typedef enum {
TYPE_ASCII = 'a',
TYPE_ASCII_INTERNED = 'A',
TYPE_BINARY_COMPLEX = 'y',
TYPE_BINARY_FLOAT = 'g',
TYPE_CODE_v0 = 'C',
TYPE_CODE_v1 = 'c',
TYPE_COMPLEX = 'x',
TYPE_DICT = '{',
TYPE_ELLIPSIS = '.',
TYPE_FALSE = 'F',
TYPE_FLOAT = 'f',
TYPE_FROZENSET = '>',
TYPE_INT64 = 'I',
TYPE_INTERNED = 't',
TYPE_INT = 'i',
TYPE_LIST = '[',
TYPE_LONG = 'l',
TYPE_NONE = 'N',
TYPE_NULL = '0',
TYPE_REF = 'r',
TYPE_SET = '<',
TYPE_SHORT_ASCII_INTERNED = 'Z',
TYPE_SHORT_ASCII = 'z',
TYPE_SMALL_TUPLE = ')',
TYPE_STOPITER = 'S',
TYPE_STRINGREF = 'R',
TYPE_STRING = 's',
TYPE_TRUE = 'T',
TYPE_TUPLE = '(',
TYPE_UNICODE = 'u',
TYPE_UNKNOWN = '?',
} pyc_marshal_type;
typedef enum {
FLAG_REF = '\x80',
} pyc_marshal_flag;
typedef struct {
pyc_marshal_type type;
void *data;
} pyc_object;
typedef struct {
ut32 argcount;
ut32 kwonlyargcount;
ut32 nlocals;
ut32 stacksize;
ut32 flags;
pyc_object *code;
pyc_object *consts;
pyc_object *names;
pyc_object *varnames;
pyc_object *freevars;
pyc_object *cellvars;
pyc_object *filename;
pyc_object *name;
ut32 firstlineno;
pyc_object *lnotab;
st64 start_offset;
st64 end_offset;
} pyc_code_object;
char *parse_arg (ut8 op, ut32 oparg, RList *names, RList *consts, RList *varnames, RList *interned_table);
int r_pyc_disasm (RAsmOp *op, const ut8 *buf, RList *cobjs, RList *interned_table, ut64 pc);
char *generic_array_obj_to_string (RList *l);
void dump_cobj (pyc_code_object *c);
void init_opname_table ();
void dump (RList *l);
/* radare - LGPL3 - Copyright 2016-2020 - c0riolis, x0urc3 */
#ifndef PYC_DIS_H
#define PYC_DIS_H
#include <r_types.h>
#include <r_lib.h>
#include <r_util.h>
#include <r_asm.h>
#include "opcode.h"
typedef enum {
TYPE_ASCII = 'a',
TYPE_ASCII_INTERNED = 'A',
TYPE_BINARY_COMPLEX = 'y',
TYPE_BINARY_FLOAT = 'g',
TYPE_CODE_v0 = 'C',
TYPE_CODE_v1 = 'c',
TYPE_COMPLEX = 'x',
TYPE_DICT = '{',
TYPE_ELLIPSIS = '.',
TYPE_FALSE = 'F',
TYPE_FLOAT = 'f',
TYPE_FROZENSET = '>',
TYPE_INT64 = 'I',
TYPE_INTERNED = 't',
TYPE_INT = 'i',
TYPE_LIST = '[',
TYPE_LONG = 'l',
TYPE_NONE = 'N',
TYPE_NULL = '0',
TYPE_REF = 'r',
TYPE_SET = '<',
TYPE_SHORT_ASCII_INTERNED = 'Z',
TYPE_SHORT_ASCII = 'z',
TYPE_SMALL_TUPLE = ')',
TYPE_STOPITER = 'S',
TYPE_STRINGREF = 'R',
TYPE_STRING = 's',
TYPE_TRUE = 'T',
TYPE_TUPLE = '(',
TYPE_UNICODE = 'u',
TYPE_UNKNOWN = '?',
} pyc_marshal_type;
typedef enum {
FLAG_REF = '\x80',
} pyc_marshal_flag;
typedef struct {
pyc_marshal_type type;
void *data;
} pyc_object;
typedef struct {
ut32 argcount;
ut32 kwonlyargcount;
ut32 nlocals;
ut32 stacksize;
ut32 flags;
pyc_object *code;
pyc_object *consts;
pyc_object *names;
pyc_object *varnames;
pyc_object *freevars;
pyc_object *cellvars;
pyc_object *filename;
pyc_object *name;
ut32 firstlineno;
pyc_object *lnotab;
st64 start_offset;
st64 end_offset;
} pyc_code_object;
char *parse_arg (ut8 op, ut32 oparg, RList *names, RList *consts, RList *varnames, RList *interned_table);
int r_pyc_disasm (RAsmOp *op, const ut8 *buf, RList *cobjs, RList *interned_table, ut64 pc);
char *generic_array_obj_to_string (RList *l);
void dump_cobj (pyc_code_object *c);
void init_opname_table ();
void dump (RList *l);
#endif
+85 -53
View File
@@ -1,53 +1,85 @@
#include <r_types.h>
#include <r_lib.h>
#include <r_util.h>
#include <r_asm.h>
#include "pyc_dis.h"
static int disassemble (RAsm *a, RAsmOp *opstruct, const ut8 *buf, int len) {
RList *interned_table = NULL;
RList *shared = NULL;
RList *cobjs = NULL;
RBin *bin = a->binb.bin;
ut64 pc = a->pc;
RBinPlugin *plugin = bin && bin->cur && bin->cur->o ?
bin->cur->o->plugin : NULL;
if (plugin) {
if (!strcmp (plugin->name, "pyc")) {
shared = bin->cur->o->bin_obj;
}
}
cobjs = r_list_get_n (shared, 0);
interned_table = r_list_get_n (shared, 1);
int r = r_pyc_disasm (opstruct, buf, cobjs, interned_table, pc);
opstruct->size = r;
return r;
}
static bool init (void *user) {
init_opname_table ();
return true;
}
RAsmPlugin r_asm_plugin_pyc = {
.name = "pyc",
.arch = "pyc",
.license = "LGPL3",
.bits = 32,
.desc = "PYC disassemble plugin",
.disassemble = &disassemble,
.init = &init,
};
#ifndef CORELIB
struct r_lib_struct_t radare_plugin = {
.type = R_LIB_TYPE_ASM,
.data = &r_asm_plugin_pyc,
.version = R2_VERSION
};
#endif
/* radare - LGPL3 - Copyright 2016-2020 - c0riolis, x0urc3 */
#include <r_types.h>
#include <r_lib.h>
#include <r_util.h>
#include <r_asm.h>
#include "pyc_dis.h"
static int disassemble (RAsm *a, RAsmOp *opstruct, const ut8 *buf, int len) {
RList *interned_table = NULL;
RList *shared = NULL;
RList *cobjs = NULL;
RBin *bin = a->binb.bin;
ut64 pc = a->pc;
RBinPlugin *plugin = bin && bin->cur && bin->cur->o ?
bin->cur->o->plugin : NULL;
if (plugin) {
if (!strcmp (plugin->name, "pyc")) {
shared = bin->cur->o->bin_obj;
}
}
cobjs = r_list_get_n (shared, 0);
interned_table = r_list_get_n (shared, 1);
int r = r_pyc_disasm (opstruct, buf, cobjs, interned_table, pc);
opstruct->size = r;
return r;
}
static int dis (RAsm *a, RAsmOp *op, const ut8 *buf, int len) {
const char *buf_asm = "invalid";
int size = -1;
if (op_name[buf[0]]) {
if (HAS_ARG(buf[0])) {
if (a->bits == 16) {
ut16 operand = (buf[2] << 8) | buf[1];
buf_asm = sdb_fmt ("%s %d",op_name[buf[0]], operand);
size = 3; // < 3.6
} else {
buf_asm = sdb_fmt ("%s %d",op_name[buf[0]], buf[1]);
size = 2; // >= 3.6
}
} else {
buf_asm = sdb_fmt (op_name[buf[0]]);
if (buf[1] == STOP_CODE) {
size = 2;
} else {
size = 1;
}
}
}
// eprintf("kmbs: f:%s\tbuf_asm:%s\n",__func__,buf_asm);
r_strbuf_set (&op->buf_asm, buf_asm);
op->size = size;
return size;
}
static bool init (void *user) {
init_opname_table ();
return true;
}
RAsmPlugin r_asm_plugin_pyc = {
.name = "pyc",
.arch = "pyc",
.license = "LGPL3",
.bits = 16 | 8,
.desc = "PYC disassemble plugin",
.disassemble = &dis,
.init = &init,
};
#ifndef R2_PLUGIN_INCORE
struct r_lib_struct_t radare_plugin = {
.type = R_LIB_TYPE_ASM,
.data = &r_asm_plugin_pyc,
.version = R2_VERSION
};
#endif
+4 -1
View File
@@ -13,7 +13,10 @@ static int disassemble(RAsm *a, RAsmOp *op, const ut8 *buf, int len) {
obj = bin->cur->o;
int dlen = r_asm_swf_disass (obj, op->buf_asm, buf, len, a->pc);
char res[1024];
res[0] = 0;
int dlen = r_asm_swf_disass (obj, res, buf, len, a->pc);
r_strbuf_set (&op->buf_asm, res);
op->size = dlen;
return dlen;
}
+4 -1
View File
@@ -20,7 +20,10 @@ static int disassemble(RAsm *a, RAsmOp *aop, const ut8 *buf, int len) {
ZydisStatus st = ZydisDecoderDecodeInstruction (&decr, buf, len, a->pc, &info);
if (ZYDIS_SUCCESS (st)) {
ZydisFormatterInitInstructionFormatter (&fmtr, ZYDIS_FORMATTER_STYLE_INTEL);
ZydisFormatterFormatInstruction (&fmtr, &info, aop->buf_asm, R_ASM_BUFSIZE);
char str[128];
str[0] = 0;
ZydisFormatterFormatInstruction (&fmtr, &info, str, sizeof (str));
r_strbuf_set (&aop->buf_asm, str);
}
return aop->size = info.length;
+5 -3
View File
@@ -1,4 +1,4 @@
/* radare - LGPL - Copyright 2012-2013 - pancake */
/* radare - LGPL - Copyright 2012-2020 - pancake */
#include <r_types.h>
#include <r_util.h>
@@ -7,7 +7,9 @@
#include "../arch/z80_nc/disasm.c"
static int do_disassemble(RAsm *a, RAsmOp *op, const ut8 *buf, int len) {
int dlen = z80dis (0, buf, op->buf_asm, len);
char str[128];
int dlen = z80dis (0, buf, str, len);
r_strbuf_set (&op->buf_asm, str);
if (dlen<0) dlen = 0;
op->size = dlen;
return op->size;
@@ -24,7 +26,7 @@ RAsmPlugin r_asm_plugin_z80 = {
};
#ifndef CORELIB
struct r_lib_struct_t radare_plugin = {
RLibStruct radare_plugin = {
.type = R_LIB_TYPE_ASM,
.data = &r_asm_plugin_z80,
.version = R2_VERSION
+1 -1
View File
@@ -1,5 +1,5 @@
OBJ_PYC=asm_pyc.o
OBJ_PYC+=../arch/pyc/pyc_disasm.o
OBJ_PYC+=../arch/pyc/pyc_dis.o
STATIC_OBJ+=${OBJ_PYC}
TARGET_PYC=asm_pyc.$(LIBEXT)
+1 -1
View File
@@ -14,4 +14,4 @@ ALL_TARGETS+=${TARGET_X86_ZYAN}
CFLAGS+=-I../arch/x86/zyan/include
${TARGET_X86_ZYAN}: ${OBJ_X86_ZYAN}
${CC} ${CFLAGS} -o ${TARGET_X86_ZYAN} ${OBJ_X86_ZYAN}
${CC} ${LDFLAGS} ${CFLAGS} -o ${TARGET_X86_ZYAN} ${OBJ_X86_ZYAN}
+12 -8
View File
@@ -2,7 +2,6 @@
#include <r_io.h>
#include <r_bin.h>
#include <gmp.h>
#include "marshal.h"
#define SIZE32_MAX 0x7FFFFFFF
@@ -151,6 +150,9 @@ static pyc_object *get_int64_object (RBuffer *buffer) {
/* long is used when the number is > MAX_INT64 */
static pyc_object *get_long_object (RBuffer *buffer) {
eprintf("not implemented");
return NULL;
/*
pyc_object *ret = NULL;
bool error = false;
bool neg = false;
@@ -177,15 +179,15 @@ static pyc_object *get_long_object (RBuffer *buffer) {
mpz_init (N);
mpz_init (s);
mpz_set_ui (pow, 1);
/* N += digits[i]*(pow); pow *= base */
// N += digits[i]*(pow); pow *= base
for (i = 0; i < ndigits; i++) {
mpz_mul_ui(s, pow, get_ut16(buffer, &error));
mpz_add(N, N, s);
mpz_mul_ui(pow, pow, base);
mpz_set_ui(s, 0);
}
/*negative number */
if (neg)
//negative number
if (neg)
mpz_neg(N, N);
char *buf = malloc (mpz_sizeinbase(N, 10) + 2);
mpz_get_str (buf, 10, N);
@@ -195,6 +197,7 @@ static pyc_object *get_long_object (RBuffer *buffer) {
mpz_clear (N);
mpz_clear (s);
return ret;
*/
}
static pyc_object *get_stringref_object (RBuffer *buffer) {
@@ -231,7 +234,7 @@ static pyc_object *get_float_object (RBuffer *buffer) {
ret = R_NEW0 (pyc_object);
if (!ret)
return NULL;
ut8 *s = malloc (n);
ut8 *s = malloc (n + 1);
if (!s)
return NULL;
/* object contain string representation of the number */
@@ -764,9 +767,9 @@ static pyc_object *get_code_object (RBuffer *buffer) {
cobj->flags = get_ut32 (buffer, &error);
//to help disassemble the code
cobj->start_offset = buffer->cur + 4;
cobj->start_offset = r_buf_tell(buffer) + 4;
cobj->code = get_object (buffer);
cobj->end_offset = buffer->cur;
cobj->end_offset = r_buf_tell(buffer);
cobj->consts = get_object (buffer);
cobj->names = get_object (buffer);
@@ -953,7 +956,8 @@ static bool extract_sections (pyc_object *obj, RList *sections, RList *cobjs, ch
prefix ? "." : "", cobj->name->data);
if (!prefix || !section)
goto fail;
if (!strncpy ((char*)&section->name, prefix, R_BIN_SIZEOF_STRINGS))
section->name = strdup(prefix);
if (!section->name)
goto fail;
section->paddr = cobj->start_offset+1;
section->vaddr = cobj->start_offset+1;
+14 -141
View File
@@ -1,4 +1,4 @@
/* radare - LGPL3 - Copyright 2016 - Matthieu (c0riolis) Tardy */
/* radare - LGPL3 - Copyright 2016-2020 - c0riolis, x0urc3 */
#include "pyc.h"
#include "marshal.h"
@@ -7,144 +7,17 @@ bool pyc_get_sections(RList *sections, RList *cobjs, RBuffer *buf, ut32 magic) {
return get_sections_from_code_objects (buf, sections, cobjs);
}
ut64 pyc_get_entrypoint(ut32 magic) {
switch (magic) {
case MAGIC_0_9_4_BETA:
case MAGIC_0_9_9_v0:
case MAGIC_0_9_9_v1:
case MAGIC_0_9_9_v2:
case MAGIC_1_0_1:
case MAGIC_1_1:
case MAGIC_1_2:
case MAGIC_1_3_B1:
case MAGIC_1_4_B1_v0:
case MAGIC_1_4_B1_v1:
case MAGIC_1_4:
case MAGIC_1_5_A1:
case MAGIC_1_6_A2:
case MAGIC_2_0_B1_v0:
case MAGIC_2_0_B1_v1_U:
case MAGIC_2_0_B1_v2:
case MAGIC_2_0_B1_v2_U:
case MAGIC_2_0_B1_v3:
case MAGIC_2_0_B1_v3_U:
case MAGIC_2_0_B1_v4:
case MAGIC_2_0_B1_v4_U:
case MAGIC_2_0_B1_v5_U:
case MAGIC_2_0_B1_v6_U:
case MAGIC_2_1_A1:
case MAGIC_2_1_A1_U:
case MAGIC_2_1_A2:
case MAGIC_2_1_A2_U:
case MAGIC_2_2_A0:
case MAGIC_2_2_A0_U:
case MAGIC_2_2_A1:
case MAGIC_2_2_A1_U:
case MAGIC_2_3_A0_v0:
case MAGIC_2_3_A0_v0_U:
case MAGIC_2_3_A0_v1:
case MAGIC_2_3_A0_v1_U:
case MAGIC_2_3_A0_v2:
case MAGIC_2_3_A0_v2_U:
case MAGIC_2_4_A0_v0:
case MAGIC_2_4_A0_v0_U:
case MAGIC_2_4_A0_v1:
case MAGIC_2_4_A0_v1_U:
case MAGIC_2_4_A2:
case MAGIC_2_4_A2_U:
case MAGIC_2_4_A3:
case MAGIC_2_4_A3_U:
case MAGIC_2_5_A0_v0:
case MAGIC_2_5_A0_v0_U:
case MAGIC_2_5_A0_v1:
case MAGIC_2_5_A0_v1_U:
case MAGIC_2_5_A0_v2:
case MAGIC_2_5_A0_v2_U:
case MAGIC_2_5_A0_v3_U:
case MAGIC_2_5_B2_v0:
case MAGIC_2_5_B2_v0_U:
case MAGIC_2_5_B2_v1:
case MAGIC_2_5_B2_v1_U:
case MAGIC_2_5_C3:
case MAGIC_2_5_C3_U:
case MAGIC_2_6_A0_v0:
case MAGIC_2_6_A0_v0_U:
case MAGIC_2_6_A0_v1:
case MAGIC_2_6_A0_v1_U:
case MAGIC_2_6_A0_v2:
case MAGIC_2_6_A0_v2_U:
case MAGIC_2_6_A1_PLUS_v0:
case MAGIC_2_6_A1_PLUS_v0_U:
case MAGIC_2_6_A1_PLUS_v1:
case MAGIC_2_6_A1_PLUS_v1_U:
case MAGIC_2_7_A0_v0:
case MAGIC_2_7_A0_v0_U:
case MAGIC_2_7_A0_v1:
case MAGIC_2_7_A0_v1_U:
case MAGIC_2_7_A0_v2:
case MAGIC_2_7_A0_v2_U:
case MAGIC_2_7_A2_PLUS_v0:
case MAGIC_2_7_A2_PLUS_v0_U:
case MAGIC_2_7_A2_PLUS_v1:
case MAGIC_2_7_A2_PLUS_v1_U:
case MAGIC_3_0X_v0:
case MAGIC_3_0X_v0_U:
case MAGIC_3_0X_v1:
case MAGIC_3_0X_v1_U:
case MAGIC_3_0X_v2:
case MAGIC_3_0X_v2_U:
case MAGIC_3_0X_v3:
case MAGIC_3_0X_v3_U:
case MAGIC_3_0X_v4:
case MAGIC_3_0X_v4_U:
case MAGIC_3_0X_v5:
case MAGIC_3_0X_v5_U:
case MAGIC_3_0X_v6:
case MAGIC_3_0X_v6_U:
case MAGIC_3_0_A1_v0:
case MAGIC_3_0_A1_v0_U:
case MAGIC_3_0_A1_v1:
case MAGIC_3_0_A1_v1_U:
case MAGIC_3_0_A1_PLUS:
case MAGIC_3_0_A1_PLUS_U:
case MAGIC_3_0_A2:
case MAGIC_3_0_A2_U:
case MAGIC_3_0_A2_PLUS:
case MAGIC_3_0_A2_PLUS_U:
case MAGIC_3_0_A3_PLUS:
case MAGIC_3_0_A3_PLUS_U:
case MAGIC_3_0_A5_PLUS:
case MAGIC_3_0_A5_PLUS_U:
case MAGIC_3_1_A0_v0:
case MAGIC_3_1_A0_v0_U:
case MAGIC_3_1_A0_v1:
case MAGIC_3_1_A0_v1_U:
case MAGIC_3_2_A0:
case MAGIC_3_2_A0_U:
case MAGIC_3_2_A1_PLUS_U:
case MAGIC_3_2_A2_PLUS_U:
case MAGIC_3_3_A0_U:
case MAGIC_3_3_0_A0_v0_U:
return 0x8;
case MAGIC_3_3_0_A0_v1_U:
case MAGIC_3_3_0_A1_PLUS_U:
case MAGIC_3_3_0_A3_PLUS_U:
case MAGIC_3_4_0_A0_v0_U:
case MAGIC_3_4_0_A0_v1_U:
case MAGIC_3_4_0_A0_v2_U:
case MAGIC_3_4_0_A0_v3_U:
case MAGIC_3_4_0_A0_v4_U:
case MAGIC_3_4_0_A3_PLUS_v0_U:
case MAGIC_3_4_0_A3_PLUS_v1_U:
case MAGIC_3_4_0_RC1_PLUS_U:
case MAGIC_3_5_0_A0_U:
case MAGIC_3_5_0_A4_PLUS_U:
case MAGIC_3_5_0_B1_PLUS_U:
case MAGIC_3_5_0_B2_PLUS_U:
case MAGIC_3_6_0_A0_v0_U:
case MAGIC_3_6_0_A0_v1_U:
return 0xc;
default:
return 0x0;
}
bool pyc_is_object(ut8 b, pyc_marshal_type type) {
bool ret = false;
if (b == type) {
ret = true;
}
return ret;
}
bool pyc_is_code(ut8 b) {
if (pyc_is_object((b & ~FLAG_REF), TYPE_CODE_v1)) {
return true;
}
return false;
}
+5 -2
View File
@@ -1,4 +1,4 @@
/* radare - LGPL3 - Copyright 2016 - Matthieu (c0riolis) Tardy */
/* radare - LGPL3 - Copyright 2016-2020 - c0riolis, x0urc3 */
#ifndef PYC_H
#define PYC_H
@@ -8,8 +8,11 @@
#include <r_lib.h>
#include <r_bin.h>
#include "pyc_magic.h"
#include "marshal.h"
bool pyc_get_sections(RList *sections, RList* mem, RBuffer *buf, ut32 magic);
ut64 pyc_get_entrypoint(ut32 magic);
bool pyc_is_object(ut8 b, pyc_marshal_type type);
bool pyc_is_code(ut8 b);
#endif
+215 -142
View File
@@ -1,149 +1,222 @@
/* radare - LGPL3 - Copyright 2016 - Matthieu (c0riolis) Tardy */
/* radare - LGPL3 - Copyright 2016-2020 - c0riolis, x0urc3 */
#include "pyc_magic.h"
static struct pyc_version versions[] = {
{MAGIC_0_9_4_BETA, "0.9.4 beta", "77b80a91d357c1d95d8e7cd4cbbe799e5deb777e", false},
{MAGIC_0_9_9_v0, "0.9.9", "1cabc2b6c9701aea29bb506b593946e67bf7593a", false},
{MAGIC_0_9_9_v1, "0.9.9", "f820e6917f07e5012bdd103ef97389318d5a10f8", false},
{MAGIC_0_9_9_v2, "0.9.9", "9fed5726a36d7ce1355c30592838d93321d580ee", false},
{MAGIC_1_0_1, "1.0.1", "1808ca5d8883097c72c6a8a89143041c20ea13c1", false},
{MAGIC_1_1, "1.1", "d1e6c9a64a563841f60177ac907739f953f15630", false},
{MAGIC_1_2, "1.2", "fb3daf9b2456dc1a3d99f56f78c5e6270eeaf1e8", false},
{MAGIC_1_3_B1, "1.3b1", "0261bf5b3819b03d83f254562947244634604026", false},
{MAGIC_1_4_B1_v0, "1.4b1", "d1ae0ea9a585f912d7aa3d004ff817d0dea112f8", false},
{MAGIC_1_4_B1_v1, "1.4b1", "22e29b1747e139d9598eaa5126c59313af39949d", false},
{MAGIC_1_4, "1.4", "b82d847b3dcbccd63de075e3879a9369dfb34e0d", false},
{MAGIC_1_5_A1, "1.5a1", "104a646fc7a67f27df25d4e941b20035e5876f9f", false},
{MAGIC_1_6_A2, "1.6a2", "84cd52b560e571eba371d7136abcc9c42c27b002", false},
{MAGIC_2_0_B1_v0, "2.0b1", "f79434ee41fa86019216240ba32be660bcfc5419", false},
{MAGIC_2_0_B1_v1, "2.0b1", "4388249506d190a76a4dbbbc70294ef6ba0656d5", false},
{MAGIC_2_0_B1_v1_U, "2.0b1", "4388249506d190a76a4dbbbc70294ef6ba0656d5", true,},
{MAGIC_2_0_B1_v2, "2.0b1", "4eaa463c031a1bdb5e7791c370d04108e0682dd4", false},
{MAGIC_2_0_B1_v2_U, "2.0b1", "4eaa463c031a1bdb5e7791c370d04108e0682dd4", true },
{MAGIC_2_0_B1_v3, "2.0b1", "18385172fac0b7099bd2d2264df614ed4466f083", false},
{MAGIC_2_0_B1_v3_U, "2.0b1", "18385172fac0b7099bd2d2264df614ed4466f083", true },
{MAGIC_2_0_B1_v4, "2.0b1", "f657dc8ff25e93b877305bbcfc45e360191bb326", false},
{MAGIC_2_0_B1_v4_U, "2.0b1", "f657dc8ff25e93b877305bbcfc45e360191bb326", true },
{MAGIC_2_0_B1_v5, "2.0b1", "1b9fd0cbd914947cc421ba7e45aa093d7ba9af00", false},
{MAGIC_2_0_B1_v5_U, "2.0b1", "1b9fd0cbd914947cc421ba7e45aa093d7ba9af00", true },
{MAGIC_2_0_B1_v6, "2.0b1", "1f1a156ed5af8f7a50ce05fc85f85423a24f2aa4", false},
{MAGIC_2_0_B1_v6_U, "2.0b1", "1f1a156ed5af8f7a50ce05fc85f85423a24f2aa4", true },
{MAGIC_2_1_A1, "2.1a1", "fd8c7203251ff37dbb397f7d423ae41f16a03c68", false},
{MAGIC_2_1_A1_U, "2.1a1", "fd8c7203251ff37dbb397f7d423ae41f16a03c68", true },
{MAGIC_2_1_A2, "2.1a2", "0076e8d28f9eba9eff4508696dc33730af2b4001", false},
{MAGIC_2_1_A2_U, "2.1a2", "0076e8d28f9eba9eff4508696dc33730af2b4001", true },
{MAGIC_2_2_A0, "2.2a0", "32e7d0898eab85de8134f932680a85c6e7abcec0", false},
{MAGIC_2_2_A0_U, "2.2a0", "32e7d0898eab85de8134f932680a85c6e7abcec0", true },
{MAGIC_2_2_A1, "2.2a1", "09df3254b49d7c9306585302fe815ab0bdb53439", false},
{MAGIC_2_2_A1_U, "2.2a1", "09df3254b49d7c9306585302fe815ab0bdb53439", true },
{MAGIC_2_3_A0_v0, "2.3a0", "abedb2418f6231adf24205092a59996f1f1e4c02", false},
{MAGIC_2_3_A0_v0_U, "2.3a0", "abedb2418f6231adf24205092a59996f1f1e4c02", true },
{MAGIC_2_3_A0_v1, "2.3a0", "d6ae544acd24a1f72ce00534fed464fde91ee504", false},
{MAGIC_2_3_A0_v1_U, "2.3a0", "d6ae544acd24a1f72ce00534fed464fde91ee504", true },
{MAGIC_2_3_A0_v2, "2.3a0", "cf5928fab108de9fbe02632d07176c717c2b3aa7", false},
{MAGIC_2_3_A0_v2_U, "2.3a0", "cf5928fab108de9fbe02632d07176c717c2b3aa7", true },
{MAGIC_2_3_A0_v3, "2.3a0", "5fe4d93df429134ef8695c12e59ff962ff8b73d2", false},
{MAGIC_2_3_A0_v3_U, "2.3a0", "5fe4d93df429134ef8695c12e59ff962ff8b73d2", true },
{MAGIC_2_4_A0_v0, "2.4a0", "adb42a71169604d3609ac2fbdb64cf8cd1c7250b", false},
{MAGIC_2_4_A0_v0_U, "2.4a0", "adb42a71169604d3609ac2fbdb64cf8cd1c7250b", true },
{MAGIC_2_4_A0_v1, "2.4a0", "3df36e2e5ddc1149af8eb52e20bc225d806236d4", false},
{MAGIC_2_4_A0_v1_U, "2.4a0", "3df36e2e5ddc1149af8eb52e20bc225d806236d4", true },
{MAGIC_2_4_A2, "2.4a2", "1f9b9c226b43ed20cb61e6d21aea6cb966e8bcd3", false},
{MAGIC_2_4_A2_U, "2.4a2", "1f9b9c226b43ed20cb61e6d21aea6cb966e8bcd3", true },
{MAGIC_2_4_A3, "2.4a3", "2b49b4a85d9eb4a4cfa9f29c21d649c383945671", false},
{MAGIC_2_4_A3_U, "2.4a3", "2b49b4a85d9eb4a4cfa9f29c21d649c383945671", true },
{MAGIC_2_5_A0_v0, "2.5a0", "44e3f21f052590ddfabc12909af5188a4cd89d8c", false},
{MAGIC_2_5_A0_v0_U, "2.5a0", "44e3f21f052590ddfabc12909af5188a4cd89d8c", true },
{MAGIC_2_5_A0_v1, "2.5a0", "eb15cdd4a2f1001792074ca0789026989452ff82", false},
{MAGIC_2_5_A0_v1_U, "2.5a0", "eb15cdd4a2f1001792074ca0789026989452ff82", true },
{MAGIC_2_5_A0_v2, "2.5a0", "b6d2f6fd3e116b9b9fe95bc982ac763c359ff103", false},
{MAGIC_2_5_A0_v2_U, "2.5a0", "b6d2f6fd3e116b9b9fe95bc982ac763c359ff103", true },
{MAGIC_2_5_A0_v3, "2.5a0", "5c36c222e7ca5310e5cc8b8db283bd669d1e24d4", false},
{MAGIC_2_5_A0_v3_U, "2.5a0", "5c36c222e7ca5310e5cc8b8db283bd669d1e24d4", true },
{MAGIC_2_5_B2_v0, "2.5b2", "2c3ec720aa7beb0da4002b847cc5ed7dc782566c", false},
{MAGIC_2_5_B2_v0_U, "2.5b2", "2c3ec720aa7beb0da4002b847cc5ed7dc782566c", true },
{MAGIC_2_5_B2_v1, "2.5b2", "b745b3fd66a649a5fa540bdf47971c26af0a959e", false},
{MAGIC_2_5_B2_v1_U, "2.5b2", "b745b3fd66a649a5fa540bdf47971c26af0a959e", true },
{MAGIC_2_5_C3, "2.5c3", "b90a8b0395bd43fd193842451d0c49573b4d7166", false},
{MAGIC_2_5_C3_U, "2.5c3", "b90a8b0395bd43fd193842451d0c49573b4d7166", true },
{MAGIC_2_6_A0_v0, "2.6a0", "8dcb882ec3e1aac7d336a40aa64ec66561fc3dec", false},
{MAGIC_2_6_A0_v0_U, "2.6a0", "8dcb882ec3e1aac7d336a40aa64ec66561fc3dec", true },
{MAGIC_2_6_A0_v1, "2.6a0", "3985d7e2067db75f170e0891994b0fd70963e40b", false},
{MAGIC_2_6_A0_v1_U, "2.6a0", "3985d7e2067db75f170e0891994b0fd70963e40b", true },
{MAGIC_2_6_A0_v2, "2.6a0", "07aa19170a673da6b3e8c4c66bfd868b2f90c0e4", false},
{MAGIC_2_6_A0_v2_U, "2.6a0", "07aa19170a673da6b3e8c4c66bfd868b2f90c0e4", true },
{MAGIC_2_6_A1_PLUS_v0, "2.6a1+", "343597c7d682b3552580352deddd0cdb36978a04", false},
{MAGIC_2_6_A1_PLUS_v0_U, "2.6a1+", "343597c7d682b3552580352deddd0cdb36978a04", true },
{MAGIC_2_6_A1_PLUS_v1, "2.6a1+", "eac41f90296c69c6d07d29f1feb453a4c0e400d1", false},
{MAGIC_2_6_A1_PLUS_v1_U, "2.6a1+", "eac41f90296c69c6d07d29f1feb453a4c0e400d1", true },
{MAGIC_2_6_A1_PLUS_v2, "2.6a1+", "a0ea3a0efc710934ad66e3907211230ff227d6a1", false},
{MAGIC_2_6_A1_PLUS_v2_U, "2.6a1+", "a0ea3a0efc710934ad66e3907211230ff227d6a1", true },
{MAGIC_2_7_A0_v0, "2.7a0", "94e79d78dff0dfb5c53f49842c7df65ad5b79e66", false},
{MAGIC_2_7_A0_v0_U, "2.7a0", "94e79d78dff0dfb5c53f49842c7df65ad5b79e66", true },
{MAGIC_2_7_A0_v1, "2.7a0", "ef8fe90886968b1eb468cb91ebae103f773fa17f", false},
{MAGIC_2_7_A0_v1_U, "2.7a0", "ef8fe90886968b1eb468cb91ebae103f773fa17f", true },
{MAGIC_2_7_A0_v2, "2.7a0", "145376df3ad728f7052fdd8b6eba600a8317fece", false},
{MAGIC_2_7_A0_v2_U, "2.7a0", "145376df3ad728f7052fdd8b6eba600a8317fece", true },
{MAGIC_2_7_A2_PLUS_v0, "2.7a2+", "c2fdf25329ff30cf8d68c0c0e7cf479d7b203745", false},
{MAGIC_2_7_A2_PLUS_v0_U, "2.7a2+", "c2fdf25329ff30cf8d68c0c0e7cf479d7b203745", true },
{MAGIC_2_7_A2_PLUS_v1, "2.7a2+", "edfed0e32cedf3b84c6e999052486a750a3f5bee", false},
{MAGIC_2_7_A2_PLUS_v1_U, "2.7a2+", "edfed0e32cedf3b84c6e999052486a750a3f5bee", true },
{MAGIC_3_0X_v0, "3.0x", "49c6eb688906b1dddabf578f08129e6729d6151f", false},
{MAGIC_3_0X_v0_U, "3.0x", "49c6eb688906b1dddabf578f08129e6729d6151f", true },
{MAGIC_3_0X_v1, "3.0x", "f87a3e61853d72b1d133992f991e397b31aac8e8", false},
{MAGIC_3_0X_v1_U, "3.0x", "f87a3e61853d72b1d133992f991e397b31aac8e8", true },
{MAGIC_3_0X_v2, "3.0x", "d0b83c4630c0924df661063543f3c5478c8c35ac", false},
{MAGIC_3_0X_v2_U, "3.0x", "d0b83c4630c0924df661063543f3c5478c8c35ac", true },
{MAGIC_3_0X_v3, "3.0x", "1cce0526d9b0a53f4ff95713dde153dc70dae2dc", false},
{MAGIC_3_0X_v3_U, "3.0x", "1cce0526d9b0a53f4ff95713dde153dc70dae2dc", true },
{MAGIC_3_0X_v4, "3.0x", "7a35d3d1ac5a301ef3dc52f9140844f0422011a5", false},
{MAGIC_3_0X_v4_U, "3.0x", "7a35d3d1ac5a301ef3dc52f9140844f0422011a5", true },
{MAGIC_3_0X_v5, "3.0x", "793e0323d4d65bfc89b40d78162cd771c575a18e", false},
{MAGIC_3_0X_v5_U, "3.0x", "793e0323d4d65bfc89b40d78162cd771c575a18e", true },
{MAGIC_3_0X_v6, "3.0x", "19f7ff443718f7a9da1aea9edbf00a135f860883", false},
{MAGIC_3_0X_v6_U, "3.0x", "19f7ff443718f7a9da1aea9edbf00a135f860883", true },
{MAGIC_3_0_A1_v0, "3.0a1", "a89d469e1ff77716914ce1a4244fa529a71ce68a", false},
{MAGIC_3_0_A1_v0_U, "3.0a1", "a89d469e1ff77716914ce1a4244fa529a71ce68a", true },
{MAGIC_3_0_A1_v1, "3.0a1", "19319e70fc3edbb45b2d007161c1b3a1de094181", false},
{MAGIC_3_0_A1_v1_U, "3.0a1", "19319e70fc3edbb45b2d007161c1b3a1de094181", true },
{MAGIC_3_0_A1_PLUS, "3.0a1+", "0d462d789b18ec6a59ebe2116688d5b6985c215d", false},
{MAGIC_3_0_A1_PLUS_U, "3.0a1+", "0d462d789b18ec6a59ebe2116688d5b6985c215d", true },
{MAGIC_3_0_A2, "3.0a2", "4dc01402d78afe2c9b4a4bd8004eb08e2647335d", false},
{MAGIC_3_0_A2_U, "3.0a2", "4dc01402d78afe2c9b4a4bd8004eb08e2647335d", true },
{MAGIC_3_0_A2_PLUS, "3.0a2+", "73e1bf179a01ad7824ff5aa2b29ce068a457cd67", false},
{MAGIC_3_0_A2_PLUS_U, "3.0a2+", "73e1bf179a01ad7824ff5aa2b29ce068a457cd67", true },
{MAGIC_3_0_A3_PLUS, "3.0a3+", "832c820e9d144cb76c8778ad6fcffe232b1f5c46", false},
{MAGIC_3_0_A3_PLUS_U, "3.0a3+", "832c820e9d144cb76c8778ad6fcffe232b1f5c46", true },
{MAGIC_3_0_A5_PLUS, "3.0a5+", "212a1fee6bf93f8b74f81dd3567bf964e627ea20", false},
{MAGIC_3_0_A5_PLUS_U, "3.0a5+", "212a1fee6bf93f8b74f81dd3567bf964e627ea20", true },
{MAGIC_3_1_A0_v0, "3.1a0", "2ee4653927f72f9bb3ff14b3083d4a203d684dfc", false},
{MAGIC_3_1_A0_v0_U, "3.1a0", "2ee4653927f72f9bb3ff14b3083d4a203d684dfc", true },
{MAGIC_3_1_A0_v1, "3.1a0", "643d8d4fc8ebcc69155d3416357aadca9c053388", false},
{MAGIC_3_1_A0_v1_U, "3.1a0", "643d8d4fc8ebcc69155d3416357aadca9c053388", true },
{MAGIC_3_2_A0, "3.2a0", "3aaf2e065db05401803705ed4bfa3fd2f9030df8", false},
{MAGIC_3_2_A0_U, "3.2a0", "3aaf2e065db05401803705ed4bfa3fd2f9030df8", true },
{MAGIC_3_2_A1_PLUS_U, "3.2a1+", "72523121127327c022096d30e7b28a4a5a89495d", true },
{MAGIC_3_2_A2_PLUS_U, "3.2a2+", "252895d491570d5a27452809b582717be409b24d", true },
{MAGIC_3_3_A0_U, "3.3a0", "9a6d9ac6fb2e1bb15bbb4e8c2a6c939d07088477", true },
{MAGIC_3_3_0_A0_v0_U, "3.3.0a0", "e1dbc72bd97f36c1aed7e3ba2a58278f4da807be", true },
{MAGIC_3_3_0_A0_v1_U, "3.3.0a0", "87331661042b89022f6f49506ae9c1ae459a95be", true },
{MAGIC_3_3_0_A1_PLUS_U, "3.3.0a1+", "c0a6569fdad624cc89cdd24b68331dc2a9b64827", true },
{MAGIC_3_3_0_A3_PLUS_U, "3.3.0a3+", "96ab78ef82a775da11a538fc47aebe70d9c34f04", true },
{MAGIC_3_4_0_A0_v0_U, "3.4.0a0", "d296cf1600a8c2c7098737944b5ee793b67a6883", true },
{MAGIC_3_4_0_A0_v1_U, "3.4.0a0", "2528e4aea33801b40ec902a77b5451ebc925a331", true },
{MAGIC_3_4_0_A0_v2_U, "3.4.0a0", "cf65c7a75f558e6cd68903f4c2800f6b9574a35f", true },
{MAGIC_3_4_0_A0_v3_U, "3.4.0a0", "3d858f1eef546e6adb2c073be9384065cfc2537e", true },
{MAGIC_3_4_0_A0_v4_U, "3.4.0a0", "6db3741e59be2b6427032a0f51d8a06625d64c28", true },
{MAGIC_3_4_0_A3_PLUS_v0_U, "3.4.0a3+", "35b384ed594b4618a7ea345dad7d2149eabcf3e7", true },
{MAGIC_3_4_0_A3_PLUS_v1_U, "3.4.0a3+", "bb2affc1e317a85c4edfe450c119bdec851a08ee", true },
{MAGIC_3_4_0_RC1_PLUS_U, "3.4.0rc1+", "e301a515f8f4c5cdde3b9726ec298bd4de1af963", true },
{MAGIC_3_5_0_A0_U, "3.5.0a0", "c553d8f72d659b3bc14fe326662ba53ca97bf38a", true },
{MAGIC_3_5_0_A4_PLUS_U, "3.5.0a4+", "a65f685ba8c011bf117cadf26c13ab7a0cbb122c", true },
{MAGIC_3_5_0_B1_PLUS_U, "3.5.0b1+", "6f05f83c7010764aff53793fbff162c42018f57e", true },
{MAGIC_3_5_0_B2_PLUS_U, "3.5.0b2+", "7a0a1a4ac63942f4ea3c7804e323adf668d40a21", true },
{MAGIC_3_6_0_A0_v0_U, "3.6.0a0", "1ddeb2e175df5009571b3632a709c6b74995cb29", true },
{MAGIC_3_6_0_A0_v1_U, "3.6.0a0", "775b74e0e103f816382a0fc009b6ac51ea956750", true },
{0x00949494, "0.9.4 beta", "77b80a91d357c1d95d8e7cd4cbbe799e5deb777e"},
{0x0099be2a, "0.9.9", "1cabc2b6c9701aea29bb506b593946e67bf7593a"},
{0x0099be3a, "0.9.9", "f820e6917f07e5012bdd103ef97389318d5a10f8"},
{0x00999901, "0.9.9", "9fed5726a36d7ce1355c30592838d93321d580ee"},
{0x00999902, "1.0.1", "1808ca5d8883097c72c6a8a89143041c20ea13c1"},
{0x00999903, "1.1", "d1e6c9a64a563841f60177ac907739f953f15630"},
{0x0a0d4127, "1.2", "fb3daf9b2456dc1a3d99f56f78c5e6270eeaf1e8"},
{0x0a0d2e89, "1.3b1", "0261bf5b3819b03d83f254562947244634604026"},
{0x0a0d0767, "1.4b1", "d1ae0ea9a585f912d7aa3d004ff817d0dea112f8"},
{0x0a0d1704, "1.4b1", "22e29b1747e139d9598eaa5126c59313af39949d"},
{0x0a0d4e95, "1.4", "b82d847b3dcbccd63de075e3879a9369dfb34e0d"},
{0x0a0d4e99, "1.5a1", "104a646fc7a67f27df25d4e941b20035e5876f9f"},
{0x0a0dc4fc, "1.6a2", "84cd52b560e571eba371d7136abcc9c42c27b002"},
{0x0a0dc61b, "2.0b1", "f79434ee41fa86019216240ba32be660bcfc5419"},
{0x0a0dc4fc, "2.0b1", "4388249506d190a76a4dbbbc70294ef6ba0656d5"},
{0x0a0dc4fd, "2.0b1", "4388249506d190a76a4dbbbc70294ef6ba0656d5"},
{0x0a0dc67b, "2.0b1", "4eaa463c031a1bdb5e7791c370d04108e0682dd4"},
{0x0a0dc67c, "2.0b1", "4eaa463c031a1bdb5e7791c370d04108e0682dd4"},
{0x0a0dc67f, "2.0b1", "18385172fac0b7099bd2d2264df614ed4466f083"},
{0x0a0dc680, "2.0b1", "18385172fac0b7099bd2d2264df614ed4466f083"},
{0x0a0dc685, "2.0b1", "f657dc8ff25e93b877305bbcfc45e360191bb326"},
{0x0a0dc686, "2.0b1", "f657dc8ff25e93b877305bbcfc45e360191bb326"},
{0x0a0dc686, "2.0b1", "1b9fd0cbd914947cc421ba7e45aa093d7ba9af00"},
{0x0a0dc687, "2.0b1", "1b9fd0cbd914947cc421ba7e45aa093d7ba9af00"},
{0x0a0dc687, "2.0b1", "1f1a156ed5af8f7a50ce05fc85f85423a24f2aa4"},
{0x0a0dc688, "2.0b1", "1f1a156ed5af8f7a50ce05fc85f85423a24f2aa4"},
{0x0a0deadc, "2.1a1", "fd8c7203251ff37dbb397f7d423ae41f16a03c68"},
{0x0a0deadd, "2.1a1", "fd8c7203251ff37dbb397f7d423ae41f16a03c68"},
{0x0a0deb2a, "2.1a2", "0076e8d28f9eba9eff4508696dc33730af2b4001"},
{0x0a0deb2b, "2.1a2", "0076e8d28f9eba9eff4508696dc33730af2b4001"},
{0x0a0dec04, "2.2a0", "32e7d0898eab85de8134f932680a85c6e7abcec0"},
{0x0a0dec05, "2.2a0", "32e7d0898eab85de8134f932680a85c6e7abcec0"},
{0x0a0ded2d, "2.2a1", "09df3254b49d7c9306585302fe815ab0bdb53439"},
{0x0a0ded2e, "2.2a1", "09df3254b49d7c9306585302fe815ab0bdb53439"},
{0x0a0df231, "2.3a0", "abedb2418f6231adf24205092a59996f1f1e4c02"},
{0x0a0df232, "2.3a0", "abedb2418f6231adf24205092a59996f1f1e4c02"},
{0x0a0df23b, "2.3a0", "d6ae544acd24a1f72ce00534fed464fde91ee504"},
{0x0a0df23c, "2.3a0", "d6ae544acd24a1f72ce00534fed464fde91ee504"},
{0x0a0df245, "2.3a0", "cf5928fab108de9fbe02632d07176c717c2b3aa7"},
{0x0a0df246, "2.3a0", "cf5928fab108de9fbe02632d07176c717c2b3aa7"},
{0x0a0df23b, "2.3a0", "5fe4d93df429134ef8695c12e59ff962ff8b73d2"},
{0x0a0df23c, "2.3a0", "5fe4d93df429134ef8695c12e59ff962ff8b73d2"},
{0x0a0df24f, "2.4a0", "adb42a71169604d3609ac2fbdb64cf8cd1c7250b"},
{0x0a0df250, "2.4a0", "adb42a71169604d3609ac2fbdb64cf8cd1c7250b"},
{0x0a0df259, "2.4a0", "3df36e2e5ddc1149af8eb52e20bc225d806236d4"},
{0x0a0df25a, "2.4a0", "3df36e2e5ddc1149af8eb52e20bc225d806236d4"},
{0x0a0df263, "2.4a2", "1f9b9c226b43ed20cb61e6d21aea6cb966e8bcd3"},
{0x0a0df264, "2.4a2", "1f9b9c226b43ed20cb61e6d21aea6cb966e8bcd3"},
{0x0a0df26d, "2.4a3", "2b49b4a85d9eb4a4cfa9f29c21d649c383945671"},
{0x0a0df26e, "2.4a3", "2b49b4a85d9eb4a4cfa9f29c21d649c383945671"},
{0x0a0df277, "2.5a0", "44e3f21f052590ddfabc12909af5188a4cd89d8c"},
{0x0a0df278, "2.5a0", "44e3f21f052590ddfabc12909af5188a4cd89d8c"},
{0x0a0df281, "2.5a0", "eb15cdd4a2f1001792074ca0789026989452ff82"},
{0x0a0df282, "2.5a0", "eb15cdd4a2f1001792074ca0789026989452ff82"},
{0x0a0df28b, "2.5a0", "b6d2f6fd3e116b9b9fe95bc982ac763c359ff103"},
{0x0a0df28c, "2.5a0", "b6d2f6fd3e116b9b9fe95bc982ac763c359ff103"},
{0x0a0df28c, "2.5a0", "5c36c222e7ca5310e5cc8b8db283bd669d1e24d4"},
{0x0a0df28d, "2.5a0", "5c36c222e7ca5310e5cc8b8db283bd669d1e24d4"},
{0x0a0df295, "2.5b2", "2c3ec720aa7beb0da4002b847cc5ed7dc782566c"},
{0x0a0df296, "2.5b2", "2c3ec720aa7beb0da4002b847cc5ed7dc782566c"},
{0x0a0df29f, "2.5b2", "b745b3fd66a649a5fa540bdf47971c26af0a959e"},
{0x0a0df2a0, "2.5b2", "b745b3fd66a649a5fa540bdf47971c26af0a959e"},
{0x0a0df2a9, "2.5c3", "b90a8b0395bd43fd193842451d0c49573b4d7166"},
{0x0a0df2aa, "2.5c3", "b90a8b0395bd43fd193842451d0c49573b4d7166"},
{0x0a0df2b3, "2.6a0", "8dcb882ec3e1aac7d336a40aa64ec66561fc3dec"},
{0x0a0df2b4, "2.6a0", "8dcb882ec3e1aac7d336a40aa64ec66561fc3dec"},
{0x0a0df2bd, "2.6a0", "3985d7e2067db75f170e0891994b0fd70963e40b"},
{0x0a0df2be, "2.6a0", "3985d7e2067db75f170e0891994b0fd70963e40b"},
{0x0a0df2c7, "2.6a0", "07aa19170a673da6b3e8c4c66bfd868b2f90c0e4"},
{0x0a0df2c8, "2.6a0", "07aa19170a673da6b3e8c4c66bfd868b2f90c0e4"},
{0x0a0df2d1, "2.6a1+", "343597c7d682b3552580352deddd0cdb36978a04"},
{0x0a0df2d2, "2.6a1+", "343597c7d682b3552580352deddd0cdb36978a04"},
{0x0a0df2d3, "2.6a1+", "eac41f90296c69c6d07d29f1feb453a4c0e400d1"},
{0x0a0df2d4, "2.6a1+", "eac41f90296c69c6d07d29f1feb453a4c0e400d1"},
{0x0a0df2d1, "2.6a1+", "a0ea3a0efc710934ad66e3907211230ff227d6a1"},
{0x0a0df2d2, "2.6a1+", "a0ea3a0efc710934ad66e3907211230ff227d6a1"},
{0x0a0df2db, "2.7a0", "94e79d78dff0dfb5c53f49842c7df65ad5b79e66"},
{0x0a0df2dc, "2.7a0", "94e79d78dff0dfb5c53f49842c7df65ad5b79e66"},
{0x0a0df2e5, "2.7a0", "ef8fe90886968b1eb468cb91ebae103f773fa17f"},
{0x0a0df2e6, "2.7a0", "ef8fe90886968b1eb468cb91ebae103f773fa17f"},
{0x0a0df2ef, "2.7a0", "145376df3ad728f7052fdd8b6eba600a8317fece"},
{0x0a0df2f0, "2.7a0", "145376df3ad728f7052fdd8b6eba600a8317fece"},
{0x0a0df2f9, "2.7a2+", "c2fdf25329ff30cf8d68c0c0e7cf479d7b203745"},
{0x0a0df2fa, "2.7a2+", "c2fdf25329ff30cf8d68c0c0e7cf479d7b203745"},
{0x0a0df303, "2.7a2+", "edfed0e32cedf3b84c6e999052486a750a3f5bee"},
{0x0a0df304, "2.7a2+", "edfed0e32cedf3b84c6e999052486a750a3f5bee"},
{0x0a0d0bb8, "3.0x", "49c6eb688906b1dddabf578f08129e6729d6151f"},
{0x0a0d0bb9, "3.0x", "49c6eb688906b1dddabf578f08129e6729d6151f"},
{0x0a0d0bc2, "3.0x", "f87a3e61853d72b1d133992f991e397b31aac8e8"},
{0x0a0d0bc3, "3.0x", "f87a3e61853d72b1d133992f991e397b31aac8e8"},
{0x0a0d0bcc, "3.0x", "d0b83c4630c0924df661063543f3c5478c8c35ac"},
{0x0a0d0bcd, "3.0x", "d0b83c4630c0924df661063543f3c5478c8c35ac"},
{0x0a0d0bd6, "3.0x", "1cce0526d9b0a53f4ff95713dde153dc70dae2dc"},
{0x0a0d0bd7, "3.0x", "1cce0526d9b0a53f4ff95713dde153dc70dae2dc"},
{0x0a0d0be0, "3.0x", "7a35d3d1ac5a301ef3dc52f9140844f0422011a5"},
{0x0a0d0be1, "3.0x", "7a35d3d1ac5a301ef3dc52f9140844f0422011a5"},
{0x0a0d0bea, "3.0x", "793e0323d4d65bfc89b40d78162cd771c575a18e"},
{0x0a0d0beb, "3.0x", "793e0323d4d65bfc89b40d78162cd771c575a18e"},
{0x0a0d0bf4, "3.0x", "19f7ff443718f7a9da1aea9edbf00a135f860883"},
{0x0a0d0bf5, "3.0x", "19f7ff443718f7a9da1aea9edbf00a135f860883"},
{0x0a0d0bfe, "3.0a1", "a89d469e1ff77716914ce1a4244fa529a71ce68a"},
{0x0a0d0bff, "3.0a1", "a89d469e1ff77716914ce1a4244fa529a71ce68a"},
{0x0a0d0c08, "3.0a1", "19319e70fc3edbb45b2d007161c1b3a1de094181"},
{0x0a0d0c09, "3.0a1", "19319e70fc3edbb45b2d007161c1b3a1de094181"},
{0x0a0d0c12, "3.0a1+", "0d462d789b18ec6a59ebe2116688d5b6985c215d"},
{0x0a0d0c13, "3.0a1+", "0d462d789b18ec6a59ebe2116688d5b6985c215d"},
{0x0a0d0c1c, "3.0a2", "4dc01402d78afe2c9b4a4bd8004eb08e2647335d"},
{0x0a0d0c1d, "3.0a2", "4dc01402d78afe2c9b4a4bd8004eb08e2647335d"},
{0x0a0d0c1e, "3.0a2+", "73e1bf179a01ad7824ff5aa2b29ce068a457cd67"},
{0x0a0d0c1f, "3.0a2+", "73e1bf179a01ad7824ff5aa2b29ce068a457cd67"},
{0x0a0d0c26, "3.0a3+", "832c820e9d144cb76c8778ad6fcffe232b1f5c46"},
{0x0a0d0c27, "3.0a3+", "832c820e9d144cb76c8778ad6fcffe232b1f5c46"},
{0x0a0d0c3a, "3.0a5+", "212a1fee6bf93f8b74f81dd3567bf964e627ea20"},
{0x0a0d0c3b, "3.0a5+", "212a1fee6bf93f8b74f81dd3567bf964e627ea20"},
{0x0a0d0c44, "3.1a0", "2ee4653927f72f9bb3ff14b3083d4a203d684dfc"},
{0x0a0d0c45, "3.1a0", "2ee4653927f72f9bb3ff14b3083d4a203d684dfc"},
{0x0a0d0c4e, "3.1a0", "643d8d4fc8ebcc69155d3416357aadca9c053388"},
{0x0a0d0c4f, "3.1a0", "643d8d4fc8ebcc69155d3416357aadca9c053388"},
{0x0a0d0c58, "3.2a0", "3aaf2e065db05401803705ed4bfa3fd2f9030df8"},
{0x0a0d0c59, "3.2a0", "3aaf2e065db05401803705ed4bfa3fd2f9030df8"},
{0x0a0d0c62, "3.2a1+", "72523121127327c022096d30e7b28a4a5a89495d"},
{0x0a0d0c6c, "3.2a2+", "252895d491570d5a27452809b582717be409b24d"},
{0x0a0d0c76, "3.3a0", "9a6d9ac6fb2e1bb15bbb4e8c2a6c939d07088477"},
{0x0a0d0c80, "3.3.0a0", "e1dbc72bd97f36c1aed7e3ba2a58278f4da807be"},
{0x0a0d0c8a, "3.3.0a0", "87331661042b89022f6f49506ae9c1ae459a95be"},
{0x0a0d0c94, "3.3.0a1+", "c0a6569fdad624cc89cdd24b68331dc2a9b64827"},
{0x0a0d0c9e, "3.3.0a3+", "96ab78ef82a775da11a538fc47aebe70d9c34f04"},
{0x0a0d0ca8, "3.4.0a0", "d296cf1600a8c2c7098737944b5ee793b67a6883"},
{0x0a0d0cb2, "3.4.0a0", "2528e4aea33801b40ec902a77b5451ebc925a331"},
{0x0a0d0cbc, "3.4.0a0", "cf65c7a75f558e6cd68903f4c2800f6b9574a35f"},
{0x0a0d0cc6, "3.4.0a0", "3d858f1eef546e6adb2c073be9384065cfc2537e"},
{0x0a0d0cd0, "3.4.0a0", "6db3741e59be2b6427032a0f51d8a06625d64c28"},
{0x0a0d0cda, "3.4.0a3+", "35b384ed594b4618a7ea345dad7d2149eabcf3e7"},
{0x0a0d0ce4, "3.4.0a3+", "bb2affc1e317a85c4edfe450c119bdec851a08ee"},
{0x0a0d0cee, "3.4.0rc1+", "e301a515f8f4c5cdde3b9726ec298bd4de1af963"},
{0x0a0d0cf8, "3.5.0a0", "c553d8f72d659b3bc14fe326662ba53ca97bf38a"},
{0x0a0d0d02, "3.5.0a4+", "a65f685ba8c011bf117cadf26c13ab7a0cbb122c"},
{0x0a0d0d0c, "3.5.0b1+", "6f05f83c7010764aff53793fbff162c42018f57e"},
{0x0a0d0d16, "3.5.0b2+", "7a0a1a4ac63942f4ea3c7804e323adf668d40a21"},
{0x0a0d0d20, "3.6.0a0", "1ddeb2e175df5009571b3632a709c6b74995cb29"},
{0x0a0d0d21, "3.6.0a0", "775b74e0e103f816382a0fc009b6ac51ea956750"},
{0x0a0d0d33, "v3.6.0", "5c4568a05a0a62b5947c55f68f9f2ecfb90a4f12"},
{0x0a0d0d21, "v3.6.0a1", "cec00a7d87e7280b30eaef2e2567ebd0da5b8b9c"},
{0x0a0d0d2c, "v3.6.0a2", "fa42893546010a0c649ba0d85d41a8bb980086f0"},
{0x0a0d0d2c, "v3.6.0a3", "a731a68cf6611b0b23da758d735f056ff661757e"},
{0x0a0d0d2c, "v3.6.0a4", "b87d6000f38e6158bbe1d9df5c6136f27aeace12"},
{0x0a0d0d31, "v3.6.0b1", "beb798cad6a6013d5a606ea0cd19640b35b468ea"},
{0x0a0d0d32, "v3.6.0b2", "7e16af499b92def6fc4ab1bbcecd2c055a38de29"},
{0x0a0d0d32, "v3.6.0b3", "0ef256c2b09cca0990d8d3767de943096dd61a07"},
{0x0a0d0d32, "v3.6.0b4", "38c508a00c32a6ce45a10b705adf8c818fa49dcd"},
{0x0a0d0d33, "v3.6.0rc1", "ad2c2d380e7ebbd31712ceb59e87e84b8a7c131d"},
{0x0a0d0d33, "v3.6.0rc2", "f7b280956df077b90c5983eeabc8accdbb0aeb8d"},
{0x0a0d0d33, "v3.6.1", "208f61cc7a5dbc9879ae6e5c2f95891e270f09ef"},
{0x0a0d0d33, "v3.6.10", "ff1e26c1da1d89c5ddb3bfdfdbe5bcdf68b14990"},
{0x0a0d0d33, "v3.6.10rc", "6e40b45ef295e91febc75b9597033c18425cc36f"},
{0x0a0d0d33, "v3.6.1rc1", "ef16e250bd9864c4dd07e9d128ea871a7604c0f6"},
{0x0a0d0d33, "v3.6.2", "84d6b204565614fc9ae672fb5b8c6f2fd13afd34"},
{0x0a0d0d33, "v3.6.2rc1", "c34b7ba8183311504042966c658116083c0fd1ec"},
{0x0a0d0d33, "v3.6.2rc2", "62922b8b6550c0e80580e9a79dcce9d792358300"},
{0x0a0d0d33, "v3.6.3", "7a8e13423f3cc8cbacece5b8d40c9a78ed2ce468"},
{0x0a0d0d33, "v3.6.3rc1", "5dea35ed4d74f4a660e0cb848c76cb91a80ef284"},
{0x0a0d0d33, "v3.6.4", "f40976d661609cba85458040512ac2bbceeb3756"},
{0x0a0d0d33, "v3.6.4rc1", "73f3fb83724c0d3cc7361e57988196d657e21933"},
{0x0a0d0d33, "v3.6.5", "0a295395451a7f0366995f7c645da35255d640d7"},
{0x0a0d0d33, "v3.6.5rc1", "87c4b938b9d22bc17113d9548a11c24b6bf44490"},
{0x0a0d0d33, "v3.6.6", "5a62cf854bec500e3ee252624e39dbdaf66362a0"},
{0x0a0d0d33, "v3.6.6rc1", "9d7889210ba48b6fde9fac464fff1725d2dbdc1d"},
{0x0a0d0d33, "v3.6.7", "5ebb4a6fe4fc0981d427c9d417d12b6d92cb9fea"},
{0x0a0d0d33, "v3.6.7rc1", "9883b7245756a44f5c51870abb32d711dfc46df7"},
{0x0a0d0d33, "v3.6.7rc2", "923364c5da68e958d69383a56036ca3bb4def006"},
{0x0a0d0d33, "v3.6.8", "50dca05a9c8574e293a5486bb36f0e41f3786628"},
{0x0a0d0d33, "v3.6.8rc1", "036b0b3833a10aef6e326d8369524fd61f49ffc7"},
{0x0a0d0d33, "v3.6.9", "3406378668cca081c0747e765cfe9dc80bdefa89"},
{0x0a0d0d33, "v3.6.9rc1", "734d1d9fbb7cc685b13a11f081e6afa35df3b27f"},
{0x0a0d0d42, "v3.7.0", "ae1f6af15f3e4110616801e235873e47fd7d1977"},
{0x0a0d0d3e, "v3.7.0a1", "c9a8ad52ed621cd429361c12bf96d019e79eac84"},
{0x0a0d0d3f, "v3.7.0a2", "02ffd31e928bfb492ec4f23635590df36ddda134"},
{0x0a0d0d3f, "v3.7.0a3", "4ccd273feeb9692d7171d2923969359e58c96498"},
{0x0a0d0d40, "v3.7.0a4", "682d0dbdd1e7436f54a9a8f57e22cbfc5147c4c3"},
{0x0a0d0d41, "v3.7.0b1", "1401315d067812555e5f45d2111cdf4a2564fcef"},
{0x0a0d0d41, "v3.7.0b2", "511db7b8ecceb74fb2e738ce41e5394516b871f8"},
{0x0a0d0d41, "v3.7.0b3", "aa8b7b7c6c1dbe44789745108396b20b85dbec39"},
{0x0a0d0d41, "v3.7.0b4", "58bb10ac350a934a2cd75506d6cc70cdb2e0ee3b"},
{0x0a0d0d42, "v3.7.0b5", "6f05d12b03c4681d6488645e027b5bc5c19ce406"},
{0x0a0d0d42, "v3.7.0rc1", "2cbc466248a1a5b6b2639d6cf63945e71446b857"},
{0x0a0d0d42, "v3.7.1", "520d6b8e38c078e5560597592c790ce160c8d75c"},
{0x0a0d0d42, "v3.7.1rc1", "c05eb2f1bba48c803d54ce12fc00de87b69d5e06"},
{0x0a0d0d42, "v3.7.1rc2", "a2644156afbb499582326df7c7e2ec95d6a3373e"},
{0x0a0d0d42, "v3.7.2", "e15c3ed43c574400443edc785b5b44b812df0407"},
{0x0a0d0d42, "v3.7.2rc1", "fc9123bd8b773d25ba03f04a85139caf53a91715"},
{0x0a0d0d42, "v3.7.3", "0b8794d19c9f51451155b1f7ad235aa046632c8c"},
{0x0a0d0d42, "v3.7.3rc1", "cb702f0f6b05d1e6d1e1e4449a1e61cd535617d8"},
{0x0a0d0d42, "v3.7.4", "e4539bae82b5dc645fd99cbc869d2fba3067a4ee"},
{0x0a0d0d42, "v3.7.4rc1", "da3644267b7c7614e55b7e33228ce31ce2749f2a"},
{0x0a0d0d42, "v3.7.4rc2", "50745cbf2d7ca594e256fa96ea00a93a53f2ac96"},
{0x0a0d0d42, "v3.7.5", "dc8ada53cff5e8e8f9c20587ab6afc2152b2888f"},
{0x0a0d0d42, "v3.7.5rc1", "4d4c87da17c34d9eb169801d6bc01158c00171dc"},
{0x0a0d0d42, "v3.7.6", "ef8e77cea43fb83c1398d058b8f639fede8fba76"},
{0x0a0d0d42, "v3.7.6rc1", "73ffb22c7f371ff4ea04fdee86a8e71ce1ba56f9"},
{0x0a0d0d55, "v3.8.0", "5d714034866ce1e9f89dc141fe4cc0b50cf20a8e"},
{0x0a0d0d49, "v3.8.0a1", "8cb4789728241d25bca2c15568317c6655389f1b"},
{0x0a0d0d49, "v3.8.0a2", "c31af9d3dd4560d12dfe943347379f0fc6f47a50"},
{0x0a0d0d49, "v3.8.0a3", "d53bead39cd475e581c13307b7838160e603a6fd"},
{0x0a0d0d52, "v3.8.0a4", "1b3497f679823b0368fabc95ccd1a1c24b8d429e"},
{0x0a0d0d52, "v3.8.0b1", "5191895b326e520473c501736239271685a2a077"},
{0x0a0d0d53, "v3.8.0b2", "0bb25c6b3dc78355870758bdf88d1d543cdf4203"},
{0x0a0d0d54, "v3.8.0b3", "108336b63a31356dc9c1f35f91843d6893e26e00"},
{0x0a0d0d55, "v3.8.0b4", "122a9b489cfe94b04801d057e5b510d51710fab3"},
{0x0a0d0d55, "v3.8.0rc1 41f60748364a6afda7360e6cc6e846af569b7ab9"},
{0x0a0d0d55, "v3.8.1", "d2529ef779ce819a5ea833b264e47440efcbac29"},
{0x0a0d0d55, "v3.8.1rc1", "827f6399a61be9d14f8ccfa5be73a6030ec45f1d"},
{0x0a0d0d5c, "v3.9.0a1", "fd757083df79c21eee862e8d89aeefefe45f64a0"},
{0x0a0d0d5e, "v3.9.0a2", "bf0a31c8fb782e03e9530c2488ab2d0e29fc0495"},
{0x0a0d0d60, "v3.9.0a3", "a36ea266c6470f6c65416f24de4497637e59af23"},
};
struct pyc_version get_pyc_version(ut32 magic) {
+1 -144
View File
@@ -1,157 +1,14 @@
/* radare - LGPL3 - Copyright 2016 - Matthieu (c0riolis) Tardy */
/* radare - LGPL3 - Copyright 2016-2020 - c0riolis, x0urc3 */
#ifndef PYC_MAGIC_H
#define PYC_MAGIC_H
#include <r_types.h>
#define MAGIC_0_9_4_BETA 0x00949494
#define MAGIC_0_9_9_v0 0x0099be2a
#define MAGIC_0_9_9_v1 0x0099be3a
#define MAGIC_0_9_9_v2 0x00999901
#define MAGIC_1_0_1 0x00999902
#define MAGIC_1_1 0x00999903
#define MAGIC_1_2 0x0a0d4127
#define MAGIC_1_3_B1 0x0a0d2e89
#define MAGIC_1_4_B1_v0 0x0a0d0767
#define MAGIC_1_4_B1_v1 0x0a0d1704
#define MAGIC_1_4 0x0a0d4e95
#define MAGIC_1_5_A1 0x0a0d4e99
#define MAGIC_1_6_A2 0x0a0dc4fc
#define MAGIC_2_0_B1_v0 0x0a0dc61b
#define MAGIC_2_0_B1_v1 0x0a0dc4fc
#define MAGIC_2_0_B1_v1_U 0x0a0dc4fd
#define MAGIC_2_0_B1_v2 0x0a0dc67b
#define MAGIC_2_0_B1_v2_U 0x0a0dc67c
#define MAGIC_2_0_B1_v3 0x0a0dc67f
#define MAGIC_2_0_B1_v3_U 0x0a0dc680
#define MAGIC_2_0_B1_v4 0x0a0dc685
#define MAGIC_2_0_B1_v4_U 0x0a0dc686
#define MAGIC_2_0_B1_v5 0x0a0dc686
#define MAGIC_2_0_B1_v5_U 0x0a0dc687
#define MAGIC_2_0_B1_v6 0x0a0dc687
#define MAGIC_2_0_B1_v6_U 0x0a0dc688
#define MAGIC_2_1_A1 0x0a0deadc
#define MAGIC_2_1_A1_U 0x0a0deadd
#define MAGIC_2_1_A2 0x0a0deb2a
#define MAGIC_2_1_A2_U 0x0a0deb2b
#define MAGIC_2_2_A0 0x0a0dec04
#define MAGIC_2_2_A0_U 0x0a0dec05
#define MAGIC_2_2_A1 0x0a0ded2d
#define MAGIC_2_2_A1_U 0x0a0ded2e
#define MAGIC_2_3_A0_v0 0x0a0df231
#define MAGIC_2_3_A0_v0_U 0x0a0df232
#define MAGIC_2_3_A0_v1 0x0a0df23b
#define MAGIC_2_3_A0_v1_U 0x0a0df23c
#define MAGIC_2_3_A0_v2 0x0a0df245
#define MAGIC_2_3_A0_v2_U 0x0a0df246
#define MAGIC_2_3_A0_v3 0x0a0df23b
#define MAGIC_2_3_A0_v3_U 0x0a0df23c
#define MAGIC_2_4_A0_v0 0x0a0df24f
#define MAGIC_2_4_A0_v0_U 0x0a0df250
#define MAGIC_2_4_A0_v1 0x0a0df259
#define MAGIC_2_4_A0_v1_U 0x0a0df25a
#define MAGIC_2_4_A2 0x0a0df263
#define MAGIC_2_4_A2_U 0x0a0df264
#define MAGIC_2_4_A3 0x0a0df26d
#define MAGIC_2_4_A3_U 0x0a0df26e
#define MAGIC_2_5_A0_v0 0x0a0df277
#define MAGIC_2_5_A0_v0_U 0x0a0df278
#define MAGIC_2_5_A0_v1 0x0a0df281
#define MAGIC_2_5_A0_v1_U 0x0a0df282
#define MAGIC_2_5_A0_v2 0x0a0df28b
#define MAGIC_2_5_A0_v2_U 0x0a0df28c
#define MAGIC_2_5_A0_v3 0x0a0df28c
#define MAGIC_2_5_A0_v3_U 0x0a0df28d
#define MAGIC_2_5_B2_v0 0x0a0df295
#define MAGIC_2_5_B2_v0_U 0x0a0df296
#define MAGIC_2_5_B2_v1 0x0a0df29f
#define MAGIC_2_5_B2_v1_U 0x0a0df2a0
#define MAGIC_2_5_C3 0x0a0df2a9
#define MAGIC_2_5_C3_U 0x0a0df2aa
#define MAGIC_2_6_A0_v0 0x0a0df2b3
#define MAGIC_2_6_A0_v0_U 0x0a0df2b4
#define MAGIC_2_6_A0_v1 0x0a0df2bd
#define MAGIC_2_6_A0_v1_U 0x0a0df2be
#define MAGIC_2_6_A0_v2 0x0a0df2c7
#define MAGIC_2_6_A0_v2_U 0x0a0df2c8
#define MAGIC_2_6_A1_PLUS_v0 0x0a0df2d1
#define MAGIC_2_6_A1_PLUS_v0_U 0x0a0df2d2
#define MAGIC_2_6_A1_PLUS_v1 0x0a0df2d3
#define MAGIC_2_6_A1_PLUS_v1_U 0x0a0df2d4
#define MAGIC_2_6_A1_PLUS_v2 0x0a0df2d1
#define MAGIC_2_6_A1_PLUS_v2_U 0x0a0df2d2
#define MAGIC_2_7_A0_v0 0x0a0df2db
#define MAGIC_2_7_A0_v0_U 0x0a0df2dc
#define MAGIC_2_7_A0_v1 0x0a0df2e5
#define MAGIC_2_7_A0_v1_U 0x0a0df2e6
#define MAGIC_2_7_A0_v2 0x0a0df2ef
#define MAGIC_2_7_A0_v2_U 0x0a0df2f0
#define MAGIC_2_7_A2_PLUS_v0 0x0a0df2f9
#define MAGIC_2_7_A2_PLUS_v0_U 0x0a0df2fa
#define MAGIC_2_7_A2_PLUS_v1 0x0a0df303
#define MAGIC_2_7_A2_PLUS_v1_U 0x0a0df304
#define MAGIC_3_0X_v0 0x0a0d0bb8
#define MAGIC_3_0X_v0_U 0x0a0d0bb9
#define MAGIC_3_0X_v1 0x0a0d0bc2
#define MAGIC_3_0X_v1_U 0x0a0d0bc3
#define MAGIC_3_0X_v2 0x0a0d0bcc
#define MAGIC_3_0X_v2_U 0x0a0d0bcd
#define MAGIC_3_0X_v3 0x0a0d0bd6
#define MAGIC_3_0X_v3_U 0x0a0d0bd7
#define MAGIC_3_0X_v4 0x0a0d0be0
#define MAGIC_3_0X_v4_U 0x0a0d0be1
#define MAGIC_3_0X_v5 0x0a0d0bea
#define MAGIC_3_0X_v5_U 0x0a0d0beb
#define MAGIC_3_0X_v6 0x0a0d0bf4
#define MAGIC_3_0X_v6_U 0x0a0d0bf5
#define MAGIC_3_0_A1_v0 0x0a0d0bfe
#define MAGIC_3_0_A1_v0_U 0x0a0d0bff
#define MAGIC_3_0_A1_v1 0x0a0d0c08
#define MAGIC_3_0_A1_v1_U 0x0a0d0c09
#define MAGIC_3_0_A1_PLUS 0x0a0d0c12
#define MAGIC_3_0_A1_PLUS_U 0x0a0d0c13
#define MAGIC_3_0_A2 0x0a0d0c1c
#define MAGIC_3_0_A2_U 0x0a0d0c1d
#define MAGIC_3_0_A2_PLUS 0x0a0d0c1e
#define MAGIC_3_0_A2_PLUS_U 0x0a0d0c1f
#define MAGIC_3_0_A3_PLUS 0x0a0d0c26
#define MAGIC_3_0_A3_PLUS_U 0x0a0d0c27
#define MAGIC_3_0_A5_PLUS 0x0a0d0c3a
#define MAGIC_3_0_A5_PLUS_U 0x0a0d0c3b
#define MAGIC_3_1_A0_v0 0x0a0d0c44
#define MAGIC_3_1_A0_v0_U 0x0a0d0c45
#define MAGIC_3_1_A0_v1 0x0a0d0c4e
#define MAGIC_3_1_A0_v1_U 0x0a0d0c4f
#define MAGIC_3_2_A0 0x0a0d0c58
#define MAGIC_3_2_A0_U 0x0a0d0c59
#define MAGIC_3_2_A1_PLUS_U 0x0a0d0c62
#define MAGIC_3_2_A2_PLUS_U 0x0a0d0c6c
#define MAGIC_3_3_A0_U 0x0a0d0c76
#define MAGIC_3_3_0_A0_v0_U 0x0a0d0c80
#define MAGIC_3_3_0_A0_v1_U 0x0a0d0c8a
#define MAGIC_3_3_0_A1_PLUS_U 0x0a0d0c94
#define MAGIC_3_3_0_A3_PLUS_U 0x0a0d0c9e
#define MAGIC_3_4_0_A0_v0_U 0x0a0d0ca8
#define MAGIC_3_4_0_A0_v1_U 0x0a0d0cb2
#define MAGIC_3_4_0_A0_v2_U 0x0a0d0cbc
#define MAGIC_3_4_0_A0_v3_U 0x0a0d0cc6
#define MAGIC_3_4_0_A0_v4_U 0x0a0d0cd0
#define MAGIC_3_4_0_A3_PLUS_v0_U 0x0a0d0cda
#define MAGIC_3_4_0_A3_PLUS_v1_U 0x0a0d0ce4
#define MAGIC_3_4_0_RC1_PLUS_U 0x0a0d0cee
#define MAGIC_3_5_0_A0_U 0x0a0d0cf8
#define MAGIC_3_5_0_A4_PLUS_U 0x0a0d0d02
#define MAGIC_3_5_0_B1_PLUS_U 0x0a0d0d0c
#define MAGIC_3_5_0_B2_PLUS_U 0x0a0d0d16
#define MAGIC_3_6_0_A0_v0_U 0x0a0d0d20
#define MAGIC_3_6_0_A0_v1_U 0x0a0d0d21
struct pyc_version {
ut32 magic;
char *version;
char *revision;
bool unicode;
};
struct pyc_version get_pyc_version(ut32 magic);
+7 -8
View File
@@ -80,7 +80,7 @@ int r_bin_swf_get_sections(RList *list, RBinFile *arch) {
ut8 start = 0x8; // signature + version + size
head_sect->size = start;
head_sect->vsize = start;
head_sect->srwx = R_BIN_SCN_READABLE;
head_sect->perm = R_PERM_R;
r_list_append (list, head_sect);
/* ZlibData section */
@@ -94,7 +94,7 @@ int r_bin_swf_get_sections(RList *list, RBinFile *arch) {
data->vaddr = start;
data->size = r_buf_size(arch->buf) - start;
data->vsize = r_buf_size(arch->buf) - start;
data->srwx = R_BIN_SCN_READABLE;
data->perm = R_PERM_R;
r_list_append (list, data);
} else if (header.signature[0] == ISWF_MAGIC_0_2) {
@@ -113,7 +113,7 @@ int r_bin_swf_get_sections(RList *list, RBinFile *arch) {
ut8 start = 0x8; // signature + version + size
head_sect->size = start;
head_sect->vsize = start;
head_sect->srwx = R_BIN_SCN_READABLE;
head_sect->perm = R_PERM_R;
r_list_append (list, head_sect);
/* LzmaData section */
@@ -126,7 +126,7 @@ int r_bin_swf_get_sections(RList *list, RBinFile *arch) {
data->vaddr = start;
data->size = r_buf_size(arch->buf) - start;
data->vsize = r_buf_size(arch->buf) - start;
data->srwx = R_BIN_SCN_READABLE;
data->perm = R_PERM_R;
r_list_append (list, data);
} else {
@@ -141,7 +141,7 @@ int r_bin_swf_get_sections(RList *list, RBinFile *arch) {
ut32 start = header.rect_size + SWF_HDR_MIN_SIZE; // rect + min_size
head_sect->size = start;
head_sect->vsize = start;
head_sect->srwx = R_BIN_SCN_READABLE;
head_sect->perm = R_PERM_R;
r_list_append (list, head_sect);
/* Other sections */
@@ -183,11 +183,11 @@ int r_bin_swf_get_sections(RList *list, RBinFile *arch) {
switch (tagCode) {
case TAG_DOACTION:
case TAG_DOINITACTION:
new->srwx = R_BIN_SCN_READABLE | R_BIN_SCN_EXECUTABLE;
new->perm = R_PERM_RX;
new->has_strings = true;
break;
default:
new->srwx = R_BIN_SCN_READABLE;
new->perm = R_PERM_R;
break;
}
r_list_append (list, new);
@@ -196,7 +196,6 @@ int r_bin_swf_get_sections(RList *list, RBinFile *arch) {
r_buf_read_at (arch->buf, end, (ut8*)&tagCodeAndLength, 2);
section++;
}
}
return true;
+22 -12
View File
@@ -52,6 +52,12 @@ static bool check_bytes(const ut8 *buf, ut64 length) {
return false;
}
static bool check_buffer(RBuffer *b) {
ut8 buf[1024];
r_buf_read_at (b, 0, buf, sizeof (buf));
return check_bytes (buf, sizeof (buf));
}
static void *load_bytes(RBinFile *arch, const ut8 *buf, ut64 sz, ut64 loadaddr, Sdb *sdb) {
if (!buf || !sz || sz < sizeof (pcap_file_hdr_t) || sz == UT64_MAX) {
return NULL;
@@ -117,9 +123,9 @@ static void _read_ipv4_sym(RList *list, const ut8 *buf, ut64 off, ut64 sz, int e
ptr->name = r_str_newf ("0x%"PFMT64x": IPV%d, Src: %d.%d.%d.%d, Dst: %d.%d.%d.%d",
off, (ipv4.ver_len >> 4) & 0x0F, (ipv4.src >> 24) & 0xFF,
(ipv4.src >> 16) & 0xFF, (ipv4.src >> 8) & 0xFF,
ipv4.src && 0xFF, (ipv4.dst >> 24) & 0xFF,
ipv4.src & 0xFF, (ipv4.dst >> 24) & 0xFF,
(ipv4.dst >> 16) & 0xFF, (ipv4.dst >> 8) & 0xFF,
ipv4.dst && 0xFF);
ipv4.dst & 0xFF);
ptr->paddr = ptr->vaddr = off;
r_list_append (list, ptr);
if (off + ipv4.tot_len > sz) {
@@ -249,15 +255,15 @@ static RList *symbols(RBinFile *arch) {
RBinSymbol *ptr = NULL;
RList *ret = NULL;
pcap_obj_t *obj = NULL;
const ut8 *buf = NULL;
ut64 sz = 0;
ut64 off;
ut64 pkt_num = 0;
if (!arch || !arch->o || !arch->o->bin_obj || !arch->buf || !arch->buf->buf) {
if (!arch || !arch->o || !arch->o->bin_obj || !arch->buf) {
return NULL;
}
obj = arch->o->bin_obj;
buf = r_buf_buffer (arch->buf);
ut8 buf[1024]; // sizeof(pcap_file-hdr
r_buf_read_at (arch->buf, 0, buf, sizeof (buf));
sz = r_buf_size (arch->buf);
if (sz == 0 || sz == UT64_MAX) {
return NULL;
@@ -315,15 +321,15 @@ static RList *strings(RBinFile *arch) {
RBinString *ptr = NULL;
RList *ret = NULL;
pcap_obj_t *obj = NULL;
const ut8 *buf = NULL;
char *tmp = NULL;
ut64 sz = 0;
ut64 off;
if (!arch || !arch->o || !arch->o->bin_obj || !arch->buf || !arch->buf->buf) {
if (!arch || !arch->o || !arch->o->bin_obj || !arch->buf) {
return NULL;
}
obj = arch->o->bin_obj;
buf = r_buf_buffer (arch->buf);
ut8 buf[1024];
r_buf_read_at (arch->buf, 0, buf, sizeof (buf));
sz = r_buf_size (arch->buf);
if (sz == 0 || sz == UT64_MAX) {
return NULL;
@@ -412,25 +418,29 @@ static bool load(RBinFile *arch) {
if (!arch || !arch->o) {
return false;
}
const ut8 *bytes = r_buf_buffer (arch->buf);
ut64 size = r_buf_size (arch->buf);
ut8 *bytes = malloc (size);
if (!bytes || size == 0 || size == UT64_MAX) {
return false;
}
r_buf_read_at (arch->buf, 0, bytes, size);
arch->o->bin_obj = load_bytes (arch, bytes, size, arch->o->loadaddr, arch->sdb);
return arch->o->bin_obj != NULL;
}
static bool load_buffer(RBinFile *bf, void **bin_obj, RBuffer *buf, ut64 loadaddr, Sdb *sdb) {
return load(bf);
}
RBinPlugin r_bin_plugin_pcap = {
.name = "pcap",
.desc = "libpcap .pcap format r2 plugin",
.license = "LGPL3",
.info = info,
.load = load,
.strings = strings,
.symbols = symbols,
.load_bytes = load_bytes,
.check_bytes = check_bytes,
.load_buffer= load_buffer,
.check_buffer = check_buffer,
};
#ifndef CORELIB
+34 -19
View File
@@ -1,7 +1,6 @@
/* radare - LGPL3 - Copyright 2016-2017 - Matthieu (c0riolis) Tardy */
/* radare - LGPL3 - Copyright 2016-2020 - c0riolis, x0urc3 */
#include <r_bin.h>
#include "pyc_magic.h"
#include "pyc.h"
// XXX: to not use globals
@@ -10,17 +9,29 @@ static struct pyc_version version;
/* used from marshall.c */
RList *interned_table = NULL;
static bool check_bytes(const ut8 *buf, ut64 length) {
if (!buf || length < 8) {
// magic + timestamp
return false;
}
version = get_pyc_version (*(ut32*)buf);
return version.magic != -1;
static bool check_buffer(RBuffer *b) {
if (r_buf_size (b) > 4) {
ut32 buf;
r_buf_read_at (b, 0, (ut8 *) &buf, sizeof (buf));
version = get_pyc_version (buf);
return version.magic != -1;
}
return false;
}
static bool load_bytes(RBinFile *bf, void **bin_obj, const ut8 *buf, ut64 sz, ut64 loadaddr, Sdb *sdb) {
return check_bytes (buf, sz);
static bool load_buffer(RBinFile *bf, void **bin_obj, RBuffer *buf, ut64 loadaddr, Sdb *sdb) {
return check_buffer (buf);
}
static ut64 get_entrypoint(RBuffer *buf) {
ut8 b;
for (int addr = 0x8; addr <= 0x10; addr += 0x4) {
r_buf_read_at (buf, addr, &b, sizeof (b));
if (pyc_is_code(b)) {
return addr;
}
}
return NULL;
}
static RBinInfo *info(RBinFile *arch) {
@@ -28,8 +39,7 @@ static RBinInfo *info(RBinFile *arch) {
if (!ret)
return NULL;
ret->file = strdup (arch->file);
ret->type = r_str_newf ("Python %s%s byte-compiled file", version.version,
version.unicode ? " Unicode" : "");
ret->type = r_str_newf ("Python %s byte-compiled file", version.version);
ret->bclass = strdup ("Python byte-compiled file");
ret->rclass = strdup ("pyc");
ret->machine = r_str_newf ("Python %s VM (rev %s)", version.version,
@@ -72,27 +82,32 @@ static RList *entries(RBinFile *arch) {
if (!addr) {
return NULL;
}
ut64 entrypoint = pyc_get_entrypoint (version.magic);
ut64 entrypoint = get_entrypoint (arch->buf);
addr->paddr = entrypoint;
addr->vaddr = entrypoint;
r_buf_seek (arch->buf, entrypoint, R_IO_SEEK_CUR);
r_buf_seek (arch->buf, entrypoint, R_IO_SEEK_SET);
r_list_append (entries, addr);
return entries;
}
static ut64 baddr(RBinFile *bf) {
return 0;
}
RBinPlugin r_bin_plugin_pyc = {
.name = "pyc",
.desc = "Python byte-compiled file plugin",
.license = "LGPL3",
.info = &info,
.load_bytes = &load_bytes,
.check_bytes = &check_bytes,
.load_buffer = &load_buffer,
.check_buffer = &check_buffer,
.entries = &entries,
.sections = &sections,
.baddr = &baddr,
};
#ifndef CORELIB
RLibStruct radare_plugin = {
#ifndef R2_PLUGIN_INCORE
R_API RLibStruct radare_plugin = {
.type = R_LIB_TYPE_BIN,
.data = &r_bin_plugin_pyc,
.version = R2_VERSION,
+22 -12
View File
@@ -7,14 +7,15 @@
#include "../format/swf/swf_specs.h"
#include "../format/swf/swf.h"
static int check(RBinFile *arch);
static int check_bytes(const ut8 *buf, ut64 length);
static bool check_buffer(RBuffer *b);
static char compression;
static char flashVersion;
static bool load_bytes(RBinFile *bf, void **bin_obj, const ut8 *buf, ut64 sz, ut64 loadaddr, Sdb *sdb){
if (check_bytes (buf, sz)) {
static bool load_buffer(RBinFile *bf, void **bin_obj, RBuffer *b, ut64 loadaddr, Sdb *sdb){
if (check_buffer (b)) {
ut8 buf[4];
r_buf_read_at (b, 0, buf, 4);
compression = buf[0];
flashVersion = buf[3];
return true;
@@ -22,12 +23,21 @@ static bool load_bytes(RBinFile *bf, void **bin_obj, const ut8 *buf, ut64 sz, ut
return false;
}
static int check_bytes(const ut8 *buf, ut64 length) {
if (!buf || length < 4) return false;
if ((*buf == ISWF_MAGIC_0_0 || *buf == ISWF_MAGIC_0_1 ||
*buf == ISWF_MAGIC_0_2) && (!memcmp (buf+1, ISWF_MAGIC, 2)))
return true;
static bool check_buffer(RBuffer *b) {
ut8 buf[4];
if (r_buf_size (b) < 4) {
return false;
}
r_buf_read_at (b, 0, buf, 4);
switch (buf[0]) {
case ISWF_MAGIC_0_0:
case ISWF_MAGIC_0_1:
case ISWF_MAGIC_0_2:
if (!memcmp (buf + 1, ISWF_MAGIC, 2)) {
return true;
}
break;
}
return false;
}
@@ -92,8 +102,8 @@ RBinPlugin r_bin_plugin_swf = {
.name = "swf",
.desc = "SWF",
.license = "LGPL3",
.load_bytes = &load_bytes,
.check_bytes = &check_bytes,
.load_buffer = &load_buffer,
.check_buffer = &check_buffer,
.entries = &entries,
.sections = &sections,
.info = &info,
+1 -1
View File
@@ -10,5 +10,5 @@ CFLAGS+=-I../format/pyc/
ALL_TARGETS+=${TARGET_PYC}
${TARGET_PYC}: ${OBJ_PYC}
${CC} ${CFLAGS} -o ${TARGET_PYC} ${OBJ_PYC} $(R2_CFLAGS) $(R2_LDFLAGS) -lr_util -lgmp
${CC} ${CFLAGS} -o ${TARGET_PYC} ${OBJ_PYC} $(R2_CFLAGS) $(R2_LDFLAGS) -lr_util
+166 -68
View File
@@ -164,6 +164,13 @@ static char *get_field_imm15 (long instr)
return (tmpstr);
}
static char *get_field_imm5 (long instr)
{
char *tmpstr;
tmpstr = r_str_newf ("%u", (short)((instr & IMM5_MASK) >> IMM_LOW));
return (tmpstr);
}
static char *
get_field_special (long instr, struct op_code_struct * op)
{
@@ -244,7 +251,6 @@ static void analyse_arithmetic_inst_imm(struct mb_anal_ctx *ctx, unsigned long i
struct op_code_struct *mb_op) {
RAnalOp *op = ctx->op;
char *ra = get_field_r1 (insn);
char *rb = get_field_r2 (insn);
char *rd = get_field_rd (insn);
char *imm = get_imm (ctx, insn);
@@ -254,40 +260,38 @@ static void analyse_arithmetic_inst_imm(struct mb_anal_ctx *ctx, unsigned long i
switch (mb_op->instr) {
case addi:
r_strbuf_appendf (&op->esil, "_imm,%s,+,%s,=", ra, rd);
r_strbuf_appendf (&op->esil, ",31,$c,c,=");
op->type = R_ANAL_OP_TYPE_ADD;
break;
case rsubi:
r_strbuf_appendf (&op->esil, "_imm,%s,-,%s,=", ra, rd);
r_strbuf_appendf (&op->esil, "%s,_imm,-,%s,=", ra, rd);
r_strbuf_appendf (&op->esil, ",1,$b,!,c,=");
op->type = R_ANAL_OP_TYPE_SUB;
break;
case addic:
/* should use carry */
r_strbuf_appendf (&op->esil, "_imm,%s,+,%s,=", ra, rd);
r_strbuf_appendf (&op->esil, "_imm,%s,+,c,+,%s,=", ra, rd);
r_strbuf_appendf (&op->esil, ",31,$c,c,=");
op->type = R_ANAL_OP_TYPE_ADD;
break;
case rsubic:
/* should use carry */
r_strbuf_appendf (&op->esil, "_imm,%s,-,%s,=", ra, rd);
r_strbuf_appendf (&op->esil, "%s,_imm,-,c,+,%s,=", ra, rd);
r_strbuf_appendf (&op->esil, ",1,$b,!,c,=");
op->type = R_ANAL_OP_TYPE_SUB;
break;
case addik:
/* should keep carry */
r_strbuf_appendf (&op->esil, "_imm,%s,+,%s,=", ra, rd);
op->type = R_ANAL_OP_TYPE_ADD;
break;
case rsubik:
/* should keep carry */
r_strbuf_appendf (&op->esil, "_imm,%s,-,%s,=", ra, rd);
r_strbuf_appendf (&op->esil, "%s,_imm,-,%s,=", ra, rd);
op->type = R_ANAL_OP_TYPE_SUB;
break;
case addikc:
/* should use and keep carry */
r_strbuf_appendf (&op->esil, "_imm,%s,+,%s,=", ra, rd);
r_strbuf_appendf (&op->esil, "_imm,%s,+,c,+,%s,=", ra, rd);
op->type = R_ANAL_OP_TYPE_ADD;
break;
case rsubikc:
/* should use and keep carry */
r_strbuf_appendf (&op->esil, "_imm,%s,-,%s,=", ra, rd);
r_strbuf_appendf (&op->esil, "%s,_imm,-,c,+,%s,=", ra, rd);
op->type = R_ANAL_OP_TYPE_SUB;
break;
}
@@ -306,27 +310,29 @@ static void analyse_arithmetic_inst(struct mb_anal_ctx *ctx, unsigned long insn,
switch (mb_op->instr) {
case add:
r_strbuf_setf (&op->esil, "%s,%s,+,%s,=", ra, rb, rd);
r_strbuf_appendf (&op->esil, ",31,$c,c,=");
op->type = R_ANAL_OP_TYPE_ADD;
break;
case rsub:
r_strbuf_setf (&op->esil, "%s,%s,-,%s,=", ra, rb, rd);
r_strbuf_appendf (&op->esil, ",1,$b,!,c,=");
op->type = R_ANAL_OP_TYPE_SUB;
break;
case addc:
r_strbuf_setf (&op->esil, "%s,%s,c,+,+,%s,=", ra, rb, rd);
r_strbuf_appendf (&op->esil, "32,%s,>>,c,+=", rd);
r_strbuf_appendf (&op->esil, ",31,$c,c,=");
op->type = R_ANAL_OP_TYPE_ADD;
break;
case rsubc:
r_strbuf_setf (&op->esil, "%s,%s,-,c,+,%s,=", ra, rb, rd);
r_strbuf_appendf (&op->esil, ",1,$b,!,c,=");
op->type = R_ANAL_OP_TYPE_SUB;
break;
case addk:
/* should keep carry */
r_strbuf_setf (&op->esil, "%s,%s,+,%s,=", ra, rb, rd);
op->type = R_ANAL_OP_TYPE_ADD;
break;
case rsubk:
/* should keep carry */
r_strbuf_setf (&op->esil, "%s,%s,-,%s,=", ra, rb, rd);
op->type = R_ANAL_OP_TYPE_SUB;
break;
@@ -341,10 +347,11 @@ static void analyse_arithmetic_inst(struct mb_anal_ctx *ctx, unsigned long insn,
op->type = R_ANAL_OP_TYPE_CMP;
break;
case addkc:
r_strbuf_setf (&op->esil, "%s,%s,c,+,+,%s,=", ra, rb, rd);
r_strbuf_setf (&op->esil, "%s,%s,+,c,+,%s,=", ra, rb, rd);
op->type = R_ANAL_OP_TYPE_ADD;
break;
case rsubkc:
r_strbuf_setf (&op->esil, "%s,%s,-,c,+,%s,=", ra, rb, rd);
op->type = R_ANAL_OP_TYPE_SUB;
break;
case swapb:
@@ -359,13 +366,48 @@ static void analyse_arithmetic_inst(struct mb_anal_ctx *ctx, unsigned long insn,
r_strbuf_appendf (&op->esil, ",0,_imm,=");
}
static void analyse_logical_inst_imm(struct mb_anal_ctx *ctx, unsigned long insn,
struct op_code_struct *mb_op) {
RAnalOp *op = ctx->op;
char *ra = get_field_r1 (insn);
char *rd = get_field_rd (insn);
char *imm = get_imm (ctx, insn);
r_strbuf_setf (&op->esil, "1,_immf,==,$z,?{,%s,%u,&,_imm,|,_imm,=,},", imm, UT16_MAX);
r_strbuf_appendf (&op->esil, "0,_immf,==,$z,?{,%s,_imm,=,},", imm);
switch (mb_op->instr) {
case ori:
r_strbuf_appendf (&op->esil, "_imm,%s,|,%s,=", ra, rd);
op->type = R_ANAL_OP_TYPE_OR;
break;
case andi:
r_strbuf_appendf (&op->esil, "_imm,%s,&,%s,=", ra, rd);
op->type = R_ANAL_OP_TYPE_AND;
break;
case xori:
r_strbuf_appendf (&op->esil, "_imm,%s,^,%s,=", ra, rd);
op->type = R_ANAL_OP_TYPE_XOR;
break;
case andni:
r_strbuf_appendf (&op->esil, "_imm,!,%s,&,%s,=", ra, rd);
op->type = R_ANAL_OP_TYPE_NOT;
break;
default:
break;
}
// Reset _immf to zero even if not used.
r_strbuf_appendf (&op->esil, ",0,_immf,=");
r_strbuf_appendf (&op->esil, ",0,_imm,=");
}
static void analyse_logical_inst(struct mb_anal_ctx *ctx, unsigned long insn,
struct op_code_struct *mb_op) {
RAnalOp *op = ctx->op;
char *ra = get_field_r1 (insn);
char *rb = get_field_r2 (insn);
char *rd = get_field_rd (insn);
char *imm = get_imm (ctx, insn);
switch (mb_op->instr) {
case or:
r_strbuf_setf (&op->esil, "%s,%s,|,%s,=", ra, rb, rd);
@@ -393,32 +435,27 @@ static void analyse_logical_inst(struct mb_anal_ctx *ctx, unsigned long insn,
case pcmpne:
break;
case sra:
r_strbuf_setf (&op->esil, "1,%s,>>>,%s,=", ra, rd);
r_strbuf_setf (&op->esil, "%s,1,&,c,=,", ra);
r_strbuf_appendf (&op->esil, "1,%s,>>>>,%s,=", ra, rd);
op->type = R_ANAL_OP_TYPE_SAR;
break;
case src:
r_strbuf_setf (&op->esil, "1,%s,>>,%s,=,", ra, rd);
r_strbuf_appendf (&op->esil, "31,c,<<,%s,|=", rd);
op->type = R_ANAL_OP_TYPE_SHR;
break;
case srl:
r_strbuf_setf (&op->esil, "%s,1,&,c,=,", ra);
r_strbuf_appendf (&op->esil, "1,%s,>>,%s,=", ra, rd);
op->type = R_ANAL_OP_TYPE_SHR;
break;
case sext8:
r_strbuf_setf (&op->esil, "%s,%s,=,7,%s,>>,?{,0xffffff00,%s,|=,}", ra, rd, ra, rd);
op->type = R_ANAL_OP_TYPE_CAST;
break;
case sext16:
break;
case ori:
r_strbuf_setf (&op->esil, "%s,_imm,|,%s,|,%s,=", ra, imm, rd);
op->type = R_ANAL_OP_TYPE_OR;
break;
case andi:
r_strbuf_setf (&op->esil, "%s,_imm,|,%s,&,%s,=", ra, imm, rd);
op->type = R_ANAL_OP_TYPE_AND;
break;
case xori:
r_strbuf_setf (&op->esil, "%s,_imm,|,%s,^,%s,=", ra, imm, rd);
op->type = R_ANAL_OP_TYPE_XOR;
break;
case andni:
r_strbuf_setf (&op->esil, "%s,!,%s,&,%s,=", ra, imm, rd);
op->type = R_ANAL_OP_TYPE_NOT;
r_strbuf_setf (&op->esil, "%s,%s,=,15,%s,>>,?{,0xffff0000,%s,|=,}", ra, rd, ra, rd);
op->type = R_ANAL_OP_TYPE_CAST;
break;
default:
break;
@@ -537,12 +574,12 @@ static void analyse_branch_inst_imm(struct mb_anal_ctx *ctx, unsigned long insn,
op->jump = jump_addr;
break;
case brai:
r_strbuf_setf (&op->esil, "_imm,pc,=");
r_strbuf_appendf (&op->esil, "_imm,pc,=");
op->type = R_ANAL_OP_TYPE_JMP;
op->jump = jump_addr;
break;
case braid:
r_strbuf_appendf (&op->esil, "_imm,|,pc,=");
r_strbuf_appendf (&op->esil, "_imm,pc,=");
op->type = R_ANAL_OP_TYPE_JMP;
op->delay = 1;
op->jump = jump_addr;
@@ -559,13 +596,13 @@ static void analyse_branch_inst_imm(struct mb_anal_ctx *ctx, unsigned long insn,
op->jump = jump_addr;
break;
case beqi:
r_strbuf_appendf (&op->esil, "0,%s,==,?{,_imm,$$,+,pc,=,}", ra);
r_strbuf_appendf (&op->esil, "0,%s,==,$z,?{,_imm,$$,+,pc,=,}", ra);
op->type = R_ANAL_OP_TYPE_CJMP;
op->jump = jump_addr;
op->fail = op->addr + op->size;
break;
case beqid:
r_strbuf_appendf (&op->esil, "0,%s,==,?{,_imm,$$,+,pc,=,}", ra);
r_strbuf_appendf (&op->esil, "0,%s,==,$z,?{,_imm,$$,+,pc,=,}", ra);
op->type = R_ANAL_OP_TYPE_CJMP;
op->delay = 1;
op->jump = jump_addr;
@@ -784,6 +821,7 @@ static void analyse_return_inst(struct mb_anal_ctx *ctx, unsigned long insn,
}
// Reset _immf to zero even if not used.
r_strbuf_appendf (&op->esil, ",0,_immf,=");
r_strbuf_appendf (&op->esil, ",0,_imm,=");
}
static void analyse_special_inst(struct mb_anal_ctx *ctx, unsigned long insn, struct op_code_struct *mb_op) {
@@ -858,12 +896,43 @@ static void analyse_anyware_inst(struct mb_anal_ctx *ctx, unsigned long insn, st
r_strbuf_appendf (&op->esil, ",0,_imm,=");
}
static void analyse_memory_load_inst_imm(struct mb_anal_ctx *ctx, unsigned long insn, struct op_code_struct *mb_op) {
RAnalOp *op = ctx->op;
char *ra = get_field_r1 (insn);
char *rd = get_field_rd (insn);
char *imm = get_imm (ctx, insn);
r_strbuf_setf (&op->esil, "1,_immf,==,$z,?{,%s,%u,&,_imm,|,_imm,=,},", imm, UT16_MAX);
r_strbuf_appendf (&op->esil, "0,_immf,==,$z,?{,%s,_imm,=,},", imm);
switch (mb_op->instr) {
case lbui:
r_strbuf_appendf (&op->esil, "%s,_imm,+,[1],%s,=", ra, rd);
op->type = R_ANAL_OP_TYPE_LOAD;
break;
case lhui:
r_strbuf_appendf (&op->esil, "%s,_imm,+,[4],%s,=", ra, rd);
r_strbuf_appendf (&op->esil, ",16,%s,>>=",rd);
op->type = R_ANAL_OP_TYPE_LOAD;
break;
case lwi:
r_strbuf_appendf (&op->esil, "%s,_imm,+,[4],%s,=", ra, rd);
op->type = R_ANAL_OP_TYPE_LOAD;
break;
default:
break;
}
// Reset _immf to zero even if not used.
r_strbuf_appendf (&op->esil, ",0,_immf,=");
r_strbuf_appendf (&op->esil, ",0,_imm,=");
}
static void analyse_memory_load_inst(struct mb_anal_ctx *ctx, unsigned long insn, struct op_code_struct *mb_op) {
RAnalOp *op = ctx->op;
char *ra = get_field_r1 (insn);
char *rb = get_field_r2 (insn);
char *rd = get_field_rd (insn);
char *imm = get_imm (ctx, insn);
switch (mb_op->instr) {
case lbu:
r_strbuf_setf (&op->esil, "%s,%s,[],+,%s,=", ra, rb, rd);
@@ -893,18 +962,37 @@ static void analyse_memory_load_inst(struct mb_anal_ctx *ctx, unsigned long insn
r_strbuf_setf (&op->esil, "%s,%s,[],+,%s,=", ra, rb, rd);
op->type = R_ANAL_OP_TYPE_LOAD;
break;
case lbui:
r_strbuf_setf (&op->esil, "%s,%s,_imm,|,+,[1],%s,=", ra, imm, rd);
op->type = R_ANAL_OP_TYPE_LOAD;
default:
break;
case lhui:
r_strbuf_setf (&op->esil, "%s,%s,_imm,|,+,[4],%s,=", ra, imm, rd);
r_strbuf_appendf (&op->esil, ",16,%s,>>=",rd);
op->type = R_ANAL_OP_TYPE_LOAD;
}
// Reset _immf to zero even if not used.
r_strbuf_appendf (&op->esil, ",0,_immf,=");
r_strbuf_appendf (&op->esil, ",0,_imm,=");
}
static void analyse_memory_store_inst_imm(struct mb_anal_ctx *ctx, unsigned long insn, struct op_code_struct *mb_op) {
RAnalOp *op = ctx->op;
char *ra = get_field_r1 (insn);
char *rd = get_field_rd (insn);
char *imm = get_imm (ctx, insn);
r_strbuf_setf (&op->esil, "1,_immf,==,$z,?{,%s,%u,&,_imm,|,_imm,=,},", imm, UT16_MAX);
r_strbuf_appendf (&op->esil, "0,_immf,==,$z,?{,%s,_imm,=,},", imm);
switch (mb_op->instr) {
case sbi:
/* Only store least significant byte */
r_strbuf_appendf (&op->esil, "%s,%s,_imm,+,=[1]", rd, ra);
op->type = R_ANAL_OP_TYPE_STORE;
break;
case lwi:
r_strbuf_setf (&op->esil, "%s,%s,_imm,|,+,[4],%s,=", ra, imm, rd);
op->type = R_ANAL_OP_TYPE_LOAD;
case shi:
/* Only store least significant halword */
r_strbuf_appendf (&op->esil, "%s,%s,_imm,+,=[2]", rd, ra);
op->type = R_ANAL_OP_TYPE_STORE;
break;
case swi:
r_strbuf_appendf (&op->esil, "%s,%s,_imm,+,=[]", rd, ra);
op->type = R_ANAL_OP_TYPE_STORE;
break;
default:
break;
@@ -919,7 +1007,7 @@ static void analyse_memory_store_inst(struct mb_anal_ctx *ctx, unsigned long ins
char *ra = get_field_r1 (insn);
char *rb = get_field_r2 (insn);
char *rd = get_field_rd (insn);
char *imm = get_imm (ctx, insn);
switch (mb_op->instr) {
case sb:
r_strbuf_setf (&op->esil, "%s,%s,%s,+,=[1]", rd, ra, rb);
@@ -951,20 +1039,6 @@ static void analyse_memory_store_inst(struct mb_anal_ctx *ctx, unsigned long ins
r_strbuf_setf (&op->esil, "%s,%s,+,%s,=[]", rd, ra, rb);
op->type = R_ANAL_OP_TYPE_STORE;
break;
case sbi:
/* Only store least significant byte */
r_strbuf_setf (&op->esil, ",%s,%s,%s,_imm,|,+,=[1]", rd, ra, imm);
op->type = R_ANAL_OP_TYPE_STORE;
break;
case shi:
/* Only store least significant halword */
r_strbuf_setf (&op->esil, ",%s,%s,%s,_imm,|,+,=[2]", rd, ra, imm);
op->type = R_ANAL_OP_TYPE_STORE;
break;
case swi:
r_strbuf_setf (&op->esil, "%s,%s,%s,_imm,|,+,=[]", rd, ra, imm);
op->type = R_ANAL_OP_TYPE_STORE;
break;
default:
break;
}
@@ -975,23 +1049,34 @@ static void analyse_memory_store_inst(struct mb_anal_ctx *ctx, unsigned long ins
static void analyse_barrel_shift_inst(struct mb_anal_ctx *ctx, unsigned long insn, struct op_code_struct *mb_op) {
RAnalOp *op = ctx->op;
char *ra = get_field_r1 (insn);
char *rb = get_field_r2 (insn);
char *rd = get_field_rd (insn);
char *imm5 = get_field_imm5 (insn);
switch (mb_op->instr) {
case bsll:
r_strbuf_setf (&op->esil, ",%s,%s,<<,%s,=", rb, ra, rd);
op->type = R_ANAL_OP_TYPE_SHL;
break;
case bsra:
r_strbuf_setf (&op->esil, ",%s,%s,>>>>,%s,=", rb, ra, rd);
op->type = R_ANAL_OP_TYPE_SAR;
break;
case bsrl:
r_strbuf_setf (&op->esil, ",%s,%s,>>,%s,=", rb, ra, rd);
op->type = R_ANAL_OP_TYPE_SHR;
break;
case bslli:
r_strbuf_setf (&op->esil, ",%s,%s,<<,%s,=", imm5, ra, rd);
op->type = R_ANAL_OP_TYPE_SHL;
break;
case bsrai:
r_strbuf_setf (&op->esil, ",%s,%s,>>>>,%s,=", imm5, ra, rd);
op->type = R_ANAL_OP_TYPE_SAR;
break;
case bsrli:
r_strbuf_setf (&op->esil, ",%s,%s,>>,%s,=", imm5, ra, rd);
op->type = R_ANAL_OP_TYPE_SHR;
break;
default:
@@ -999,10 +1084,11 @@ static void analyse_barrel_shift_inst(struct mb_anal_ctx *ctx, unsigned long ins
}
// Reset _immf to zero even if not used.
r_strbuf_appendf (&op->esil, ",0,_immf,=");
r_strbuf_appendf (&op->esil, ",0,_imm,=");
}
static int microblaze_op(RAnal *a, RAnalOp *op, ut64 addr, const ut8 *buf, int len) {
static int microblaze_op(RAnal *a, RAnalOp *op, ut64 addr, const ut8 *buf, int len, RAnalOpMask mask) {
int oplen = 4;
static struct mb_anal_ctx ctx;
static bool first_time = true;
@@ -1055,6 +1141,9 @@ static int microblaze_op(RAnal *a, RAnalOp *op, ut64 addr, const ut8 *buf, int l
op->type = R_ANAL_OP_TYPE_ILL;
return oplen;
}
if (mask & R_ANAL_OP_MASK_DISASM) {
op->mnemonic = strdup (mb_op->name);
}
r_strbuf_setf (&op->esil, "");
handle_immediate_inst (&ctx, insn, mb_op);
@@ -1072,6 +1161,9 @@ static int microblaze_op(RAnal *a, RAnalOp *op, ut64 addr, const ut8 *buf, int l
case logical_inst:
analyse_logical_inst (&ctx, insn, mb_op);
break;
case logical_inst_imm:
analyse_logical_inst_imm (&ctx, insn, mb_op);
break;
case mult_inst:
analyse_mult_inst (&ctx, insn, mb_op);
break;
@@ -1093,9 +1185,15 @@ static int microblaze_op(RAnal *a, RAnalOp *op, ut64 addr, const ut8 *buf, int l
case memory_load_inst:
analyse_memory_load_inst (&ctx, insn, mb_op);
break;
case memory_load_inst_imm:
analyse_memory_load_inst_imm (&ctx, insn, mb_op);
break;
case memory_store_inst:
analyse_memory_store_inst (&ctx, insn, mb_op);
break;
case memory_store_inst_imm:
analyse_memory_store_inst_imm (&ctx, insn, mb_op);
break;
case barrel_shift_inst:
analyse_barrel_shift_inst (&ctx, insn, mb_op);
break;
@@ -1125,7 +1223,7 @@ static int microblaze_set_reg_profile(RAnal* anal) {
"=A6 r10\n"
"=R0 r3\n"
"=R1 r4\n"
"gpr r0 .32 0 0\n"
"gpr r0 .32 ? 0\n"
"gpr r1 .32 4 0\n"
"gpr r2 .32 8 0\n"
"gpr r3 .32 12 0\n"
@@ -1159,7 +1257,7 @@ static int microblaze_set_reg_profile(RAnal* anal) {
"gpr r31 .32 124 0\n"
"gpr pc .32 128 0\n"
"gpr msr .32 132 0\n" /* machine status register */
"gpr c .1 132.29 0\n" /* arithmetic carry */
"gpr c .1 132.2 0\n" /* arithmetic carry */
"gpr ear .32 136 0\n" /* exception address register */
"gpr esr .32 140 0\n" /* exception status register */
"gpr btr .32 144 0\n" /* branch target register */
+10 -10
View File
@@ -199,10 +199,10 @@ static struct op_code_struct
{"bgtd", INST_TYPE_R1_R2, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x9E800000, OPCODE_MASK_H14, bgtd, branch_inst },
{"bge", INST_TYPE_R1_R2, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x9CA00000, OPCODE_MASK_H14, bge, branch_inst },
{"bged", INST_TYPE_R1_R2, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x9EA00000, OPCODE_MASK_H14, bged, branch_inst },
{"ori", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xA0000000, OPCODE_MASK_H, ori, logical_inst },
{"andi", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xA4000000, OPCODE_MASK_H, andi, logical_inst },
{"xori", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xA8000000, OPCODE_MASK_H, xori, logical_inst },
{"andni", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xAC000000, OPCODE_MASK_H, andni, logical_inst },
{"ori", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xA0000000, OPCODE_MASK_H, ori, logical_inst_imm },
{"andi", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xA4000000, OPCODE_MASK_H, andi, logical_inst_imm },
{"xori", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xA8000000, OPCODE_MASK_H, xori, logical_inst_imm },
{"andni", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xAC000000, OPCODE_MASK_H, andni, logical_inst_imm },
{"imm", INST_TYPE_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB0000000, OPCODE_MASK_H12, imm, immediate_inst },
{"rtsd", INST_TYPE_R1_IMM, INST_NO_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB6000000, OPCODE_MASK_H1, rtsd, return_inst },
{"rtid", INST_TYPE_R1_IMM, INST_NO_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB6200000, OPCODE_MASK_H1, rtid, return_inst },
@@ -241,12 +241,12 @@ static struct op_code_struct
{"sw", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xD8000000, OPCODE_MASK_H4, sw, memory_store_inst },
{"swr", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xD8000200, OPCODE_MASK_H4, swr, memory_store_inst },
{"swx", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xD8000400, OPCODE_MASK_H4, swx, memory_store_inst },
{"lbui", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xE0000000, OPCODE_MASK_H, lbui, memory_load_inst },
{"lhui", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xE4000000, OPCODE_MASK_H, lhui, memory_load_inst },
{"lwi", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xE8000000, OPCODE_MASK_H, lwi, memory_load_inst },
{"sbi", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xF0000000, OPCODE_MASK_H, sbi, memory_store_inst },
{"shi", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xF4000000, OPCODE_MASK_H, shi, memory_store_inst },
{"swi", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xF8000000, OPCODE_MASK_H, swi, memory_store_inst },
{"lbui", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xE0000000, OPCODE_MASK_H, lbui, memory_load_inst_imm },
{"lhui", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xE4000000, OPCODE_MASK_H, lhui, memory_load_inst_imm },
{"lwi", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xE8000000, OPCODE_MASK_H, lwi, memory_load_inst_imm },
{"sbi", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xF0000000, OPCODE_MASK_H, sbi, memory_store_inst_imm },
{"shi", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xF4000000, OPCODE_MASK_H, shi, memory_store_inst_imm },
{"swi", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xF8000000, OPCODE_MASK_H, swi, memory_store_inst_imm },
{"nop", INST_TYPE_NONE, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x80000000, OPCODE_MASK_H1234, invalid_inst, logical_inst }, /* translates to or r0, r0, r0. */
{"la", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x30000000, OPCODE_MASK_H, invalid_inst, arithmetic_inst }, /* la translates to addik. */
{"tuqula",INST_TYPE_RD, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x3000002A, OPCODE_MASK_H, invalid_inst, arithmetic_inst }, /* tuqula rd translates to addik rd, r0, 42. */
@@ -61,9 +61,10 @@ enum microblaze_instr
enum microblaze_instr_type
{
arithmetic_inst, arithmetic_inst_imm, logical_inst, mult_inst, div_inst, branch_inst,
branch_inst_imm, return_inst, immediate_inst, special_inst, memory_load_inst,
memory_store_inst, barrel_shift_inst, anyware_inst
arithmetic_inst, arithmetic_inst_imm, logical_inst, logical_inst_imm,
mult_inst, div_inst, branch_inst, branch_inst_imm, return_inst,
immediate_inst, special_inst, memory_load_inst, memory_load_inst_imm,
memory_store_inst, memory_store_inst_imm, barrel_shift_inst, anyware_inst
};
#define INST_WORD_SIZE 4
+13
View File
@@ -0,0 +1,13 @@
BINDIR=$(shell r2pm -H R2PM_BINDIR)
all: cmsis-svd
cmsis-svd:
git clone https://github.com/posborne/cmsis-svd
install:
cp -f r2svd.py $(BINDIR)/r2svd
chmod +x $(BINDIR)/r2svd
uninstall:
rm -f $(BINDIR)/r2svd.py
+44
View File
@@ -0,0 +1,44 @@
SVD loader for r2
=================
https://github.com/radareorg/radare2/issues/15484
https://raw.githubusercontent.com/posborne/cmsis-svd/master/data/Atmel/AT91SAM9CN11.svd
Installation:
-------------
```
$ r2pm -i r2svd
```
or just `make install` in this directory
Usage:
------
```
$ r2 -m 0x400000 firmware.fw
> !r2svd
TexasInstruments
Nordic
NXP
Cypress
Fujitsu
Toshiba
Spansion
ARM_SAMPLE
Nuvoton
Freescale
Holtek
SiliconLabs
SiFive-Community
STMicro
Atmel
> !r2svd Holtek
ht32f125x.svd
ht32f175x.svd
ht32f275x.svd
> .!r2svd Holtek ht32f125x.svd
```
+49
View File
@@ -0,0 +1,49 @@
#!/usr/bin/env python3
# use cmsis-svd python api to load the SVD peripheral and memory layout into r2
# --pancake @ 2020
import json
import sys
import math
import pkg_resources
from cmsis_svd.parser import SVDParser
argc = len(sys.argv)
if argc != 3:
try:
if argc == 1:
vendors = pkg_resources.resource_listdir("cmsis_svd", "data")
print('\n'.join(vendors))
elif argc == 2:
svds = pkg_resources.resource_listdir("cmsis_svd", "data/%s"%(sys.argv[1]))
print('\n'.join(svds))
else:
raise Exception('')
except:
print('Usage: .!r2svd [mcu] [svd]')
sys.exit(1)
sys.exit(0)
mcu = sys.argv[1] # Freescale
svd = sys.argv[2] # MK20D7.svd
parser = SVDParser.for_packaged_svd(mcu, svd)
svd_dict = parser.get_device().to_dict()
for p in svd_dict['peripherals']:
addr = p['base_address']
size = p['address_block']['size'] / 8
print("CC %s @ 0x%x"%(p['description'], addr))
print("f %s %d 0x%x"%(p['name'], size, addr))
s = ""
for r in p['registers']:
offs = int(r['address_offset'])
at = int(addr) + math.floor(offs / 8)
bt = (offs % 8)
s += " " + r['name']
if at != addr:
print("f %s.%s %d 0x%x"%(p['name'], r['name'], size, at))
# print(" 0x%x %d %s"%(at, bt, r['name']))
print("CC (%s) @ 0x%x"%(s, addr))
# print(json.dumps(svd_dict, sort_keys=True, indent=4, separators=(',', ': ')))
+4 -4
View File
@@ -1,5 +1,5 @@
#!/bin/sh
# This script was automatically generated by ACR v1.7.2
# This script was automatically generated by ACR v1.8.1
# @author: pancake <nopcode.org>
# @url: http://www.nopcode.org
# @repo: git clone https://github.com/radare/acr
@@ -103,7 +103,7 @@ done
: ${INSTALL_PROGRAM_STRIP:=${INSTALL} -m 755 -s}
: ${INSTALL_MAN:=${INSTALL} -m 444}
: ${INSTALL_LIB:=${INSTALL} -m 755 -c}
PKGNAME='radare2-extras-ssdeep' ; VERSION='1.0' ;
PKGNAME='radare2-extras-ssdeep' ; VERSION='1.0' ; VERSION_MAJOR=1; VERSION_MINOR=0; VERSION_PATCH=0; VERSION_NUMBER=10000;
}
show_usage() {
@@ -171,7 +171,7 @@ take_environ() {
}
show_version() {
echo "radare2-extras-ssdeep-1.0 configuration script done with acr v1.7.2.
echo "radare2-extras-ssdeep-1.0 configuration script done with acr v1.8.1.
The 'Free Software Foundation' message is only for autodetection.
Originally written by pancake <nopcode.org>."
exit 0
@@ -261,7 +261,7 @@ parse_options "$1"
shift
done
ENVWORDS="MANDIR INFODIR LIBDIR INCLUDEDIR LOCALSTATEDIR SYSCONFDIR DATADIR DOCDIR LIBEXECDIR SBINDIR BINDIR EPREFIX PREFIX SPREFIX TARGET HOST BUILD INSTALL INSTALL_LIB INSTALL_MAN INSTALL_PROGRAM INSTALL_PROGRAM_STRIP INSTALL_DIR INSTALL_SCRIPT INSTALL_DATA HOST_OS HOST_CPU BUILD_OS BUILD_CPU TARGET_OS TARGET_CPU PKGNAME VPATH VERSION CC CFLAGS CPPFLAGS LDFLAGS HAVE_LANG_C HAVE_LIB_FUZZY SD_CFLAGS SD_LDFLAGS HAVE_PKGCFG_SSDEEP R2_CFLAGS R2_LDFLAGS HAVE_PKGCFG_R_CORE"
ENVWORDS="MANDIR INFODIR LIBDIR INCLUDEDIR LOCALSTATEDIR SYSCONFDIR DATADIR DOCDIR LIBEXECDIR SBINDIR BINDIR EPREFIX PREFIX SPREFIX TARGET HOST BUILD INSTALL INSTALL_LIB INSTALL_MAN INSTALL_PROGRAM INSTALL_PROGRAM_STRIP INSTALL_DIR INSTALL_SCRIPT INSTALL_DATA HOST_OS HOST_CPU BUILD_OS BUILD_CPU TARGET_OS TARGET_CPU VERSION VERSION_MAJOR VERSION_MINOR VERSION_PATCH VERSION_NUMBER PKGNAME VPATH CC CFLAGS CPPFLAGS LDFLAGS HAVE_LANG_C HAVE_LIB_FUZZY SD_CFLAGS SD_LDFLAGS HAVE_PKGCFG_SSDEEP R2_CFLAGS R2_LDFLAGS HAVE_PKGCFG_R_CORE"
create_environ
+4 -4
View File
@@ -1,5 +1,5 @@
#!/bin/sh
# This script was automatically generated by ACR v1.7.2
# This script was automatically generated by ACR v1.8.1
# @author: pancake <nopcode.org>
# @url: http://www.nopcode.org
# @repo: git clone https://github.com/radare/acr
@@ -103,7 +103,7 @@ done
: ${INSTALL_PROGRAM_STRIP:=${INSTALL} -m 755 -s}
: ${INSTALL_MAN:=${INSTALL} -m 444}
: ${INSTALL_LIB:=${INSTALL} -m 755 -c}
PKGNAME='radare2-extras-yara' ; VERSION='1.0' ; CONTACT_MAIL="[email protected]" ; CONTACT_NAME="jfrankowski" ; CONTACT="jfrankowski <[email protected]>" ;
PKGNAME='radare2-extras-yara' ; VERSION='1.0' ; VERSION_MAJOR=1; VERSION_MINOR=0; VERSION_PATCH=0; VERSION_NUMBER=10000; CONTACT_MAIL="[email protected]" ; CONTACT_NAME="jfrankowski" ; CONTACT="jfrankowski <[email protected]>" ;
}
show_usage() {
@@ -173,7 +173,7 @@ take_environ() {
}
show_version() {
echo "radare2-extras-yara-1.0 configuration script done with acr v1.7.2.
echo "radare2-extras-yara-1.0 configuration script done with acr v1.8.1.
The 'Free Software Foundation' message is only for autodetection.
Originally written by pancake <nopcode.org>."
exit 0
@@ -263,7 +263,7 @@ parse_options "$1"
shift
done
ENVWORDS="MANDIR INFODIR LIBDIR INCLUDEDIR LOCALSTATEDIR SYSCONFDIR DATADIR DOCDIR LIBEXECDIR SBINDIR BINDIR EPREFIX PREFIX SPREFIX TARGET HOST BUILD INSTALL INSTALL_LIB INSTALL_MAN INSTALL_PROGRAM INSTALL_PROGRAM_STRIP INSTALL_DIR INSTALL_SCRIPT INSTALL_DATA HOST_OS HOST_CPU BUILD_OS BUILD_CPU TARGET_OS TARGET_CPU PKGNAME VPATH VERSION CONTACT CONTACT_NAME CONTACT_MAIL CC CFLAGS CPPFLAGS LDFLAGS HAVE_LANG_C HAVE_LIB_YARA YR_CFLAGS YR_LDFLAGS HAVE_PKGCFG_YARA R2_CFLAGS R2_LDFLAGS HAVE_PKGCFG_R_CORE"
ENVWORDS="MANDIR INFODIR LIBDIR INCLUDEDIR LOCALSTATEDIR SYSCONFDIR DATADIR DOCDIR LIBEXECDIR SBINDIR BINDIR EPREFIX PREFIX SPREFIX TARGET HOST BUILD INSTALL INSTALL_LIB INSTALL_MAN INSTALL_PROGRAM INSTALL_PROGRAM_STRIP INSTALL_DIR INSTALL_SCRIPT INSTALL_DATA HOST_OS HOST_CPU BUILD_OS BUILD_CPU TARGET_OS TARGET_CPU VERSION VERSION_MAJOR VERSION_MINOR VERSION_PATCH VERSION_NUMBER PKGNAME VPATH CONTACT CONTACT_NAME CONTACT_MAIL CC CFLAGS CPPFLAGS LDFLAGS HAVE_LANG_C HAVE_LIB_YARA YR_CFLAGS YR_LDFLAGS HAVE_PKGCFG_YARA R2_CFLAGS R2_LDFLAGS HAVE_PKGCFG_R_CORE"
create_environ
+39 -7
View File
@@ -13,6 +13,8 @@
// true if the plugin has been initialized.
static int initialized = false;
static bool print_strings = 0;
static int callback(int message, void* rule, void* data);
static int r_cmd_yara_add (const RCore* core, const char* input);
static int r_cmd_yara_add_file (const char* rules_path);
@@ -21,7 +23,7 @@ static int r_cmd_yara_clear();
static int r_cmd_yara_init(void *user, const char *cmd);
static int r_cmd_yara_help(const RCore* core);
static int r_cmd_yara_process(const RCore* core, const char* input);
static int r_cmd_yara_scan(const RCore* core);
static int r_cmd_yara_scan(const RCore* core, const char* option);
static int r_cmd_yara_load_default_rules (const RCore* core);
static const char* yara_rule_template = "rule RULE_NAME {\n\tstrings:\n\n\tcondition:\n}";
@@ -33,9 +35,27 @@ static const char* yara_rule_template = "rule RULE_NAME {\n\tstrings:\n\n\tcondi
static RList* rules_list;
static int callback (int message, void *msg_data, void *user_data) {
RPrint *print = (RPrint *)user_data;
YR_RULE* rule = msg_data;
if (message == CALLBACK_MSG_RULE_MATCHING)
r_cons_printf ("%s\n", rule->identifier);
{
YR_STRING* string;
r_cons_printf("%s\n", rule->identifier);
if (print_strings) {
yr_rule_strings_foreach(rule, string)
{
YR_MATCH* match;
yr_string_matches_foreach(string, match)
{
r_cons_printf("0x%08" PRIx64 ": %s : ", match->base + match->offset, string->identifier);
r_print_bytes(print, match->data, match->data_length, "%02x ");
}
}
}
}
return CALLBACK_CONTINUE;
}
@@ -45,7 +65,7 @@ static void compiler_callback(int error_level, const char* file_name,
return;
}
static int r_cmd_yara_scan(const RCore* core) {
static int r_cmd_yara_scan(const RCore* core, const char* option) {
RListIter* rules_it;
YR_RULES* rules;
void* to_scan;
@@ -57,6 +77,18 @@ static int r_cmd_yara_scan(const RCore* core) {
return false;
}
if( *option == '\0') {
print_strings = 0;
}
else if (*option == 'S') {
print_strings = 1;
}
else {
print_strings = 0;
eprintf ("Invalid option\n");
return false;
}
to_scan = malloc (to_scan_size);
if (!to_scan) {
eprintf ("Something went wrong during memory allocation\n");
@@ -71,7 +103,7 @@ static int r_cmd_yara_scan(const RCore* core) {
}
r_list_foreach (rules_list, rules_it, rules) {
yr_rules_scan_mem (rules, to_scan, to_scan_size, 0, callback, NULL, 0);
yr_rules_scan_mem (rules, to_scan, to_scan_size, 0, callback, core->print, 0);
}
free (to_scan);
@@ -136,7 +168,7 @@ static int r_cmd_yara_tag (const char * search_tag) {
r_list_foreach (rules_list, rules_it, rules) {
yr_rules_foreach (rules, rule) {
yr_rule_tags_foreach(rule, tag_name) {
yr_rule_tags_foreach(rule, tag_name) {eprintf ("Invalid option\n");
if (r_str_casestr (tag_name, search_tag)) {
r_cons_printf("%s\n", rule->identifier);
break;
@@ -296,7 +328,7 @@ static int r_cmd_yara_help(const RCore* core) {
"clear", "", "Clear all rules",
"help", "", "Show this help",
"list", "", "List all rules",
"scan", "", "Scan the current file",
"scan", "[S]", "Scan the current file, if S option is given it prints matching strings.",
"show", " name", "Show rules containing name",
"tag", " name", "List rules with tag 'name'",
"tags", "", "List tags from the loaded rules",
@@ -316,7 +348,7 @@ static int r_cmd_yara_process(const RCore* core, const char* input) {
else if (!strncmp (input, "list", 4))
return r_cmd_yara_list ();
else if (!strncmp (input, "scan", 4))
return r_cmd_yara_scan (core);
return r_cmd_yara_scan (core, input + 4);
else if (!strncmp (input, "show", 4))
return r_cmd_yara_show (input + 5);
else if (!strncmp (input, "tags", 4))