first commit

This commit is contained in:
寂静的羽夏 2022-08-23 18:17:27 +08:00
commit fea9c6052f
24 changed files with 1061 additions and 0 deletions

2
.gitignore vendored Executable file
View File

@ -0,0 +1,2 @@
**/*.pro.user
push.sh

54
README.md Normal file
View File

@ -0,0 +1,54 @@
<h1 align="center">WingSummer.WingHexAsm</h1>
<p align="center">
<img alt="WingHexPy" src="img/icon.png">
<p align="center">WingHexAsm</p>
</p>
<p align="center">
<img alt="作者" src="https://img.shields.io/badge/Author-Wingsummer-green">
<img alt="开源协议" src="https://img.shields.io/badge/License-AGPL--3.0-red">
</p>
- 开源不易,给个 Star 或者 [捐助](#捐助) 吧
## WingHexDisasm
&emsp;&emsp;`WingHexAsm`是一个羽云十六进制编辑器插件,它具将汇编语句转为硬编码的能力,基于`keystone`反汇编引擎框架。
### 协议
&emsp;&emsp;本插件仓库将采用`AGPL-3.0`协议,不得将该插件代码用于改协议之外的用途。
## 效果图
<p align="center">
<img alt="效果图" src="screenshot.png">
<p align="center">WingHexAsm</p>
</p>
## 注意事项
&emsp;&emsp;本插件仅支持`SDKVERSION >= 8`以上的“羽云十六进制编辑器”,也就是 1.4.8 及其以上的版本(该版本未被发布,请自行编译,预计 2022/8/25 发布该版本)。
## 捐助
**<p align="center">您的每一份支持都将是本项目推进的强大动力,十分感谢您的支持</p>**
<p align="center">
<img alt="支付宝" src="支付宝捐助.jpg" height=50% width=50%>
<p align="center">感谢支持</p>
</p>
<p align="center">
<img alt="微信" src="微信捐助.png" height=50% width=50%>
<p align="center">感谢支持</p>
</p>
## 有关仓库
* Gitea : https://code.gitlink.org.cn/wingsummer/WingHexAsm
* Gitee : https://gitee.com/wing-cloud/wing-hex-asm

3
WingHexAsm.json Normal file
View File

@ -0,0 +1,3 @@
{
"Keys" : [ ]
}

52
WingHexAsm.pro Normal file
View File

@ -0,0 +1,52 @@
#-------------------------------------------------
#
# Project created by QtCreator 2022-08-22T22:25:35
#
#-------------------------------------------------
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = WingHexAsm
TEMPLATE = lib
CONFIG += plugin
# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
winghexasm.cpp
HEADERS += \
winghexasm.h \
../WingHexExplorer/wing-hex-explorer.sourcecode/WingHexExplorer/plugin/iwingplugin.h \
keystone/arm.h \
keystone/arm64.h \
keystone/evm.h \
keystone/hexagon.h \
keystone/keystone.h \
keystone/mips.h \
keystone/ppc.h \
keystone/sparc.h \
keystone/systemz.h \
keystone/x86.h
LIBS += $$PWD/keystone/libkeystone.a
DISTFILES += WingHexAsm.json
RESOURCES += \
resource.qrc
TRANSLATIONS += \
$$PWD/WingHexAsm.ts

BIN
WingHexAsm.qm Normal file

Binary file not shown.

69
WingHexAsm.ts Normal file
View File

@ -0,0 +1,69 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="zh_CN">
<context>
<name>WingHexAsm</name>
<message>
<location filename="winghexasm.cpp" line="39"/>
<source>Arch :</source>
<translation></translation>
</message>
<message>
<location filename="winghexasm.cpp" line="79"/>
<source>Mode :</source>
<translation></translation>
</message>
<message>
<location filename="winghexasm.cpp" line="127"/>
<source>AsmCode</source>
<translation></translation>
</message>
<message>
<location filename="winghexasm.cpp" line="133"/>
<source>No Asm</source>
<translation></translation>
</message>
<message>
<location filename="winghexasm.cpp" line="138"/>
<location filename="winghexasm.cpp" line="142"/>
<source>AsmWindow</source>
<translation></translation>
</message>
<message>
<location filename="winghexasm.cpp" line="140"/>
<location filename="winghexasm.cpp" line="182"/>
<source>WingHexAsm</source>
<translation></translation>
</message>
<message>
<location filename="winghexasm.cpp" line="146"/>
<source>Author</source>
<translation></translation>
</message>
<message>
<location filename="winghexasm.cpp" line="152"/>
<source>Sponsor</source>
<translation></translation>
</message>
<message>
<location filename="winghexasm.cpp" line="191"/>
<source>A small assembly plugin for WingHexExplorer.</source>
<translation></translation>
</message>
<message>
<location filename="winghexasm.cpp" line="211"/>
<source>ERROR: failed on ks_open()</source>
<translation>ks_open() </translation>
</message>
<message>
<location filename="winghexasm.cpp" line="222"/>
<source>ERROR: failed on ks_asm() with count = %1, error code = %2</source>
<translation> ks_asm() count = %1, error code = %2</translation>
</message>
<message>
<location filename="winghexasm.cpp" line="238"/>
<source>ASMSuccessfully</source>
<translation></translation>
</message>
</context>
</TS>

16
img/README.md Normal file
View File

@ -0,0 +1,16 @@
## WingHexAsm
&emsp;&emsp;`WingHexAsm`是一个羽云十六进制编辑器插件,它具将汇编语句转为硬编码的能力,基于`keystone`反汇编引擎框架。
### 协议
&emsp;&emsp;本插件仓库将采用`AGPL-3.0`协议,不得将该插件代码用于改协议之外的用途。
## 如何使用
&emsp;&emsp;将插件注册到软件的插件系统当中之后,只需在文档中用鼠标框选字节,执行反汇编命令即可。
## 有关仓库
* Gitea : https://code.gitlink.org.cn/wingsummer/WingHexAsm
* Gitee : https://gitee.com/wing-cloud/wing-hex-asm

BIN
img/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

23
keystone/arm.h Normal file
View File

@ -0,0 +1,23 @@
/* Keystone Assembler Engine */
/* By Nguyen Anh Quynh, 2016 */
#ifndef KEYSTONE_ARM_H
#define KEYSTONE_ARM_H
#ifdef __cplusplus
extern "C" {
#endif
#include "keystone.h"
typedef enum ks_err_asm_arm {
KS_ERR_ASM_ARM_INVALIDOPERAND = KS_ERR_ASM_ARCH,
KS_ERR_ASM_ARM_MISSINGFEATURE,
KS_ERR_ASM_ARM_MNEMONICFAIL,
} ks_err_asm_arm;
#ifdef __cplusplus
}
#endif
#endif

23
keystone/arm64.h Normal file
View File

@ -0,0 +1,23 @@
/* Keystone Assembler Engine */
/* By Nguyen Anh Quynh, 2016 */
#ifndef KEYSTONE_ARM64_H
#define KEYSTONE_ARM64_H
#ifdef __cplusplus
extern "C" {
#endif
#include "keystone.h"
typedef enum ks_err_asm_arm64 {
KS_ERR_ASM_ARM64_INVALIDOPERAND = KS_ERR_ASM_ARCH,
KS_ERR_ASM_ARM64_MISSINGFEATURE,
KS_ERR_ASM_ARM64_MNEMONICFAIL,
} ks_err_asm_arm64;
#ifdef __cplusplus
}
#endif
#endif

23
keystone/evm.h Normal file
View File

@ -0,0 +1,23 @@
/* Keystone Assembler Engine */
/* By Nguyen Anh Quynh, 2016-2018 */
#ifndef KEYSTONE_EVM_H
#define KEYSTONE_EVM_H
#ifdef __cplusplus
extern "C" {
#endif
#include "keystone.h"
typedef enum ks_err_asm_evm {
KS_ERR_ASM_EVM_INVALIDOPERAND = KS_ERR_ASM_ARCH,
KS_ERR_ASM_EVM_MISSINGFEATURE,
KS_ERR_ASM_EVM_MNEMONICFAIL,
} ks_err_asm_evm;
#ifdef __cplusplus
}
#endif
#endif

24
keystone/hexagon.h Normal file
View File

@ -0,0 +1,24 @@
/* Keystone Assembler Engine */
/* By Nguyen Anh Quynh, 2016 */
#ifndef KEYSTONE_HEXAGON_H
#define KEYSTONE_HEXAGON_H
#ifdef __cplusplus
extern "C" {
#endif
#include "keystone.h"
typedef enum ks_err_asm_hexagon {
KS_ERR_ASM_HEXAGON_INVALIDOPERAND = KS_ERR_ASM_ARCH,
KS_ERR_ASM_HEXAGON_MISSINGFEATURE,
KS_ERR_ASM_HEXAGON_MNEMONICFAIL,
} ks_err_asm_hexagon;
#ifdef __cplusplus
}
#endif
#endif

341
keystone/keystone.h Normal file
View File

@ -0,0 +1,341 @@
/* Keystone Assembler Engine (www.keystone-engine.org) */
/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2016 */
#ifndef KEYSTONE_ENGINE_H
#define KEYSTONE_ENGINE_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#ifdef _MSC_VER // MSVC compiler
#pragma warning(disable:4201)
#pragma warning(disable:4100)
#ifndef KEYSTONE_STATIC
#define KEYSTONE_EXPORT __declspec(dllexport)
#else
#define KEYSTONE_EXPORT
#endif
#else
#ifdef __GNUC__
#include <stdbool.h>
#ifndef KEYSTONE_STATIC
#define KEYSTONE_EXPORT __attribute__((visibility("default")))
#else
#define KEYSTONE_EXPORT
#endif
#else
#define KEYSTONE_EXPORT
#endif
#endif
struct ks_struct;
typedef struct ks_struct ks_engine;
// Keystone API version
#define KS_API_MAJOR 0
#define KS_API_MINOR 9
// Package version
#define KS_VERSION_MAJOR KS_API_MAJOR
#define KS_VERSION_MINOR KS_API_MINOR
#define KS_VERSION_EXTRA 2
/*
Macro to create combined version which can be compared to
result of ks_version() API.
*/
#define KS_MAKE_VERSION(major, minor) ((major << 8) + minor)
// Architecture type
typedef enum ks_arch {
KS_ARCH_ARM = 1, // ARM architecture (including Thumb, Thumb-2)
KS_ARCH_ARM64, // ARM-64, also called AArch64
KS_ARCH_MIPS, // Mips architecture
KS_ARCH_X86, // X86 architecture (including x86 & x86-64)
KS_ARCH_PPC, // PowerPC architecture (currently unsupported)
KS_ARCH_SPARC, // Sparc architecture
KS_ARCH_SYSTEMZ, // SystemZ architecture (S390X)
KS_ARCH_HEXAGON, // Hexagon architecture
KS_ARCH_EVM, // Ethereum Virtual Machine architecture
KS_ARCH_MAX,
} ks_arch;
// Mode type
typedef enum ks_mode {
KS_MODE_LITTLE_ENDIAN = 0, // little-endian mode (default mode)
KS_MODE_BIG_ENDIAN = 1 << 30, // big-endian mode
// arm / arm64
KS_MODE_ARM = 1 << 0, // ARM mode
KS_MODE_THUMB = 1 << 4, // THUMB mode (including Thumb-2)
KS_MODE_V8 = 1 << 6, // ARMv8 A32 encodings for ARM
// mips
KS_MODE_MICRO = 1 << 4, // MicroMips mode
KS_MODE_MIPS3 = 1 << 5, // Mips III ISA
KS_MODE_MIPS32R6 = 1 << 6, // Mips32r6 ISA
KS_MODE_MIPS32 = 1 << 2, // Mips32 ISA
KS_MODE_MIPS64 = 1 << 3, // Mips64 ISA
// x86 / x64
KS_MODE_16 = 1 << 1, // 16-bit mode
KS_MODE_32 = 1 << 2, // 32-bit mode
KS_MODE_64 = 1 << 3, // 64-bit mode
// ppc
KS_MODE_PPC32 = 1 << 2, // 32-bit mode
KS_MODE_PPC64 = 1 << 3, // 64-bit mode
KS_MODE_QPX = 1 << 4, // Quad Processing eXtensions mode
// sparc
KS_MODE_SPARC32 = 1 << 2, // 32-bit mode
KS_MODE_SPARC64 = 1 << 3, // 64-bit mode
KS_MODE_V9 = 1 << 4, // SparcV9 mode
} ks_mode;
// All generic errors related to input assembly >= KS_ERR_ASM
#define KS_ERR_ASM 128
// All architecture-specific errors related to input assembly >= KS_ERR_ASM_ARCH
#define KS_ERR_ASM_ARCH 512
// All type of errors encountered by Keystone API.
typedef enum ks_err {
KS_ERR_OK = 0, // No error: everything was fine
KS_ERR_NOMEM, // Out-Of-Memory error: ks_open(), ks_emulate()
KS_ERR_ARCH, // Unsupported architecture: ks_open()
KS_ERR_HANDLE, // Invalid handle
KS_ERR_MODE, // Invalid/unsupported mode: ks_open()
KS_ERR_VERSION, // Unsupported version (bindings)
KS_ERR_OPT_INVALID, // Unsupported option
// generic input assembly errors - parser specific
KS_ERR_ASM_EXPR_TOKEN = KS_ERR_ASM, // unknown token in expression
KS_ERR_ASM_DIRECTIVE_VALUE_RANGE, // literal value out of range for directive
KS_ERR_ASM_DIRECTIVE_ID, // expected identifier in directive
KS_ERR_ASM_DIRECTIVE_TOKEN, // unexpected token in directive
KS_ERR_ASM_DIRECTIVE_STR, // expected string in directive
KS_ERR_ASM_DIRECTIVE_COMMA, // expected comma in directive
KS_ERR_ASM_DIRECTIVE_RELOC_NAME, // expected relocation name in directive
KS_ERR_ASM_DIRECTIVE_RELOC_TOKEN, // unexpected token in .reloc directive
KS_ERR_ASM_DIRECTIVE_FPOINT, // invalid floating point in directive
KS_ERR_ASM_DIRECTIVE_UNKNOWN, // unknown directive
KS_ERR_ASM_DIRECTIVE_EQU, // invalid equal directive
KS_ERR_ASM_DIRECTIVE_INVALID, // (generic) invalid directive
KS_ERR_ASM_VARIANT_INVALID, // invalid variant
KS_ERR_ASM_EXPR_BRACKET, // brackets expression not supported on this target
KS_ERR_ASM_SYMBOL_MODIFIER, // unexpected symbol modifier following '@'
KS_ERR_ASM_SYMBOL_REDEFINED, // invalid symbol redefinition
KS_ERR_ASM_SYMBOL_MISSING, // cannot find a symbol
KS_ERR_ASM_RPAREN, // expected ')' in parentheses expression
KS_ERR_ASM_STAT_TOKEN, // unexpected token at start of statement
KS_ERR_ASM_UNSUPPORTED, // unsupported token yet
KS_ERR_ASM_MACRO_TOKEN, // unexpected token in macro instantiation
KS_ERR_ASM_MACRO_PAREN, // unbalanced parentheses in macro argument
KS_ERR_ASM_MACRO_EQU, // expected '=' after formal parameter identifier
KS_ERR_ASM_MACRO_ARGS, // too many positional arguments
KS_ERR_ASM_MACRO_LEVELS_EXCEED, // macros cannot be nested more than 20 levels deep
KS_ERR_ASM_MACRO_STR, // invalid macro string
KS_ERR_ASM_MACRO_INVALID, // invalid macro (generic error)
KS_ERR_ASM_ESC_BACKSLASH, // unexpected backslash at end of escaped string
KS_ERR_ASM_ESC_OCTAL, // invalid octal escape sequence (out of range)
KS_ERR_ASM_ESC_SEQUENCE, // invalid escape sequence (unrecognized character)
KS_ERR_ASM_ESC_STR, // broken escape string
KS_ERR_ASM_TOKEN_INVALID, // invalid token
KS_ERR_ASM_INSN_UNSUPPORTED, // this instruction is unsupported in this mode
KS_ERR_ASM_FIXUP_INVALID, // invalid fixup
KS_ERR_ASM_LABEL_INVALID, // invalid label
KS_ERR_ASM_FRAGMENT_INVALID, // invalid fragment
// generic input assembly errors - architecture specific
KS_ERR_ASM_INVALIDOPERAND = KS_ERR_ASM_ARCH,
KS_ERR_ASM_MISSINGFEATURE,
KS_ERR_ASM_MNEMONICFAIL,
} ks_err;
// Resolver callback to provide value for a missing symbol in @symbol.
// To handle a symbol, the resolver must put value of the symbol in @value,
// then returns True.
// If we do not resolve a missing symbol, this function must return False.
// In that case, ks_asm() would eventually return with error KS_ERR_ASM_SYMBOL_MISSING.
// To register the resolver, pass its function address to ks_option(), using
// option KS_OPT_SYM_RESOLVER. For example, see samples/sample.c.
typedef bool (*ks_sym_resolver)(const char *symbol, uint64_t *value);
// Runtime option for the Keystone engine
typedef enum ks_opt_type {
KS_OPT_SYNTAX = 1, // Choose syntax for input assembly
KS_OPT_SYM_RESOLVER, // Set symbol resolver callback
} ks_opt_type;
// Runtime option value (associated with ks_opt_type above)
typedef enum ks_opt_value {
KS_OPT_SYNTAX_INTEL = 1 << 0, // X86 Intel syntax - default on X86 (KS_OPT_SYNTAX).
KS_OPT_SYNTAX_ATT = 1 << 1, // X86 ATT asm syntax (KS_OPT_SYNTAX).
KS_OPT_SYNTAX_NASM = 1 << 2, // X86 Nasm syntax (KS_OPT_SYNTAX).
KS_OPT_SYNTAX_MASM = 1 << 3, // X86 Masm syntax (KS_OPT_SYNTAX) - unsupported yet.
KS_OPT_SYNTAX_GAS = 1 << 4, // X86 GNU GAS syntax (KS_OPT_SYNTAX).
KS_OPT_SYNTAX_RADIX16 = 1 << 5, // All immediates are in hex format (i.e 12 is 0x12)
} ks_opt_value;
#include "arm64.h"
#include "arm.h"
#include "evm.h"
#include "hexagon.h"
#include "mips.h"
#include "ppc.h"
#include "sparc.h"
#include "systemz.h"
#include "x86.h"
/*
Return combined API version & major and minor version numbers.
@major: major number of API version
@minor: minor number of API version
@return hexical number as (major << 8 | minor), which encodes both
major & minor versions.
NOTE: This returned value can be compared with version number made
with macro KS_MAKE_VERSION
For example, second API version would return 1 in @major, and 1 in @minor
The return value would be 0x0101
NOTE: if you only care about returned value, but not major and minor values,
set both @major & @minor arguments to NULL.
*/
KEYSTONE_EXPORT
unsigned int ks_version(unsigned int *major, unsigned int *minor);
/*
Determine if the given architecture is supported by this library.
@arch: architecture type (KS_ARCH_*)
@return True if this library supports the given arch.
*/
KEYSTONE_EXPORT
bool ks_arch_supported(ks_arch arch);
/*
Create new instance of Keystone engine.
@arch: architecture type (KS_ARCH_*)
@mode: hardware mode. This is combined of KS_MODE_*
@ks: pointer to ks_engine, which will be updated at return time
@return KS_ERR_OK on success, or other value on failure (refer to ks_err enum
for detailed error).
*/
KEYSTONE_EXPORT
ks_err ks_open(ks_arch arch, int mode, ks_engine **ks);
/*
Close KS instance: MUST do to release the handle when it is not used anymore.
NOTE: this must be called only when there is no longer usage of Keystone.
The reason is the this API releases some cached memory, thus access to any
Keystone API after ks_close() might crash your application.
After this, @ks is invalid, and nolonger usable.
@ks: pointer to a handle returned by ks_open()
@return KS_ERR_OK on success, or other value on failure (refer to ks_err enum
for detailed error).
*/
KEYSTONE_EXPORT
ks_err ks_close(ks_engine *ks);
/*
Report the last error number when some API function fail.
Like glibc's errno, ks_errno might not retain its old error once accessed.
@ks: handle returned by ks_open()
@return: error code of ks_err enum type (KS_ERR_*, see above)
*/
KEYSTONE_EXPORT
ks_err ks_errno(ks_engine *ks);
/*
Return a string describing given error code.
@code: error code (see KS_ERR_* above)
@return: returns a pointer to a string that describes the error code
passed in the argument @code
*/
KEYSTONE_EXPORT
const char *ks_strerror(ks_err code);
/*
Set option for Keystone engine at runtime
@ks: handle returned by ks_open()
@type: type of option to be set. See ks_opt_type
@value: option value corresponding with @type
@return: KS_ERR_OK on success, or other value on failure.
Refer to ks_err enum for detailed error.
*/
KEYSTONE_EXPORT
ks_err ks_option(ks_engine *ks, ks_opt_type type, size_t value);
/*
Assemble a string given its the buffer, size, start address and number
of instructions to be decoded.
This API dynamically allocate memory to contain assembled instruction.
Resulted array of bytes containing the machine code is put into @*encoding
NOTE 1: this API will automatically determine memory needed to contain
output bytes in *encoding.
NOTE 2: caller must free the allocated memory itself to avoid memory leaking.
@ks: handle returned by ks_open()
@str: NULL-terminated assembly string. Use ; or \n to separate statements.
@address: address of the first assembly instruction, or 0 to ignore.
@encoding: array of bytes containing encoding of input assembly string.
NOTE: *encoding will be allocated by this function, and should be freed
with ks_free() function.
@encoding_size: size of *encoding
@stat_count: number of statements successfully processed
@return: 0 on success, or -1 on failure.
On failure, call ks_errno() for error code.
*/
KEYSTONE_EXPORT
int ks_asm(ks_engine *ks,
const char *string,
uint64_t address,
unsigned char **encoding, size_t *encoding_size,
size_t *stat_count);
/*
Free memory allocated by ks_asm()
@p: memory allocated in @encoding argument of ks_asm()
*/
KEYSTONE_EXPORT
void ks_free(unsigned char *p);
#ifdef __cplusplus
}
#endif
#endif

BIN
keystone/libkeystone.a Normal file

Binary file not shown.

23
keystone/mips.h Normal file
View File

@ -0,0 +1,23 @@
/* Keystone Assembler Engine */
/* By Nguyen Anh Quynh, 2016 */
#ifndef KEYSTONE_MIPS_H
#define KEYSTONE_MIPS_H
#ifdef __cplusplus
extern "C" {
#endif
#include "keystone.h"
typedef enum ks_err_asm_mips {
KS_ERR_ASM_MIPS_INVALIDOPERAND = KS_ERR_ASM_ARCH,
KS_ERR_ASM_MIPS_MISSINGFEATURE,
KS_ERR_ASM_MIPS_MNEMONICFAIL,
} ks_err_asm_mips;
#ifdef __cplusplus
}
#endif
#endif

24
keystone/ppc.h Normal file
View File

@ -0,0 +1,24 @@
/* Keystone Assembler Engine */
/* By Nguyen Anh Quynh, 2016 */
#ifndef KEYSTONE_PPC_H
#define KEYSTONE_PPC_H
#ifdef __cplusplus
extern "C" {
#endif
#include "keystone.h"
typedef enum ks_err_asm_ppc {
KS_ERR_ASM_PPC_INVALIDOPERAND = KS_ERR_ASM_ARCH,
KS_ERR_ASM_PPC_MISSINGFEATURE,
KS_ERR_ASM_PPC_MNEMONICFAIL,
} ks_err_asm_ppc;
#ifdef __cplusplus
}
#endif
#endif

24
keystone/sparc.h Normal file
View File

@ -0,0 +1,24 @@
/* Keystone Assembler Engine */
/* By Nguyen Anh Quynh, 2016 */
#ifndef KEYSTONE_SPARC_H
#define KEYSTONE_SPARC_H
#ifdef __cplusplus
extern "C" {
#endif
#include "keystone.h"
typedef enum ks_err_asm_sparc {
KS_ERR_ASM_SPARC_INVALIDOPERAND = KS_ERR_ASM_ARCH,
KS_ERR_ASM_SPARC_MISSINGFEATURE,
KS_ERR_ASM_SPARC_MNEMONICFAIL,
} ks_err_asm_sparc;
#ifdef __cplusplus
}
#endif
#endif

24
keystone/systemz.h Normal file
View File

@ -0,0 +1,24 @@
/* Keystone Assembler Engine */
/* By Nguyen Anh Quynh, 2016 */
#ifndef KEYSTONE_SYSTEMZ_H
#define KEYSTONE_SYSTEMZ_H
#ifdef __cplusplus
extern "C" {
#endif
#include "keystone.h"
typedef enum ks_err_asm_systemz {
KS_ERR_ASM_SYSTEMZ_INVALIDOPERAND = KS_ERR_ASM_ARCH,
KS_ERR_ASM_SYSTEMZ_MISSINGFEATURE,
KS_ERR_ASM_SYSTEMZ_MNEMONICFAIL,
} ks_err_asm_systemz;
#ifdef __cplusplus
}
#endif
#endif

23
keystone/x86.h Normal file
View File

@ -0,0 +1,23 @@
/* Keystone Assembler Engine */
/* By Nguyen Anh Quynh, 2016 */
#ifndef KEYSTONE_X86_H
#define KEYSTONE_X86_H
#ifdef __cplusplus
extern "C" {
#endif
#include "keystone.h"
typedef enum ks_err_asm_x86 {
KS_ERR_ASM_X86_INVALIDOPERAND = KS_ERR_ASM_ARCH,
KS_ERR_ASM_X86_MISSINGFEATURE,
KS_ERR_ASM_X86_MNEMONICFAIL,
} ks_err_asm_x86;
#ifdef __cplusplus
}
#endif
#endif

6
resource.qrc Normal file
View File

@ -0,0 +1,6 @@
<RCC>
<qresource prefix="/WingHexAsm">
<file>img/icon.png</file>
<file>img/README.md</file>
</qresource>
</RCC>

255
winghexasm.cpp Normal file
View File

@ -0,0 +1,255 @@
#include "winghexasm.h"
#include <QApplication>
#include <QHBoxLayout>
#include <QLabel>
#include <QMessageBox>
#include <QMetaEnum>
#include <QPushButton>
#include <QSettings>
#include <QVBoxLayout>
#define ICONRES(name) QIcon(":/WingHexAsm/img/" name ".png")
#define HOSTICONRES(name) QIcon(HOSTRESPIMG(name))
WingHexAsm::WingHexAsm(QObject *parent) { Q_UNUSED(parent) }
bool WingHexAsm::init(QList<WingPluginInfo> loadedplugin) {
Q_UNUSED(loadedplugin);
if (SDKVERSION < 8) {
QMessageBox::critical(nullptr, "Error",
"UnSupported Plugin System Version!",
QMessageBox::Ok);
return false;
}
auto translator = new QTranslator(this);
auto s = GETPLUGINQM("WingHexAsm.qm");
if (!translator->load(s) || !QApplication::installTranslator(translator)) {
QMessageBox::critical(nullptr, "Error", "Error Loading Translation File!",
QMessageBox::Ok);
return false;
}
w = new QWidget;
auto vlayout = new QVBoxLayout(w);
auto hlayout = new QHBoxLayout(w);
hlayout->addWidget(new QLabel(tr("Arch :"), w));
hlayout->addSpacing(10);
// 默认 x86_64 64 位指令
arch = new QComboBox(w);
QStringList archs(
{"ARM", "ARM64", "MIPS", "X86_64", "PPC", "SPARC", "EVM", "MOS65XX"});
arch->addItems(archs);
arch->setCurrentIndex(3);
void (QComboBox::*indexChanged)(int index) = &QComboBox::currentIndexChanged;
connect(arch, indexChanged, [=](int index) {
switch (index) {
case 0:
karch = ks_arch::KS_ARCH_ARM;
break;
case 1:
karch = ks_arch::KS_ARCH_ARM64;
break;
case 2:
karch = ks_arch::KS_ARCH_MIPS;
break;
case 3:
karch = ks_arch::KS_ARCH_X86;
break;
case 4:
karch = ks_arch::KS_ARCH_PPC;
break;
case 5:
karch = ks_arch::KS_ARCH_SPARC;
break;
case 6:
karch = ks_arch::KS_ARCH_EVM;
break;
}
});
hlayout->addWidget(arch);
hlayout->addSpacing(30);
hlayout->addWidget(new QLabel(tr("Mode :"), w));
hlayout->addSpacing(10);
mode = new QComboBox(w);
QStringList modes({"x16", "x32", "x64", "THUMB", "MIPS32", "MIPS64"});
mode->addItems(modes);
mode->setCurrentIndex(2);
connect(mode, indexChanged, [=](int index) {
switch (index) {
case 0:
kmode = ks_mode::KS_MODE_16;
break;
case 1:
kmode = ks_mode::KS_MODE_32;
break;
case 2:
kmode = ks_mode::KS_MODE_64;
break;
case 3:
kmode = ks_mode::KS_MODE_THUMB;
break;
case 4:
kmode = ks_mode::KS_MODE_MIPS32;
break;
case 5:
kmode = ks_mode::KS_MODE_MIPS64;
break;
}
});
hlayout->addWidget(mode);
hlayout->addSpacing(10);
cbintel = new QCheckBox("Intel", w);
cbintel->setChecked(true);
hlayout->addWidget(cbintel);
hlayout->addStretch();
vlayout->addSpacing(10);
txtAsm = new QTextBrowser(w);
txtAsm->setReadOnly(false);
vlayout->addItem(hlayout);
vlayout->addWidget(txtAsm);
vlayout->addSpacing(10);
auto asmbtn = new QPushButton(tr("AsmCode"), w);
connect(asmbtn, &QPushButton::clicked, this, [=] {
auto txt = txtAsm->toPlainText();
if (txt.length()) {
this->asmCode(txt);
} else {
this->toast(ICONRES("icon"), tr("No Asm"));
}
});
vlayout->addWidget(asmbtn);
PluginDockWidgetInit(dw, w, tr("AsmWindow"), "AsmWindow");
PluginMenuInitBegin(menu, tr("WingHexAsm")) {
menu->setIcon(ICONRES("icon"));
PluginMenuAddItemIconLamba(menu, tr("AsmWindow"), ICONRES("icon"), [=] {
dw->show();
dw->raise();
});
PluginMenuAddItemIconLamba(menu, tr("Author"), HOSTICONRES("author"), [=] {
auto authord =
newAboutDialog(QPixmap(), {":/WingHexAsm", ":/WingHexAsm/img"});
authord->exec();
delete authord;
});
PluginMenuAddItemIconLamba(menu, tr("Sponsor"), HOSTICONRES("sponsor"),
[=] {
auto sponsor = newSponsorDialog();
sponsor->exec();
delete sponsor;
});
}
PluginMenuInitEnd();
tbtn = new QToolButton;
tbtn->setIcon(ICONRES("icon"));
connect(tbtn, &QToolButton::clicked, this, [=] {
dw->show();
dw->raise();
});
return true;
}
WingHexAsm::~WingHexAsm() {}
void WingHexAsm::unload() {}
int WingHexAsm::sdkVersion() { return SDKVERSION; }
QMenu *WingHexAsm::registerMenu() { return menu; }
QToolButton *WingHexAsm::registerToolButton() { return tbtn; }
void WingHexAsm::registerDockWidget(
QMap<QDockWidget *, Qt::DockWidgetArea> &rdw) {
rdw.insert(dw, Qt::DockWidgetArea::BottomDockWidgetArea);
}
QString WingHexAsm::pluginName() { return tr("WingHexAsm"); }
QString WingHexAsm::pluginAuthor() { return WINGSUMMER; }
uint WingHexAsm::pluginVersion() { return 1; }
QString WingHexAsm::signature() { return WINGSUMMER; }
QString WingHexAsm::pluginComment() {
return tr("A small assembly plugin for WingHexExplorer.");
}
void WingHexAsm::plugin2MessagePipe(WingPluginMessage type,
QList<QVariant> msg) {
Q_UNUSED(type);
Q_UNUSED(msg);
}
void WingHexAsm::asmCode(QString code) {
ks_engine *ks;
ks_err err;
size_t count;
unsigned char *encode;
size_t size;
QIcon icon = ICONRES("icon");
err = ks_open(karch, kmode, &ks);
if (err != KS_ERR_OK) {
toast(icon, tr("ERROR: failed on ks_open()"));
return;
}
if (cbintel->isChecked()) {
ks_option(ks, KS_OPT_SYNTAX, KS_OPT_SYNTAX_INTEL);
} else {
ks_option(ks, KS_OPT_SYNTAX, KS_OPT_SYNTAX_ATT);
}
if (ks_asm(ks, code.toUtf8().constData(), 0, &encode, &size, &count)) {
toast(icon, tr("ERROR: failed on ks_asm() with count = %1, error code = %2")
.arg(count)
.arg(ks_errno(ks)));
} else {
QByteArray buffer(reinterpret_cast<char *>(encode), int(size));
if (reader.currentDoc() < 0) {
USINGCONTROL({
controller.newFile();
controller.insert(0, buffer); // 直接使用 insert 会比 append 更高效一点
});
} else {
USINGCONTROL({
auto pos = reader.currentOffset();
controller.insert(qint64(pos), buffer);
});
}
toast(icon, tr("ASMSuccessfully"));
}
// NOTE: free encode after usage to avoid leaking memory
ks_free(encode);
// close Keystone instance when done
ks_close(ks);
}
#if QT_VERSION < 0x050000
Q_EXPORT_PLUGIN2(WingHexAsm, WingHexAsm)
#endif // QT_VERSION < 0x050000

52
winghexasm.h Normal file
View File

@ -0,0 +1,52 @@
#ifndef WINGHEXASM_H
#define WINGHEXASM_H
#include "../WingHexExplorer/wing-hex-explorer.sourcecode/WingHexExplorer/plugin/iwingplugin.h"
#include "keystone/keystone.h"
#include <QCheckBox>
#include <QComboBox>
#include <QTextBrowser>
class WingHexAsm : public IWingPlugin {
Q_OBJECT
#if QT_VERSION >= 0x050000
Q_PLUGIN_METADATA(IID IWINGPLUGIN_INTERFACE_IID FILE "WingHexAsm.json")
#endif // QT_VERSION >= 0x050000
Q_INTERFACES(IWingPlugin)
public:
WingHexAsm(QObject *parent = nullptr);
bool init(QList<WingPluginInfo> loadedplugin) override;
~WingHexAsm() override;
void unload() override;
int sdkVersion() override;
QMenu *registerMenu() override;
QToolButton *registerToolButton() override;
void
registerDockWidget(QMap<QDockWidget *, Qt::DockWidgetArea> &rdw) override;
QString pluginName() override;
QString pluginAuthor() override;
uint pluginVersion() override;
QString signature() override;
QString pluginComment() override;
void plugin2MessagePipe(WingPluginMessage type, QList<QVariant> msg) override;
private:
void asmCode(QString code);
private:
QMenu *menu;
QToolButton *tbtn;
QWidget *w;
QDockWidget *dw;
QTextBrowser *txtAsm;
QComboBox *arch, *mode;
QCheckBox *cbintel;
ks_arch karch = ks_arch::KS_ARCH_X86;
ks_mode kmode = ks_mode::KS_MODE_64;
};
#endif // WINGHEXASM_H

BIN
微信捐助.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

BIN
支付宝捐助.jpg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB