Add opt-in Zydis x86 arch plugin ##arch

* Disable Zydis in Fil-C builds ##ci
* Link bundled Zydis in static builds ##ci
* Keep Capstone as default x86 plugin
This commit is contained in:
potato 2026-05-07 12:14:34 +05:30 committed by GitHub
parent ad6f48b46c
commit da408b47c7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
46 changed files with 70769 additions and 14 deletions

View file

@ -44,6 +44,9 @@ LINK+=$(SHLR)/../subprojects/otezip/libotezip.a
endif
LINK+=$(SHLR)/gdb/lib/libgdbr.a
LINK+=$(CS_LDFLAGS)
ifneq ($(filter p/x86_zydis.mk,$(STATIC_ARCH_PLUGINS)),)
LINK+=$(ZYDIS_LDFLAGS)
endif
LINK+=$(SHLR)/../subprojects/sdb/src/libsdb.a
# instead of libr.a
@ -72,11 +75,17 @@ else ifeq (${COMPILER},wasm)
LINK+=$(SHLR)/libr_shlr.a
LINK+=$(SHLR)/../subprojects/sdb/src/libsdb.a
LINK+=$(CS_LDFLAGS)
ifneq ($(filter p/x86_zydis.mk,$(STATIC_ARCH_PLUGINS)),)
LINK+=$(ZYDIS_LDFLAGS)
endif
EXT_EXE=.wasm
else ifeq (${COMPILER},emscripten)
LINK+=$(SHLR)/libr_shlr.a
LINK+=$(SHLR)/../subprojects/sdb/src/libsdb.a
LINK+=$(CS_LDFLAGS)
ifneq ($(filter p/x86_zydis.mk,$(STATIC_ARCH_PLUGINS)),)
LINK+=$(ZYDIS_LDFLAGS)
endif
CFLAGS+= -s SIDE_MODULE=1
#CFLAGS+=-s ERROR_ON_UNDEFINED_SYMBOLS=0
#EXT_EXE=.js

View file

@ -26,6 +26,7 @@ HAVE_FORK=@HAVE_FORK@
WANT_QJS=@WANT_QJS@
WANT_DYLINK=@WANT_DYLINK@
WANT_CAPSTONE=@WANT_CAPSTONE@
WANT_ZYDIS=@WANT_ZYDIS@
WITH_STATIC_THEMES=@WITH_STATIC_THEMES@
WITH_LIBR=@WITH_LIBR@
@ -96,6 +97,22 @@ CAPSTONE_CFLAGS=
CAPSTONE_LDFLAGS=
endif
# zydis
ifeq ($(WANT_ZYDIS),1)
USE_ZYDIS=@USE_ZYDIS@
USE_SYS_ZYDIS=@USE_SYS_ZYDIS@
else
USE_ZYDIS=0
USE_SYS_ZYDIS=0
endif
ifeq ($(USE_ZYDIS),1)
CONFIG_ZYDIS_CFLAGS=@ZYDIS_CFLAGS@
CONFIG_ZYDIS_LDFLAGS=@ZYDIS_LDFLAGS@
else
CONFIG_ZYDIS_CFLAGS=
CONFIG_ZYDIS_LDFLAGS=
endif
HAVE_LIB_GMP=@HAVE_LIB_GMP@
HAVE_LIB_SSL=@HAVE_OPENSSL@
WANT_SSL_CRYPTO=@WANT_SSL_CRYPTO@

48
configure vendored
View file

@ -30,6 +30,7 @@ HAVE_FORK=1
WANT_PTRACE_WRAP=1
WANT_GPERF=1
WANT_CAPSTONE=1
WANT_ZYDIS=1
WITH_LIBR=0
WITH_STATIC_THEMES=0
USE_CSNEXT=0
@ -37,6 +38,8 @@ USE_CS5=0
USE_CS4=0
WITH_CAPSTONE=0
WITHOUT_SYSCAPSTONE=1
WITH_ZYDIS=0
WITHOUT_SYSZYDIS=1
WITH_SQSH=1
WITH_SYSLZ4=0
WANT_ZIP=1
@ -225,6 +228,7 @@ Optional Features:
--without-ptrace-wrap build ptrace-wrap support needed for the iaito debugger on Linux
--without-gperf do not statically link the sdb databases even if gperf is found
--without-capstone dont build the capstone dependency
--without-zydis dont build the zydis dependency
--with-libr build libr.a and libr.dylib
--with-static-themes default themes are compiled and fallback if not available on disk
--with-capstone-next build next branch of the capstone disassembler
@ -232,6 +236,8 @@ Optional Features:
--with-capstone4 build v4 branch of capstone
--with-syscapstone force to use system-wide capstone
--without-syscapstone avoid the system-wide capstone
--with-syszydis force to use system-wide zydis
--without-syszydis avoid the system-wide zydis
--without-sqsh ensure squashfs support is not included, even if library is found
--with-syslz4 force to use system's liblz4
--without-zip build without the ZIP/ZLIB support
@ -326,8 +332,8 @@ echo "DESCRIPTION: The UNIX-like reverse engineering toolkit"
echo "LANGS: c"
echo "REQUIRED: libdl"
echo "OPTIONAL: libatomic libmagic libz libzip libxxhash libssl liblibuv>=1.0.0"
echo "PKGCONFIG: capstone libsqsh liblz4 openssl libuv"
echo "FLAGS: --disable-debugger --with-libatomic --with-sysmagic --disable-threads --disable-loadlibs --enable-threadsafety --without-qjs --without-dylink --without-fork --without-ptrace-wrap --without-gperf --without-capstone --with-libr --with-static-themes --with-capstone-next --with-capstone5 --with-capstone4 --with-syscapstone --without-syscapstone --without-sqsh --with-syslz4 --without-zip --with-syszip --with-sysxxhash --without-gpl --with-ssl --with-ssl-crypto --with-libuv --with-v35 --with-wasm-browser --with-rpath --with-bundle-prefix --with-compiler=gcc --with-ostype=auto --with-libversion=xxx --without-jemalloc --with-checks-level=2 --disable-debug-stuff"
echo "PKGCONFIG: capstone zydis libsqsh liblz4 openssl libuv"
echo "FLAGS: --disable-debugger --with-libatomic --with-sysmagic --disable-threads --disable-loadlibs --enable-threadsafety --without-qjs --without-dylink --without-fork --without-ptrace-wrap --without-gperf --without-capstone --without-zydis --with-libr --with-static-themes --with-capstone-next --with-capstone5 --with-capstone4 --with-syscapstone --without-syscapstone --with-syszydis --without-syszydis --without-sqsh --with-syslz4 --without-zip --with-syszip --with-sysxxhash --without-gpl --with-ssl --with-ssl-crypto --with-libuv --with-v35 --with-wasm-browser --with-rpath --with-bundle-prefix --with-compiler=gcc --with-ostype=auto --with-libversion=xxx --without-jemalloc --with-checks-level=2 --disable-debug-stuff"
exit 0
;;
--cache-file)
@ -391,6 +397,7 @@ echo "FLAGS: --disable-debugger --with-libatomic --with-sysmagic --disable
"--without-ptrace-wrap") WANT_PTRACE_WRAP="0"; ;;
"--without-gperf") WANT_GPERF="0"; ;;
"--without-capstone") WANT_CAPSTONE="0"; ;;
"--without-zydis") WANT_ZYDIS="0"; ;;
"--with-libr") WITH_LIBR="1"; ;;
"--with-static-themes") WITH_STATIC_THEMES="1"; ;;
"--with-capstone-next") USE_CSNEXT="1"; ;;
@ -398,6 +405,8 @@ echo "FLAGS: --disable-debugger --with-libatomic --with-sysmagic --disable
"--with-capstone4") USE_CS4="1"; ;;
"--with-syscapstone") WITH_CAPSTONE="1"; ;;
"--without-syscapstone") WITHOUT_SYSCAPSTONE="0"; ;;
"--with-syszydis") WITH_ZYDIS="1"; ;;
"--without-syszydis") WITHOUT_SYSZYDIS="0"; ;;
"--without-sqsh") WITH_SQSH="0"; ;;
"--with-syslz4") WITH_SYSLZ4="1"; ;;
"--without-zip") WANT_ZIP="0"; ;;
@ -434,7 +443,7 @@ parse_options "$1"
shift
done
ENVWORDS="MANDIR DESCRIPTION INFODIR LIBDIR INCLUDEDIR LOCALSTATEDIR ETCDIR 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 PKGCFG_LIBDIR PKGCFG_INCDIR PKGNAME VPATH CONTACT CONTACT_NAME CONTACT_MAIL CC CFLAGS CPPFLAGS LDFLAGS HAVE_LANG_C DEBUGGER HAVE_LIB_DL DL_LIBS PKGCONFIG R2_BUILDSYSTEM HAVE_PATCH PATCH HAVE_AR AR HAVE_GIT GIT HAVE_GPERF GPERF HAVE_LIB_ATOMIC HAVE_LIB_MAGIC HAVE_LINUX_CAN_H USE_LIB_ATOMIC LIBATOMIC USE_MAGIC USE_LIB_MAGIC LIBMAGIC WANT_THREADS LOADLIBS R_CRITICAL_ENABLED WANT_QJS WANT_DYLINK HAVE_FORK WANT_PTRACE_WRAP WANT_GPERF WANT_CAPSTONE WITH_LIBR WITH_STATIC_THEMES USE_CSNEXT USE_CS5 USE_CS4 WITH_CAPSTONE WITHOUT_SYSCAPSTONE CAPSTONE_CFLAGS CAPSTONE_LDFLAGS HAVE_PKGCFG_CAPSTONE USE_CAPSTONE SQSH_CFLAGS SQSH_LDFLAGS HAVE_PKGCFG_LIBSQSH WITH_SQSH USE_SQSH LZ4_CFLAGS LZ4_LDFLAGS HAVE_PKGCFG_LIBLZ4 WITH_SYSLZ4 USE_SYSLZ4 WANT_ZIP HAVE_LIB_Z HAVE_LIB_ZIP USE_ZIP USE_LIB_ZIP LIBZIP PKGCFG_ZLIBS PKGCFG_LIBZIPLIBS PKGCFG_R_ARCH_LIBS_PRIVATE PKGCFG_R_ASM_LIBS_PRIVATE PKGCFG_R_BIN_LIBS_PRIVATE PKGCFG_R_DEBUG_LIBS_PRIVATE PKGCFG_R_FS_LIBS_PRIVATE PKGCFG_R_IO_LIBS_PRIVATE PKGCFG_R_LANG_LIBS_PRIVATE PKGCFG_R_UTIL_LIBS_PRIVATE HAVE_LIB_XXHASH USE_XXHASH USE_LIB_XXHASH LIBXXHASH WITH_GPL HAVE_DECL_ADDR_NO_RANDOMIZE HAVE_DECL___GLIBC__ HAVE_ARC4RANDOM_UNIFORM HAVE_EXPLICIT_BZERO HAVE_EXPLICIT_MEMSET HAVE_CLOCK_NANOSLEEP HAVE___ATOMIC_FETCH_ADD_8 HAVE_SIGACTION HAVE_CLOCK_GETTIME FORCE_LIB_ATOMIC CLOCK_LDFLAGS SUPPORT_GNU99 HAVE_LIB_GMP WANT_SSL WANT_SSL_CRYPTO HAVE_OPENSSL SSL_CFLAGS SSL_LDFLAGS HAVE_LIB_SSL HAVE_PKGCFG_OPENSSL WANT_LIBUV HAVE_LIBUV_VERSION_1_0_0 LIBUV_CFLAGS LIBUV_LDFLAGS HAVE_PKGCFG_LIBUV HAVE_LIBUV WANT_V35 R2_WASM_BROWSER USE_RPATH USE_BUNDLE_PREFIX USERCC USEROSTYPE LIBVERSION HAVE_JEMALLOC HAVE_PTRACE USE_PTRACE_WRAP R_CHECKS_LEVEL WANT_DEBUGSTUFF"
ENVWORDS="MANDIR DESCRIPTION INFODIR LIBDIR INCLUDEDIR LOCALSTATEDIR ETCDIR 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 PKGCFG_LIBDIR PKGCFG_INCDIR PKGNAME VPATH CONTACT CONTACT_NAME CONTACT_MAIL CC CFLAGS CPPFLAGS LDFLAGS HAVE_LANG_C DEBUGGER HAVE_LIB_DL DL_LIBS PKGCONFIG R2_BUILDSYSTEM HAVE_PATCH PATCH HAVE_AR AR HAVE_GIT GIT HAVE_GPERF GPERF HAVE_LIB_ATOMIC HAVE_LIB_MAGIC HAVE_LINUX_CAN_H USE_LIB_ATOMIC LIBATOMIC USE_MAGIC USE_LIB_MAGIC LIBMAGIC WANT_THREADS LOADLIBS R_CRITICAL_ENABLED WANT_QJS WANT_DYLINK HAVE_FORK WANT_PTRACE_WRAP WANT_GPERF WANT_CAPSTONE WANT_ZYDIS WITH_LIBR WITH_STATIC_THEMES USE_CSNEXT USE_CS5 USE_CS4 WITH_CAPSTONE WITHOUT_SYSCAPSTONE CAPSTONE_CFLAGS CAPSTONE_LDFLAGS HAVE_PKGCFG_CAPSTONE USE_CAPSTONE WITH_ZYDIS WITHOUT_SYSZYDIS ZYDIS_CFLAGS ZYDIS_LDFLAGS HAVE_PKGCFG_ZYDIS USE_ZYDIS USE_SYS_ZYDIS SQSH_CFLAGS SQSH_LDFLAGS HAVE_PKGCFG_LIBSQSH WITH_SQSH USE_SQSH LZ4_CFLAGS LZ4_LDFLAGS HAVE_PKGCFG_LIBLZ4 WITH_SYSLZ4 USE_SYSLZ4 WANT_ZIP HAVE_LIB_Z HAVE_LIB_ZIP USE_ZIP USE_LIB_ZIP LIBZIP PKGCFG_ZLIBS PKGCFG_LIBZIPLIBS PKGCFG_R_ARCH_LIBS_PRIVATE PKGCFG_R_ASM_LIBS_PRIVATE PKGCFG_R_BIN_LIBS_PRIVATE PKGCFG_R_DEBUG_LIBS_PRIVATE PKGCFG_R_FS_LIBS_PRIVATE PKGCFG_R_IO_LIBS_PRIVATE PKGCFG_R_LANG_LIBS_PRIVATE PKGCFG_R_UTIL_LIBS_PRIVATE HAVE_LIB_XXHASH USE_XXHASH USE_LIB_XXHASH LIBXXHASH WITH_GPL HAVE_DECL_ADDR_NO_RANDOMIZE HAVE_DECL___GLIBC__ HAVE_ARC4RANDOM_UNIFORM HAVE_EXPLICIT_BZERO HAVE_EXPLICIT_MEMSET HAVE_CLOCK_NANOSLEEP HAVE___ATOMIC_FETCH_ADD_8 HAVE_SIGACTION HAVE_CLOCK_GETTIME FORCE_LIB_ATOMIC CLOCK_LDFLAGS SUPPORT_GNU99 HAVE_LIB_GMP WANT_SSL WANT_SSL_CRYPTO HAVE_OPENSSL SSL_CFLAGS SSL_LDFLAGS HAVE_LIB_SSL HAVE_PKGCFG_OPENSSL WANT_LIBUV HAVE_LIBUV_VERSION_1_0_0 LIBUV_CFLAGS LIBUV_LDFLAGS HAVE_PKGCFG_LIBUV HAVE_LIBUV WANT_V35 R2_WASM_BROWSER USE_RPATH USE_BUNDLE_PREFIX USERCC USEROSTYPE LIBVERSION HAVE_JEMALLOC HAVE_PTRACE USE_PTRACE_WRAP R_CHECKS_LEVEL WANT_DEBUGSTUFF"
create_environ
@ -707,6 +716,37 @@ USE_CAPSTONE="0"
HAVE_PKGCFG_CAPSTONE="0"
CAPSTONE_CFLAGS=""
CAPSTONE_LDFLAGS=""; fi
if [ "$WITH_ZYDIS" = "1" ]; then
if [ -z "${PKGCONFIG}" ]; then pkg-config --version >/dev/null 2>&1 ; if [ 0 = 0 ]; then PKGCONFIG=pkg-config ; else PKGCONFIG=pkgconf ; fi; fi
printf 'checking pkg-config flags for zydis... '
tmp=`${PKGCONFIG} --cflags zydis 2>/dev/null`
if [ $? != 0 ]; then echo no ; HAVE_PKGCFG_ZYDIS=0;
ZYDIS_CFLAGS='';ZYDIS_LDFLAGS='';
else
ZYDIS_CFLAGS=$tmp;
tmp=`${PKGCONFIG} --libs zydis 2>/dev/null`
if [ $? = 0 ]; then
echo yes; HAVE_PKGCFG_ZYDIS=1;
ZYDIS_LDFLAGS=$tmp; fi; fi; fi
if [ 11 = "$WITH_ZYDIS$HAVE_PKGCFG_ZYDIS" ]; then
USE_ZYDIS="1"
USE_SYS_ZYDIS="1"
else
USE_ZYDIS="0"
USE_SYS_ZYDIS="0"; fi
if [ "$WITHOUT_SYSZYDIS" = "0" ]; then
USE_ZYDIS="0"
USE_SYS_ZYDIS="0"
HAVE_PKGCFG_ZYDIS="0"
ZYDIS_CFLAGS=""
ZYDIS_LDFLAGS=""; fi
if [ "$WANT_ZYDIS" = "0" ]; then
USE_ZYDIS="0"
USE_SYS_ZYDIS="0"
HAVE_PKGCFG_ZYDIS="0"
ZYDIS_CFLAGS=""
ZYDIS_LDFLAGS=""; fi
if [ -z "${PKGCONFIG}" ]; then pkg-config --version >/dev/null 2>&1 ; if [ 0 = 0 ]; then PKGCONFIG=pkg-config ; else PKGCONFIG=pkgconf ; fi; fi
printf 'checking pkg-config flags for libsqsh... '
tmp=`${PKGCONFIG} --cflags libsqsh 2>/dev/null`
@ -1122,7 +1162,7 @@ do_remove
if [ "$QUIET" = 0 ]; then
echo
echo "Final report:"
for A in BUILD CC CFLAGS DEBUGGER HAVE_ARC4RANDOM_UNIFORM HAVE_EXPLICIT_BZERO HAVE_EXPLICIT_MEMSET HAVE_FORK HAVE_GPERF HAVE_LIBUV HAVE_LIB_GMP WANT_DEBUGSTUFF HAVE_OPENSSL WANT_SSL_CRYPTO HAVE_PTRACE HOST LDFLAGS LIBVERSION PKGCONFIG PREFIX R_CHECKS_LEVEL TARGET USERCC USEROSTYPE USE_CAPSTONE USE_LIB_MAGIC USE_SQSH USE_LIB_XXHASH USE_LIB_ZIP USE_PTRACE_WRAP USE_SYSLZ4 VERSION WANT_DYLINK USE_LIB_ATOMIC HAVE___ATOMIC_FETCH_ADD_8 FORCE_LIB_ATOMIC WANT_QJS ; do
for A in BUILD CC CFLAGS DEBUGGER HAVE_ARC4RANDOM_UNIFORM HAVE_EXPLICIT_BZERO HAVE_EXPLICIT_MEMSET HAVE_FORK HAVE_GPERF HAVE_LIBUV HAVE_LIB_GMP WANT_DEBUGSTUFF HAVE_OPENSSL WANT_SSL_CRYPTO HAVE_PTRACE HOST LDFLAGS LIBVERSION PKGCONFIG PREFIX R_CHECKS_LEVEL TARGET USERCC USEROSTYPE USE_CAPSTONE USE_LIB_MAGIC USE_SQSH USE_LIB_XXHASH USE_LIB_ZIP USE_PTRACE_WRAP USE_SYSLZ4 VERSION WANT_DYLINK USE_LIB_ATOMIC HAVE___ATOMIC_FETCH_ADD_8 FORCE_LIB_ATOMIC WANT_QJS WANT_ZYDIS USE_ZYDIS USE_SYS_ZYDIS ; do
eval VAL="\$${A}"
[ -z "${VAL}" ] && VAL="\"\""
echo " - ${A} = ${VAL}"

View file

@ -62,6 +62,18 @@ help () {
cfg=./plugins.cfg
want_zydis() {
if [ -n "${WANT_ZYDIS:-}" ]; then
echo "$WANT_ZYDIS"
return
fi
if [ -f ./config-user.mk ]; then
v=$(sed -n 's/^WANT_ZYDIS=//p' ./config-user.mk | tail -n 1)
[ -n "$v" ] && echo "$v" && return
fi
echo 1
}
if [ ! -f "$cfg" ]; then
echo "configure-plugins: Copying dist/plugins-cfg/plugins.def.cfg"
cp -f dist/plugins-cfg/plugins.def.cfg plugins.cfg
@ -289,6 +301,8 @@ while : ; do
TARGET_OSTYPE="${1#*=}"
update_ext
;;
"--without-zydis") WANT_ZYDIS=0 ;;
"--with-syszydis") WANT_ZYDIS=1 ;;
"--without-gpl") DEFCFG=./plugins.nogpl.cfg ;;
"--disable-loadlibs") LOADLIBS=0 ;;
"--rm-static") RMSTATIC="$2" ; ;;
@ -301,6 +315,10 @@ while : ; do
done
load ${DEFCFG}
if [ "$(want_zydis)" = 0 ]; then
STATIC=$(sub "$STATIC" arch.x86_zydis)
SHARED=$(sub "$SHARED" arch.x86_zydis)
fi
sort_vars
if [ - != "${RMSTATIC}" ]; then

View file

@ -53,6 +53,7 @@ ARG_WITHOUT HAVE_FORK fork disable fork ;
ARG_WITHOUT WANT_PTRACE_WRAP ptrace-wrap build ptrace-wrap support needed for the iaito debugger on Linux ;
ARG_WITHOUT WANT_GPERF gperf do not statically link the sdb databases even if gperf is found ;
ARG_WITHOUT WANT_CAPSTONE capstone dont build the capstone dependency ;
ARG_WITHOUT WANT_ZYDIS zydis dont build the zydis dependency ;
IFNOT WANT_GPERF {
HAVE_GPERF = 0 ;
@ -85,6 +86,35 @@ IFNOT WITHOUT_SYSCAPSTONE {
CAPSTONE_LDFLAGS = "" ;
}
(( ZYDIS ))
ARG_WITH WITH_ZYDIS syszydis force to use system-wide zydis ;
ARG_WITHOUT WITHOUT_SYSZYDIS syszydis avoid the system-wide zydis ;
IF WITH_ZYDIS {
PKGCFG ZYDIS_CFLAGS ZYDIS_LDFLAGS zydis
}
IFAND WITH_ZYDIS HAVE_PKGCFG_ZYDIS {
USE_ZYDIS = 1 ;
USE_SYS_ZYDIS = 1 ;
}{
USE_ZYDIS = 0 ;
USE_SYS_ZYDIS = 0 ;
}
IFNOT WITHOUT_SYSZYDIS {
USE_ZYDIS = 0 ;
USE_SYS_ZYDIS = 0 ;
HAVE_PKGCFG_ZYDIS = 0 ;
ZYDIS_CFLAGS = "" ;
ZYDIS_LDFLAGS = "" ;
}
IFNOT WANT_ZYDIS {
USE_ZYDIS = 0 ;
USE_SYS_ZYDIS = 0 ;
HAVE_PKGCFG_ZYDIS = 0 ;
ZYDIS_CFLAGS = "" ;
ZYDIS_LDFLAGS = "" ;
}
(( SQSH ))
PKGCFG SQSH_CFLAGS SQSH_LDFLAGS libsqsh
ARG_WITHOUT WITH_SQSH sqsh ensure squashfs support is not included, even if library is found ;
@ -384,7 +414,8 @@ REPORT
HAVE_OPENSSL WANT_SSL_CRYPTO HAVE_PTRACE HOST LDFLAGS LIBVERSION PKGCONFIG PREFIX
R_CHECKS_LEVEL TARGET USERCC USEROSTYPE USE_CAPSTONE USE_LIB_MAGIC USE_SQSH
USE_LIB_XXHASH USE_LIB_ZIP USE_PTRACE_WRAP USE_SYSLZ4 VERSION WANT_DYLINK
USE_LIB_ATOMIC HAVE___ATOMIC_FETCH_ADD_8 FORCE_LIB_ATOMIC WANT_QJS
USE_LIB_ATOMIC HAVE___ATOMIC_FETCH_ADD_8 FORCE_LIB_ATOMIC WANT_QJS WANT_ZYDIS
USE_ZYDIS USE_SYS_ZYDIS
;
PKGCFG_DO pkgcfg/r_egg.pc r_egg r_asm r_syscall r_util r_reg r_flag r_cons ;

View file

@ -7,6 +7,6 @@ case "$1" in
;;
*)
[ dist/plugins-cfg/plugins.def.cfg -nt ./plugins.cfg ] && rm -f plugins.cfg
./configure-plugins $*
WANT_ZYDIS="${WANT_ZYDIS:-1}" ./configure-plugins $*
;;
esac

View file

@ -14,6 +14,7 @@ arch.mips_cs
arch.null
arch.wasm
arch.x86_cs
arch.x86_zydis
arch.x86_nz
asm.arm
asm.att2intel

View file

@ -33,6 +33,7 @@ arch.ppc_gnu
arch.sparc
arch.tms320
arch.x86_cs
arch.x86_zydis
arch.xap
arch.z80
arch.sh

View file

@ -72,6 +72,7 @@ arch.vax
arch.wasm
arch.ws
arch.x86_cs
arch.x86_zydis
arch.x86_nasm
arch.x86_nz
arch.xap

View file

@ -94,6 +94,7 @@ arch.vax
arch.wasm
arch.ws
arch.x86_cs
arch.x86_zydis
arch.x86_nasm
arch.x86_nz
arch.xap

View file

@ -2,6 +2,7 @@ STATIC="
anal.null
anal.autoname
arch.x86_cs
arch.x86_zydis
arch.arm_cs
arch.dalvik
arch.mips_cs

View file

@ -2,6 +2,7 @@ STATIC="
anal.null
anal.autoname
arch.x86_cs
arch.x86_zydis
arch.arm
arch.arm_cs
arch.bf

View file

@ -11,6 +11,7 @@ arch.java
arch.mips_cs
arch.null
arch.x86_cs
arch.x86_zydis
arch.x86_nz
esil.null
esil.dummy

View file

@ -62,6 +62,7 @@ arch.vax
arch.wasm
arch.ws
arch.x86_cs
arch.x86_zydis
arch.x86_nasm
arch.x86_nz
arch.xap

View file

@ -2,6 +2,7 @@ STATIC="arch.8051
anal.null
anal.autoname
arch.x86_cs
arch.x86_zydis
arch.arc
arch.arm
arch.arm_cs

View file

@ -89,6 +89,7 @@ arch.vax
arch.wasm
arch.ws
arch.x86_cs
arch.x86_zydis
arch.x86_nasm
arch.x86_nz
arch.xap

View file

@ -35,6 +35,7 @@ arch.sparc_cs
arch.sparc_gnu
arch.ws
arch.x86_cs
arch.x86_zydis
arch.xap
arch.xcore_cs
arch.z80

View file

@ -29,6 +29,7 @@ arch.snes
arch.sparc_cs
arch.ws
arch.x86_cs
arch.x86_zydis
arch.x86_nasm
arch.x86_nz
arch.xap

View file

@ -40,6 +40,7 @@ arch.v850
arch.vax
arch.wasm
arch.x86_cs
arch.x86_zydis
arch.x86_nasm
arch.x86_nz
arch.xcore_cs

View file

@ -10,6 +10,7 @@ arch.java
arch.mips_cs
arch.null
arch.x86_cs
arch.x86_zydis
arch.x86_nz
esil.null
esil.dummy

View file

@ -34,6 +34,7 @@ arch.pickle
arch.pyc
arch.wasm
arch.x86_cs
arch.x86_zydis
arch.x86_nasm
arch.x86_nz
bin.any

View file

@ -3,6 +3,7 @@ anal.null
anal.autoname
arch.null
arch.x86_cs
arch.x86_zydis
arch.x86_nz
bin.any
esil.dummy

View file

@ -15,6 +15,7 @@ arch.pyc
arch.riscv
arch.wasm
arch.x86_cs
arch.x86_zydis
arch.x86_nz
arch.z80
esil.null

View file

@ -9,6 +9,10 @@ CFLAGS+=-DR2_PLUGIN_INCORE
CFLAGS:=-I.. -I$(LTOP)/arch/include -DR2_PLUGIN_INCORE -Iarch -I$(TOP)/shlr $(CFLAGS)
LDFLAGS+=$(CS_LDFLAGS)
ifneq ($(filter p/x86_zydis.mk,$(STATIC_ARCH_PLUGINS)),)
LDFLAGS+=$(ZYDIS_LDFLAGS)
endif
.PHONY: pre
pre: p
$(MAKE) libr_arch.$(EXT_SO)

View file

@ -193,6 +193,12 @@ if arch_plugins.contains('x86_nz')
]
endif
if arch_plugins.contains('x86_zydis')
r_arch_sources += [
'p/x86/plugin_zydis.c'
]
endif
if arch_plugins.contains('xtensa')
r_arch_sources += [
'p/xtensa/plugin.c',
@ -212,6 +218,10 @@ deps = [
capstone_dep,
]
if arch_plugins.contains('x86_zydis')
deps += zydis_dep
endif
links = []
incs = [platform_inc, '../xps']
if get_option('use_v35')
@ -239,13 +249,17 @@ r_arch = library('r_arch', r_arch_sources,
r_arch_dep = declare_dependency(link_with: r_arch, include_directories: [incs])
if get_option('blob')
static_deps = [
r_util_static_dep,
capstone_dep,
]
if arch_plugins.contains('x86_zydis')
static_deps += zydis_dep
endif
r_arch_static = static_library('r_arch_static', r_arch_sources,
include_directories: [incs],
c_args: library_cflags,
dependencies: [
r_util_static_dep,
capstone_dep,
],
dependencies: static_deps,
install: true,
implicit_include_directories: false,
)

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,389 @@
static char *get_reg_profile(RArchSession *as) {
R_RETURN_VAL_IF_FAIL (as && as->config, NULL);
int bits = as->config->bits;
switch (bits) {
case 16:
case 32:
case 64:
break;
default:
if (R_SYS_BITS_CHECK (bits, 64)) {
bits = 64;
} else {
bits = 32;
}
break;
}
const char *p = NULL;
switch (bits) {
case 16: p =
"=PC ip\n"
"=SP sp\n"
"=BP bp\n"
"=R0 ax\n"
"=A0 ax\n"
"=A1 bx\n"
"=A2 cx\n"
"=A3 dx\n"
"=A4 si\n"
"=A5 di\n"
"=SN ah\n"
"=TR fs\n" // can be %gs too, but well thats can be overriden with the cc abi scripts
"gpr ip .16 48 0\n"
"gpr ax .16 24 0\n"
"gpr ah .8 25 0\n"
"gpr al .8 24 0\n"
"gpr bx .16 0 0\n"
"gpr bh .8 1 0\n"
"gpr bl .8 0 0\n"
"gpr cx .16 4 0\n"
"gpr ch .8 5 0\n"
"gpr cl .8 4 0\n"
"gpr dx .16 8 0\n"
"gpr dh .8 9 0\n"
"gpr dl .8 8 0\n"
"gpr sp .16 60 0\n"
"gpr bp .16 20 0\n"
"gpr si .16 12 0\n"
"gpr di .16 16 0\n"
"seg cs .16 52 0\n"
"seg ss .16 54 0\n"
"seg ds .16 56 0\n"
"seg es .16 58 0\n"
"gpr flags .16 56 0\n"
"flg cf .1 .448 0\n"
"flg pf .1 .449 0\n"
"flg af .1 .450 0\n"
"flg zf .1 .451 0\n"
"flg sf .1 .452 0\n"
"flg tf .1 .453 0\n"
"flg if .1 .454 0\n"
"flg df .1 .455 0\n"
"flg of .1 .456 0\n"
"flg rf .1 .457 0\n";
#if 0
"drx dr0 .32 0 0\n"
"drx dr1 .32 4 0\n"
"drx dr2 .32 8 0\n"
"drx dr3 .32 12 0\n"
//"drx dr4 .32 16 0\n"
//"drx dr5 .32 20 0\n"
"drx dr6 .32 24 0\n"
"drx dr7 .32 28 0\n"
#endif
break;
case 32: p =
"=PC eip\n"
"=SP esp\n"
"=BP ebp\n"
"=R0 eax\n"
"=A0 eax\n"
"=A1 ebx\n"
"=A2 ecx\n"
"=A3 edx\n"
"=A4 esi\n"
"=A5 edi\n"
"=SN eax\n"
"gpr eiz .32 ? 0\n"
"gpr oeax .32 44 0\n"
"gpr eax .32 24 0\n"
"gpr ax .16 24 0\n"
"gpr ah .8 25 0\n"
"gpr al .8 24 0\n"
"gpr ebx .32 0 0\n"
"gpr bx .16 0 0\n"
"gpr bh .8 1 0\n"
"gpr bl .8 0 0\n"
"gpr ecx .32 4 0\n"
"gpr cx .16 4 0\n"
"gpr ch .8 5 0\n"
"gpr cl .8 4 0\n"
"gpr edx .32 8 0\n"
"gpr dx .16 8 0\n"
"gpr dh .8 9 0\n"
"gpr dl .8 8 0\n"
"gpr esi .32 12 0\n"
"gpr si .16 12 0\n"
"gpr edi .32 16 0\n"
"gpr di .16 16 0\n"
"gpr esp .32 60 0\n"
"gpr sp .16 60 0\n"
"gpr ebp .32 20 0\n"
"gpr bp .16 20 0\n"
"gpr eip .32 48 0\n"
"gpr ip .16 48 0\n"
"seg xfs .32 36 0\n"
"seg xgs .32 40 0\n"
"seg xcs .32 52 0\n"
"seg cs .16 52 0\n"
"seg xss .32 52 0\n"
"flg eflags .32 .448 0 c1p.a.zstido.n.rv\n"
"flg flags .16 .448 0\n"
"flg cf .1 .448 0\n"
"flg pf .1 .450 0\n"
"flg af .1 .452 0\n"
"flg zf .1 .454 0\n"
"flg sf .1 .455 0\n"
"flg tf .1 .456 0\n"
"flg if .1 .457 0\n"
"flg df .1 .458 0\n"
"flg of .1 .459 0\n"
"flg nt .1 .462 0\n"
"flg rf .1 .464 0\n"
"flg vm .1 .465 0\n"
"drx dr0 .32 0 0\n"
"drx dr1 .32 4 0\n"
"drx dr2 .32 8 0\n"
"drx dr3 .32 12 0\n"
//"drx dr4 .32 16 0\n"
//"drx dr5 .32 20 0\n"
"drx dr6 .32 24 0\n"
"drx dr7 .32 28 0\n"
"vec128@fpu xmm0 .128 160 4\n"
"vec64@fpu xmm0l .64 160 0\n"
"vec64@fpu xmm0h .64 168 0\n"
"vec128@fpu xmm1 .128 176 4\n"
"fpu xmm1l .64 176 0\n"
"fpu xmm1h .64 184 0\n"
"vec128@fpu xmm2 .128 192 4\n"
"fpu xmm2l .64 192 0\n"
"fpu xmm2h .64 200 0\n"
"vec128@fpu xmm3 .128 208 4\n"
"fpu xmm3l .64 208 0\n"
"fpu xmm3h .64 216 0\n"
"vec128@fpu xmm4 .128 224 4\n"
"fpu xmm4l .64 224 0\n"
"fpu xmm4h .64 232 0\n"
"vec128@fpu xmm5 .128 240 4\n"
"fpu vec1285l .64 240 0\n"
"fpu vec1285h .64 248 0\n"
"vec128@fpu xmm6 .128 256 4\n"
"fpu vec1286l .64 256 0\n"
"fpu vec1286h .64 264 0\n"
"vec128@fpu xmm7 .128 272 4\n"
"fpu xmm7l .64 272 0\n"
"fpu xmm7h .64 280 0\n";
break;
case 64:
{
#if 0
const char *cc = "cdecl"; // r_anal_cc_default (anal); // R2_590
const char *args_prof = cc && !strcmp (cc, "ms")
? // Microsoft x64 CC
"# RAX return value\n"
"# RCX argument 1\n"
"# RDX argument 2\n"
"# R8 argument 3\n"
"# R9 argument 4\n"
"# R10-R11 syscall/sysret\n"
"# R12-R15 GP preserved\n"
"# RSI preserved source\n"
"# RDI preserved destination\n"
"# RSP stack pointer\n"
"=PC rip\n"
"=SP rsp\n"
"=R0 rax\n"
"=F0 xmm0\n"
"=BP rbp\n"
"=A0 rcx\n"
"=A1 rdx\n"
"=A2 r8\n"
"=A3 r9\n"
"=SN rax\n"
: // System V AMD64 ABI
#endif
// R2_590 - this info shouldnt be used as a calling convention if anal.cc is set
const char *args_prof =
"=PC rip\n"
"=SP rsp\n"
"=BP rbp\n"
"=R0 rax\n"
"=A0 rdi\n"
"=A1 rsi\n"
"=A2 rdx\n"
"=A3 rcx\n"
"=A4 r8\n"
"=A5 r9\n"
"=A6 r10\n"
"=A7 r11\n"
"=SN rax\n";
char *prof = r_str_newf ("%s%s", args_prof,
"gpr rax .64 80 0\n"
"gpr eax .32 80 0\n"
"gpr ax .16 80 0\n"
"gpr al .8 80 0\n"
"gpr ah .8 81 0\n"
"gpr rbx .64 40 0\n"
"gpr ebx .32 40 0\n"
"gpr bx .16 40 0\n"
"gpr bl .8 40 0\n"
"gpr bh .8 41 0\n"
"gpr rcx .64 88 0\n"
"gpr ecx .32 88 0\n"
"gpr cx .16 88 0\n"
"gpr cl .8 88 0\n"
"gpr ch .8 89 0\n"
"gpr rdx .64 96 0\n"
"gpr edx .32 96 0\n"
"gpr dx .16 96 0\n"
"gpr dl .8 96 0\n"
"gpr dh .8 97 0\n"
"gpr rsi .64 104 0\n"
"gpr esi .32 104 0\n"
"gpr si .16 104 0\n"
"gpr sil .8 104 0\n"
"gpr rdi .64 112 0\n"
"gpr edi .32 112 0\n"
"gpr di .16 112 0\n"
"gpr dil .8 112 0\n"
"gpr r8 .64 72 0\n"
"gpr r8d .32 72 0\n"
"gpr r8w .16 72 0\n"
"gpr r8b .8 72 0\n"
"gpr r9 .64 64 0\n"
"gpr r9d .32 64 0\n"
"gpr r9w .16 64 0\n"
"gpr r9b .8 64 0\n"
"gpr r10 .64 56 0\n"
"gpr r10d .32 56 0\n"
"gpr r10w .16 56 0\n"
"gpr r10b .8 56 0\n"
"gpr r11 .64 48 0\n"
"gpr r11d .32 48 0\n"
"gpr r11w .16 48 0\n"
"gpr r11b .8 48 0\n"
"gpr r12 .64 24 0\n"
"gpr r12d .32 24 0\n"
"gpr r12w .16 24 0\n"
"gpr r12b .8 24 0\n"
"gpr r13 .64 16 0\n"
"gpr r13d .32 16 0\n"
"gpr r13w .16 16 0\n"
"gpr r13b .8 16 0\n"
"gpr r14 .64 8 0\n"
"gpr r14d .32 8 0\n"
"gpr r14w .16 8 0\n"
"gpr r14b .8 8 0\n"
"gpr r15 .64 0 0\n"
"gpr r15d .32 0 0\n"
"gpr r15w .16 0 0\n"
"gpr r15b .8 0 0\n"
"gpr rip .64 128 0\n"
"gpr rbp .64 32 0\n"
"gpr ebp .32 32 0\n"
"gpr bp .16 32 0\n"
"gpr bpl .8 32 0\n"
"seg cs .64 136 0\n"
"flg rflags .64 144 0 c1p.a.zstido.n.rv\n"
"flg eflags .32 144 0 c1p.a.zstido.n.rv\n"
"flg cf .1 144.0 0 carry\n"
"flg pf .1 144.2 0 parity\n"
//"gpr cf .1 .1152 0 carry\n"
//"gpr pf .1 .1154 0 parity\n"
"flg af .1 144.4 0 adjust\n"
"flg zf .1 144.6 0 zero\n"
"flg sf .1 144.7 0 sign\n"
"flg tf .1 .1160 0 trap\n"
"flg if .1 .1161 0 interrupt\n"
"flg df .1 .1162 0 direction\n"
"flg of .1 .1163 0 overflow\n"
"gpr riz .64 ? 0\n"
"gpr rsp .64 152 0\n"
"gpr esp .32 152 0\n"
"gpr sp .16 152 0\n"
"gpr spl .8 152 0\n"
"seg ss .64 160 0\n"
"seg fs_base .64 168 0\n"
"seg gs_base .64 176 0\n"
"seg ds .64 184 0\n"
"seg es .64 192 0\n"
"seg fs .64 200 0\n"
"seg gs .64 208 0\n"
"drx dr0 .64 0 0\n"
"drx dr1 .64 8 0\n"
"drx dr2 .64 16 0\n"
"drx dr3 .64 24 0\n"
// dr4 32
// dr5 40
"drx dr6 .64 48 0\n"
"drx dr7 .64 56 0\n"
/*0030 struct user_fpregs_struct
0031 {
0032 __uint16_t cwd;
0033 __uint16_t swd;
0034 __uint16_t ftw;
0035 __uint16_t fop;
0036 __uint64_t rip;
0037 __uint64_t rdp;
0038 __uint32_t mxcsr;
0039 __uint32_t mxcr_mask;
0040 __uint32_t st_space[32]; // 8*16 bytes for each FP-reg = 128 bytes
0041 __uint32_t xmm_space[64]; // 16*16 bytes for each XMM-reg = 256 bytes
0042 __uint32_t padding[24];
0043 };
*/
"fpu cwd .16 0 0\n"
"fpu swd .16 2 0\n"
"fpu ftw .16 4 0\n"
"fpu fop .16 6 0\n"
"fpu frip .64 8 0\n"
"fpu frdp .64 16 0\n"
"fpu mxcsr .32 24 0\n"
"fpu mxcr_mask .32 28 0\n"
"fpu st0 .64 32 0\n"
"fpu st1 .64 48 0\n"
"fpu st2 .64 64 0\n"
"fpu st3 .64 80 0\n"
"fpu st4 .64 96 0\n"
"fpu st5 .64 112 0\n"
"fpu st6 .64 128 0\n"
"fpu st7 .64 144 0\n"
"vec128@fpu xmm0 .128 160 4\n"
"fpu xmm0l .64 160 0\n"
"fpu xmm0h .64 168 0\n"
"vec128@fpu xmm1 .128 176 4\n"
"fpu xmm1l .64 176 0\n"
"fpu xmm1h .64 184 0\n"
"vec128@fpu xmm2 .128 192 4\n"
"fpu xmm2l .64 192 0\n"
"fpu xmm2h .64 200 0\n"
"vec128@fpu xmm3 .128 208 4\n"
"fpu xmm3l .64 208 0\n"
"fpu xmm3h .64 216 0\n"
"vec128@fpu xmm4 .128 224 4\n"
"fpu xmm4l .64 224 0\n"
"fpu xmm4h .64 232 0\n"
"vec128@fpu xmm5 .128 240 4\n"
"fpu xmm5l .64 240 0\n"
"fpu xmm5h .64 248 0\n"
"vec128@fpu xmm6 .128 256 4\n"
"fpu xmm6l .64 256 0\n"
"fpu xmm6h .64 264 0\n"
"vec128@fpu xmm7 .128 272 4\n"
"fpu xmm7l .64 272 0\n"
"fpu xmm7h .64 280 0\n"
"fpu x64 .64 288 0\n");
return prof;
}
}
return (R_STR_ISNOTEMPTY (p))? strdup (p): NULL;
}

31
libr/arch/p/x86_zydis.mk Normal file
View file

@ -0,0 +1,31 @@
ifeq ($(WANT_ZYDIS),1)
OBJ_X86_ZYDIS=p/x86/plugin_zydis.o
ZYDIS_LIB=$(ZYDIS_ROOT)/libzydis.a
ZYDIS_HDR=$(ZYDIS_ROOT)/amalgamated-dist/Zydis.h
ZYDIS_DEPS=
STATIC_OBJ+=$(OBJ_X86_ZYDIS)
TARGET_X86_ZYDIS=arch_x86_zydis.$(EXT_SO)
ALL_TARGETS+=${TARGET_X86_ZYDIS}
${OBJ_X86_ZYDIS}: CFLAGS += $(ZYDIS_CFLAGS)
ifneq ($(USE_ZYDIS),1)
ZYDIS_DEPS=$(ZYDIS_LIB)
${ZYDIS_LIB}:
$(MAKE) -C $(LIBR)/../subprojects zydis CC="$(CC)" AR="$(AR)" CFLAGS="$(CFLAGS)"
${ZYDIS_HDR}: ${ZYDIS_LIB}
${OBJ_X86_ZYDIS}: ${ZYDIS_DEPS}
endif
${TARGET_X86_ZYDIS}: ${OBJ_X86_ZYDIS} ${ZYDIS_DEPS}
${CC} ${CFLAGS} $(call libname,arch_x86_zydis) $(ZYDIS_CFLAGS) \
-o arch_x86_zydis.${EXT_SO} ${OBJ_X86_ZYDIS} $(ZYDIS_LDFLAGS)
endif

View file

@ -22,6 +22,13 @@ else
CS_ROOT:=$(LIBR)/../subprojects/capstone-v5
endif
ZYDIS_ROOT:=$(LIBR)/../subprojects/zydis
WANT_ZYDIS?=1
USE_ZYDIS?=0
USE_SYS_ZYDIS?=0
ZYDIS_CFLAGS?=
ZYDIS_LDFLAGS?=
SHLR:=$(LIBR)/../shlr
include $(LIBR)/../global.mk
@ -40,6 +47,19 @@ CS_CFLAGS=
CS_LDFLAGS=
endif
ifeq ($(WANT_ZYDIS),1)
ifeq ($(USE_ZYDIS),1)
ZYDIS_CFLAGS+=$(CONFIG_ZYDIS_CFLAGS) -DUSE_SYS_ZYDIS=1
ZYDIS_LDFLAGS+=$(CONFIG_ZYDIS_LDFLAGS)
else
ZYDIS_CFLAGS+=-I$(ZYDIS_ROOT)/amalgamated-dist -DUSE_SYS_ZYDIS=0 -DZYDIS_STATIC_BUILD
ZYDIS_LDFLAGS+=$(ZYDIS_ROOT)/libzydis.a
endif
else
ZYDIS_CFLAGS=
ZYDIS_LDFLAGS=
endif
CFLAGS+=${CPPFLAGS}
CFLAGS+=-I../xps

View file

@ -343,6 +343,7 @@ extern const RArchPlugin r_arch_plugin_ws;
extern const RArchPlugin r_arch_plugin_x86_cs;
extern const RArchPlugin r_arch_plugin_x86_nasm;
extern const RArchPlugin r_arch_plugin_x86_nz;
extern const RArchPlugin r_arch_plugin_x86_zydis;
extern const RArchPlugin r_arch_plugin_xap;
extern const RArchPlugin r_arch_plugin_xcore_cs;
extern const RArchPlugin r_arch_plugin_xtensa;

View file

@ -35,6 +35,8 @@ extern "C" {
#define WANT_QJS @WANT_QJS@
#define WANT_V35 @WANT_V35@
#define WANT_CAPSTONE @WANT_CAPSTONE@
#define WANT_ZYDIS @WANT_ZYDIS@
#define USE_SYS_ZYDIS @USE_SYS_ZYDIS@
#define HAVE_LINUX_CAN_H @HAVE_LINUX_CAN_H@
#define R2_USE_BUNDLE_PREFIX @USE_BUNDLE_PREFIX@
#define R2_USE_SQSH @USE_SQSH@

View file

@ -78,6 +78,9 @@ if user_plugins.contains('x86')
bp_plugins += [ 'x86' ]
asm_plugins += [ 'x86' ]
endif
if user_plugins.contains('x86_zydis') and get_option('want_zydis')
arch_plugins += [ 'x86_zydis' ]
endif
if user_plugins.contains('web')
io_plugins += [ 'http' ]
io_plugins += [ 'r2web' ]
@ -197,6 +200,10 @@ if get_option('plugins') == ''
'xcore_cs',
]
if get_option('want_zydis')
arch_plugins += [ 'x86_zydis' ]
endif
if use_gpl
arch_plugins += [
'arm_gnu',

View file

@ -305,6 +305,32 @@ else
message('Using bundled xxhash library')
endif
# handle Zydis library
zydis_dep = disabler()
use_sys_zydis = false
want_zydis = get_option('want_zydis') and (
get_option('plugins') == '' or get_option('plugins').split(',').contains('x86_zydis')
)
if want_zydis
if get_option('use_sys_zydis')
zydis_dep = dependency('zydis', required: false)
if not zydis_dep.found()
zydis_dep = cc.find_library('zydis', required: true)
endif
cc.has_header('Zydis/Zydis.h', dependencies: zydis_dep, required: true)
zydis_dep = declare_dependency(
dependencies: zydis_dep,
compile_args: ['-DUSE_SYS_ZYDIS=1']
)
use_sys_zydis = true
message('Using system zydis library')
else
zydis_proj = subproject('zydis', default_options: ['default_library=static'])
zydis_dep = zydis_proj.get_variable('zydis_dep')
message('Using bundled zydis')
endif
endif
# handle zlib library
sys_zlib = dependency('zlib', required: false)
use_sys_zlib = false
@ -445,6 +471,8 @@ userconf.set10('HAVE_FORK', use_fork)
userconf.set10('HAVE_GPERF', get_option('sdb_cgen'))
userconf.set10('WANT_DYLINK', use_dylink)
userconf.set10('WANT_QJS', get_option('want_qjs'))
userconf.set10('WANT_ZYDIS', want_zydis)
userconf.set10('USE_SYS_ZYDIS', use_sys_zydis)
userconf.set('R2_WASM_BROWSER', 0)
userconf.set10('WANT_V35', get_option('use_v35'))
userconf.set10('WANT_THREADS', get_option('want_threads'))

View file

@ -33,7 +33,9 @@ option('want_qjs', type: 'boolean', value: true)
option('use_new_abi', type: 'boolean', value: false)
option('use_bundle_prefix', type: 'boolean', value: false)
option('want_capstone', type: 'boolean', value: true)
option('want_zydis', type: 'boolean', value: true)
option('use_sys_capstone', type: 'boolean', value: false)
option('use_sys_zydis', type: 'boolean', value: false)
option('use_capstone_version', type: 'combo', choices: ['v4', 'v5', 'next', 'v6'], value: 'v5')
option('use_sys_magic', type: 'boolean', value: false)
option('use_sys_zip', type: 'boolean', value: false)

View file

@ -32,7 +32,7 @@ endif
endif
endif
.PHONY: capstone-sync capstone-build all clean mrproper libgdbr libwinkd bochs sdbs
.PHONY: capstone-sync capstone-build zydis-build all clean mrproper libgdbr libwinkd bochs sdbs
ifeq ($(shell gcc -v > /dev/null 2>&1 && echo works),works)
HOST_CC?=gcc
@ -55,7 +55,7 @@ all:
exit 1
endif
preall: libwinkd bochs capstone-build sdbs
preall: libwinkd bochs capstone-build zydis-build sdbs
@for MOD in ${MODS} ; do \
echo $(MAKE) -C $$MOD ; \
$(MAKE) -C $$MOD HAVE_VALA= ROOT="${PWD}/../" CC="${CC}" ; \
@ -217,6 +217,23 @@ endif
endif
endif
ZYDIS_SHLR_LIB=
ifneq ($(filter p/x86_zydis.mk,$(STATIC_ARCH_PLUGINS)),)
ifeq ($(WANT_ZYDIS),1)
ifeq ($(USE_ZYDIS),0)
ZYDIS_SHLR_LIB=$(ZYDIS_ROOT)/libzydis.a
endif
endif
endif
.PHONY: zydis-build
ifneq ($(ZYDIS_SHLR_LIB),)
zydis-build:
$(MAKE) -C ../subprojects zydis CC="$(CC)" AR="$(AR)" CFLAGS="$(CFLAGS)"
else
zydis-build:
endif
../../radare2-webui:
cd ../.. ; git clone --depth 1 https://github.com/radareorg/radare2-webui
@ -262,6 +279,7 @@ spp: spp-sync
SHLRS+=ar/libr_ar.a
SHLRS+=bochs/lib/libbochs.a
SHLRS+=$(CS_ROOT)/libcapstone.a
SHLRS+=$(ZYDIS_SHLR_LIB)
SHLRS+=gdb/lib/libgdbr.a
SHLRS+=java/libr_java.a
SHLRS+=qnx/lib/libqnxr.a

View file

@ -4,6 +4,8 @@
# automatically set to 1 on dist tarball creation
PREDOWNLOADED=0
WANT_ZYDIS?=1
USE_ZYDIS?=0
DEPS=sdb
@ -29,6 +31,12 @@ else
WANT_BUNDLED_CAPSTONE=1
endif
ifeq ($(WANT_ZYDIS),1)
ifneq ($(USE_ZYDIS),1)
DEPS += zydis
endif
endif
ifeq ($(WANT_BUNDLED_CAPSTONE),1)
ifeq ($(USE_CS4),1)
DEPS += capstone-v4
@ -39,7 +47,7 @@ ifeq ($(WANT_BUNDLED_CAPSTONE),1)
endif
endif
DISTDEPS=binaryninja capstone-v5 otezip qjs sdb
DISTDEPS=binaryninja capstone-v5 otezip qjs sdb zydis
EXTRADEPS=capstone-next capstone-v4
ALLDEPS=$(DISTDEPS) $(EXTRADEPS)

View file

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2013-2024 Zyantific
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View file

@ -0,0 +1,8 @@
Zydis bundled source metadata
============================
The files under amalgamated-dist are from the Zydis 4.1.0 amalgamated release:
https://github.com/zyantific/zydis/releases/download/v4.1.0/zydis-amalgamated.tar.gz
The upstream project is distributed under the MIT license. See LICENSE.MIT.

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,56 @@
project('zydis', 'c', version: '4.1.0', meson_version: '>=0.55.0')
cc = meson.get_compiler('c')
if cc.has_argument('--std=gnu99')
add_project_arguments('--std=gnu99', language: ['c'])
elif cc.has_argument('--std=c99')
add_project_arguments('--std=c99', language: ['c'])
endif
if cc.get_argument_syntax() == 'msvc'
if get_option('b_lto')
add_project_arguments(
'/GL', # Compiler optimisation for MSVC
language: 'c',
)
add_project_link_arguments(
'/LTCG', # Used for Linking when compiling with /GL
language: 'c',
)
endif
endif
zydis_c_args = []
zydis_dep_c_args = []
if get_option('default_library') == 'static'
zydis_c_args += ['-DZYDIS_STATIC_BUILD']
else
zydis_c_args += ['-DZYDIS_SHOULD_EXPORT']
endif
zydis_dep_c_args += ['-DUSE_SYS_ZYDIS=0', '-DZYDIS_STATIC_BUILD']
if cc.get_id() == 'msvc'
add_project_arguments('/W0', language: 'c')
elif cc.has_argument('-w')
add_project_arguments('-w', language: 'c')
endif
zydis_sources = [
'amalgamated-dist/Zydis.c'
]
zydis_includes = include_directories('amalgamated-dist')
libzydis = library('zydis', zydis_sources,
c_args: zydis_c_args,
include_directories: zydis_includes,
install: false,
)
zydis_dep = declare_dependency(
link_with: libzydis,
include_directories: zydis_includes,
compile_args: zydis_dep_c_args,
)

15
subprojects/zydis.mk Normal file
View file

@ -0,0 +1,15 @@
.PHONY: zydis zydis_clean
ZYDIS_BUILD_CFLAGS=$(filter-out -Werror%,$(CFLAGS))
zydis:
rm -rf zydis.tmp
mkdir -p zydis.tmp
cp -rf packagefiles/zydis/* zydis.tmp
${CC} ${ZYDIS_BUILD_CFLAGS} -fPIC -DZYDIS_STATIC_BUILD -Izydis.tmp/amalgamated-dist -c zydis.tmp/amalgamated-dist/Zydis.c -o zydis.tmp/Zydis.o
${AR} rcs zydis.tmp/libzydis.a zydis.tmp/Zydis.o
rm -rf zydis
mv zydis.tmp zydis
zydis_clean:
rm -rf zydis zydis.tmp

7
subprojects/zydis.wrap Normal file
View file

@ -0,0 +1,7 @@
[wrap-file]
directory = zydis
source_url = https://github.com/zyantific/zydis/releases/download/v4.1.0/zydis-amalgamated.tar.gz
source_filename = zydis-amalgamated.tar.gz
source_hash = aa9b82be3a37a2998bd8e16cf583bbf2b6c3d80e97dc20504169dc32ca1ced59
lead_directory_missing = true
patch_directory = zydis

View file

@ -41,5 +41,6 @@ cd "$ROOT"
. ./sys/make-jobs.inc.sh
${MAKE} mrproper || true
[ -z "${KEEP_PLUGINS_CFG:-}" ] && rm -f plugins.cfg
./configure --with-rpath "$@" || exit 1
# filcc currently crashes on the generated Zydis amalgamation.
./configure --without-zydis --with-rpath "$@" || exit 1
${MAKE} -j || exit 1

View file

@ -93,6 +93,14 @@ elif grep -q '^USE_CS4=1' config-user.mk 2> /dev/null; then
CAPSTONE_LIB=subprojects/capstone-v4/libcapstone.a
fi
STATIC_LIBS="shlr/gdb/lib/libgdbr.a subprojects/otezip/libotezip.a ${CAPSTONE_LIB}"
if grep -q '^WANT_ZYDIS=1' config-user.mk 2> /dev/null && grep -q 'p/x86_zydis.mk' libr/config.mk 2> /dev/null; then
if grep -q '^USE_ZYDIS=1' config-user.mk 2> /dev/null; then
ZYDIS_LIB=`sed -n 's/^CONFIG_ZYDIS_LDFLAGS=//p' config-user.mk | tail -n 1`
else
ZYDIS_LIB=subprojects/zydis/libzydis.a
fi
STATIC_LIBS="${STATIC_LIBS} ${ZYDIS_LIB}"
fi
STATIC_TEST_CFLAGS="${CFLAGS_STATIC} ${CFLAGS}"
show_link_errors() {

220
test/db/anal/x86_zydis Normal file
View file

@ -0,0 +1,220 @@
NAME=x86 zydis decode readiness
FILE=malloc://16
CMDS=<<EOF
e asm.arch=x86.zydis
e asm.arch
e asm.bits=16
wx b83412
pi 1
e asm.bits=32
s 0
wx b878563412
pi 1
e asm.bits=64
s 0
wx 4889d8
pi 1
e asm.syntax=att
s 0
pi 1
e asm.syntax=intel
s 0
wx c4
pi 1
ao 1~^type,size
EOF
EXPECT=<<EOF
x86.zydis
mov ax, 0x1234
mov eax, 0x12345678
mov rax, rbx
mov %rbx, %rax
invalid
size: 1
type: ill
EOF
RUN
NAME=x86 capstone default selector
FILE=malloc://16
CMDS=<<EOF
e asm.arch=x86
e asm.arch
e asm.bits=64
wx 4889d8
pi 1
EOF
EXPECT=<<EOF
x86
mov rax, rbx
EOF
RUN
NAME=x86 zydis opex memory metadata
FILE=malloc://32
CMDS=<<EOF
e asm.arch=x86.zydis
e asm.bits=64
wx 488b548b10488b0578563412c70578563412efbeadde
aoj 1~{opex}
s 5
aoj 1~{opex}
s 12
aoj 1~{opex}
EOF
EXPECT=<<EOF
{"opcode":"mov rdx, qword [rbx+rcx*4+0x10]","disasm":"mov rdx, qword [rbx+rcx*4+0x10]","pseudo":"rdx = qword [rbx+rcx*4+0x10]","description":"moves data from src to dst","mnemonic":"mov","mask":"ffffffffff","esil":"rbx,rcx,4,*,+,0x10,+,[8],rdx,=","sign":false,"id":436,"opex":{"operands":[{"size":8,"rw":2,"type":"reg","value":"rdx"},{"size":8,"rw":1,"type":"mem","segment":"ds","base":"rbx","index":"rcx","scale":4,"disp":16}],"rex":true,"modrm":true,"sib":true,"disp":16},"addr":0,"bytes":"488b548b10","disp":16,"size":5,"type":"load","esilcost":8,"reg":"rbx","ireg":"rcx","scale":4,"refptr":8,"cycles":1,"failcycles":0,"delay":0,"ptrsize":8,"stackptr":0,"direction":"read","family":"cpu"}
{"opcode":"mov rax, qword [rip+0x12345678]","disasm":"mov rax, qword [0x12345684]","pseudo":"rax = qword [0x12345684]","description":"moves data from src to dst","mnemonic":"mov","mask":"ffff0000000000","esil":"0x12345684,[8],rax,=","sign":false,"id":436,"opex":{"operands":[{"size":8,"rw":2,"type":"reg","value":"rax"},{"size":8,"rw":1,"type":"mem","segment":"ds","base":"rip","scale":0,"disp":305419896}],"rex":true,"modrm":true,"disp":305419896},"addr":5,"bytes":"488b0578563412","ptr":305419908,"size":7,"type":"load","esilcost":8,"reg":"rip","refptr":8,"cycles":1,"failcycles":0,"delay":0,"ptrsize":8,"stackptr":0,"direction":"read","family":"cpu"}
{"opcode":"mov dword [rip+0x12345678], 0xdeadbeef","disasm":"mov dword [0x1234568e], 0xdeadbeef","pseudo":"dword [0x1234568e] = 0xdeadbeef","description":"moves data from src to dst","mnemonic":"mov","mask":"ff000000000000000000","esil":"0xffffffffdeadbeef,0x1234568e,=[4]","sign":false,"id":436,"opex":{"operands":[{"size":4,"rw":2,"type":"mem","segment":"ds","base":"rip","scale":0,"disp":305419896},{"size":4,"rw":1,"type":"imm","value":-559038737}],"modrm":true,"disp":305419896},"addr":12,"bytes":"c70578563412efbeadde","val":18446744073150512879,"ptr":305419918,"size":10,"type":"store","esilcost":12,"reg":"rip","refptr":4,"cycles":1,"failcycles":0,"delay":0,"ptrsize":4,"stackptr":0,"direction":"write","family":"cpu"}
EOF
RUN
NAME=x86 zydis branch and stack metadata
FILE=malloc://32
CMDS=<<EOF
e asm.arch=x86.zydis
e asm.bits=64
wx 50e8020000007501c3
pi 4
ao 4~^type,jump,fail,cond,stackop,stackptr
EOF
EXPECT=<<EOF
push rax
call 0x8
jnz 0x9
ret
type: rpush
stackop: inc
stackptr: 8
type: call
jump: 0x00000008
fail: 0x00000006
stackop: inc
stackptr: 8
type: cjmp
jump: 0x00000009
fail: 0x00000008
cond: ne
type: ret
stackop: inc
stackptr: 18446744073709551608
EOF
RUN
NAME=x86 zydis esil execution smoke
FILE=malloc://16
CMDS=<<EOF
e asm.arch=x86.zydis
e anal.arch=x86.zydis
e asm.bits=64
wx 4883c0054889c3
pi 2
aei
aer rax=7
aer rbx=0
s 0
aes
aes
aer rax
aer rbx
EOF
EXPECT=<<EOF
add rax, 0x05
mov rbx, rax
0x0000000c
0x0000000c
EOF
RUN
NAME=x86 zydis movsx zero-extends to rax
FILE=-
CMDS=<<EOF
e io.va=true
e asm.arch=x86.zydis
e anal.arch=x86.zydis
e asm.bits=64
aei
aeim
aeim 0x10000000 10 source
wx ff @ 0x10000000
aer rbx=0x10000000
aer rax=0
wx 0fbe03
s 0
aes
aer rax
EOF
EXPECT=<<EOF
0xffffffff
EOF
RUN
NAME=x86 zydis rep movsb esil execution
FILE=-
CMDS=<<EOF
e io.va=true
e asm.arch=x86.zydis
e anal.arch=x86.zydis
e asm.bits=32
aei
aeim
aeim 0x10000000 10 source
wx 1234567890 @ 0x10000000
aeim 0x20000000 10 destination
aer edi=0x20000000
aer esi=0x10000000
aer ecx=5
wx f3a4
aes
aer?edi
aer?esi
pv @0x20000000
aer?ecx
EOF
EXPECT=<<EOF
0x20000005
0x10000005
0x78563412
0x00000000
EOF
RUN
NAME=x86 zydis zero-count rep cmpsb/scasb
FILE=-
CMDS=<<EOF
e io.va=true
e asm.arch=x86.zydis
e anal.arch=x86.zydis
e asm.bits=32
aei
aeim
aeim 0x10000000 10 source
wx 12 @ 0x10000000
aeim 0x20000000 10 destination
wx 34 @ 0x20000000
wx f3a6
s 0
aer esi=0x10000000
aer edi=0x20000000
aer ecx=0
aes
aer esi
aer edi
aer ecx
s 0
wx f2ae
aer eax=0x12
aer edi=0x20000000
aer ecx=0
aes
aer edi
aer ecx
EOF
EXPECT=<<EOF
0x10000000
0x20000000
0x00000000
0x20000000
0x00000000
EOF
RUN