#ifndef RZ_EGG_H #define RZ_EGG_H #include #include #include #include #ifdef __cplusplus extern "C" { #endif RZ_LIB_VERSION_HEADER(rz_egg); #define RZ_EGG_INCDIR_ENV "EGG_INCDIR" #define RZ_EGG_INCDIR_PATH "/lib/rizin/" RZ_VERSION "/egg" // rename to RzEggShellcode #define RZ_EGG_PLUGIN_SHELLCODE 0 #define RZ_EGG_PLUGIN_ENCODER 1 typedef struct rz_egg_plugin_t { const char *name; const char *desc; int type; RzBuffer *(*build)(void *egg); } RzEggPlugin; typedef struct rz_egg_lang_t { int pushargs; int nalias; int nsyscalls; char *conditionstr; char *syscallbody; char *includefile; char *setenviron; char *mathline; // used for confusing mathop int commentmode; int varsize; int varxs; int lastctxdelta; int nargs; int docall; int nfunctions; int nbrackets; int slurpin; int slurp; int line; char elem[1024]; int attsyntax; int elem_n; char *callname; char *endframe; char *ctxpush[32]; char *file; char *dstvar; char *dstval; char *includedir; char *ifelse_table[32][32]; // used to solve if-else problem in a not so ugly way int ndstval; int skipline; // BOOL int quoteline; int quotelinevar; int stackframe; int stackfixed; int oc; int mode; int inlinectr; struct { char *name; char *body; // int fastcall; /* TODO: NOT YET USED */ } inlines[256]; int ninlines; struct { char *name; char *arg; } syscalls[256]; struct { char *name; char *content; } aliases[256]; char *nested[32]; char *nested_callname[32]; // char *nestede[32] = {0}; // seems nestede are not used any more // (only one place that gives nestede[] value, where could be replaced) int nestedi[32]; } RzEggLang; typedef struct rz_egg_t { RzBuffer *src; RzBuffer *buf; RzBuffer *bin; // RzList *shellcodes; // XXX is plugins nao? RzAsm *rasm; RzSyscall *syscall; RzEggLang lang; Sdb *db; RzList /**/ *plugins; RzList /**/ *patches; // struct rz_egg_emit_t *remit; int arch; int endian; int bits; ut32 os; int context; } RzEgg; /* XXX: this may fail in different arches */ #if 0 rizin -q - <plugins RZ_API void rz_egg_option_set(RzEgg *egg, const char *k, const char *v); RZ_API char *rz_egg_option_get(RzEgg *egg, const char *k); RZ_API void rz_egg_if(RzEgg *egg, const char *reg, char cmp, int v); RZ_API void rz_egg_printf(RzEgg *egg, const char *fmt, ...) RZ_PRINTF_CHECK(2, 3); RZ_API int rz_egg_compile(RzEgg *egg); RZ_API int rz_egg_padding(RzEgg *egg, const char *pad); RZ_API bool rz_egg_assemble(RzEgg *egg); RZ_API bool rz_egg_assemble_asm(RzEgg *egg, char **asm_list); RZ_API void rz_egg_pattern(RzEgg *egg, int size); // RZ_API int rz_egg_dump (RzEgg *egg, const char *file) { } RZ_API char *rz_egg_get_source(RzEgg *egg); RZ_API RzBuffer *rz_egg_get_bin(RzEgg *egg); RZ_API char *rz_egg_get_assembly(RzEgg *egg); RZ_API void rz_egg_append(RzEgg *egg, const char *src); RZ_API int rz_egg_run(RzEgg *egg); RZ_API int rz_egg_run_rop(RzEgg *egg); RZ_API int rz_egg_patch(RzEgg *egg, int off, const ut8 *b, int l); RZ_API bool rz_egg_patch_num(RzEgg *egg, int off, ut64 val, ut32 bits); RZ_API void rz_egg_finalize(RzEgg *egg); /* rz_egg_Cfile.c */ RZ_API char *rz_egg_Cfile_parser(const char *file, const char *arch, const char *os, int bits); /* lang.c */ RZ_API char *rz_egg_mkvar(RzEgg *egg, char *out, const char *_str, int delta); RZ_API int rz_egg_lang_parsechar(RzEgg *egg, char c); RZ_API void rz_egg_lang_include_path(RzEgg *egg, const char *path); RZ_API void rz_egg_lang_include_init(RzEgg *egg); /* plugin pointers */ extern RzEggPlugin rz_egg_plugin_xor; extern RzEggPlugin rz_egg_plugin_shya; extern RzEggPlugin rz_egg_plugin_exec; #endif #ifdef __cplusplus } #endif #endif