Command interpetation
This commit is contained in:
parent
b5f8ed9456
commit
55baaa8952
BIN
example.exe
BIN
example.exe
Binary file not shown.
616
ntfiles.h
616
ntfiles.h
@ -24,12 +24,616 @@
|
||||
#if (!defined(__LIB_ntfiles_H))
|
||||
#define __LIB_ntfiles_H
|
||||
|
||||
typedef unsigned char __e_byte_t;
|
||||
typedef unsigned char byte_t;
|
||||
typedef unsigned short int word_t;
|
||||
|
||||
typedef struct {
|
||||
__e_byte_t e_magic[3];
|
||||
__e_byte_t e_filesize[4];
|
||||
__e_byte_t e_memorysize[2];
|
||||
} __e_image_header_t;
|
||||
#if defined(__LP64__) || defined(_M_IA64)
|
||||
typedef unsigned int dword_t;
|
||||
typedef unsigned long int qword_t;
|
||||
#else
|
||||
typedef unsigned long int dword_t;
|
||||
typedef unsigned long long int qword_t;
|
||||
#endif
|
||||
|
||||
typedef signed char sbyte_t;
|
||||
typedef signed short int sword_t;
|
||||
|
||||
#if defined(__LP64__) || defined(_M_IA64)
|
||||
typedef signed int sdword_t;
|
||||
typedef signed long int sqword_t;
|
||||
#else
|
||||
typedef signed long int sdword_t;
|
||||
typedef signed long long int sqword_t;
|
||||
#endif
|
||||
|
||||
#define stack __ntsys_stack
|
||||
#define sp __ntsys_stack_pointer
|
||||
#define buf __ntsys_buffer
|
||||
#define cnt __ntsys_buffer_ptr
|
||||
#define ip __ntsys_buffer_ptr
|
||||
|
||||
static void push(void) {
|
||||
size_t size = buf[cnt];
|
||||
sp -= size;
|
||||
size_t t = 0;
|
||||
while (t < size) {
|
||||
stack[sp + t] = buf[++cnt];
|
||||
t ++;
|
||||
}
|
||||
cnt ++;
|
||||
}
|
||||
|
||||
static void pop(void) {
|
||||
sp += buf[cnt++];
|
||||
}
|
||||
|
||||
static void push_str(void) {
|
||||
size_t size = 0;
|
||||
while (buf[cnt] != 0) {
|
||||
size ++;
|
||||
cnt ++;
|
||||
}
|
||||
size ++;
|
||||
cnt -= size;
|
||||
sp -= size;
|
||||
size_t t = 0;
|
||||
while (t < size) {
|
||||
stack[sp + t] = buf[++cnt];
|
||||
t ++;
|
||||
}
|
||||
cnt ++;
|
||||
}
|
||||
|
||||
__e_byte_t arg1_fGH6VSEzu7qNiGVE[8];
|
||||
__e_byte_t arg2_fGH6VSEzu7qNiGVE[8];
|
||||
|
||||
#define arg1 arg1_fGH6VSEzu7qNiGVE
|
||||
#define arg2 arg2_fGH6VSEzu7qNiGVE
|
||||
|
||||
static void pop_arg(size_t size, __e_byte_t* arg) {
|
||||
int __i = 1;
|
||||
if (!(*((char *)&__i) == 1)) {
|
||||
/* BIG ENDIAN */
|
||||
size_t i = 0;
|
||||
while (i < size) {
|
||||
arg[size - i - 1] = stack[sp + i];
|
||||
i ++;
|
||||
}
|
||||
sp += size;
|
||||
} else {
|
||||
/* LITTLE ENDIAN */
|
||||
size_t i = 0;
|
||||
while (i < size) {
|
||||
arg[i] = stack[sp + i];
|
||||
i ++;
|
||||
}
|
||||
sp += size;
|
||||
}
|
||||
}
|
||||
|
||||
static void nt_not() {
|
||||
size_t size = buf[cnt++];
|
||||
pop_arg(size, arg1);
|
||||
sp -= size;
|
||||
size_t i = 0;
|
||||
while (i < size) {
|
||||
stack[sp + i] = ~arg1[i];
|
||||
i ++;
|
||||
}
|
||||
}
|
||||
|
||||
static void operation(__e_byte_t op) {
|
||||
size_t size = buf[cnt++];
|
||||
pop_arg(size & 0x0F, arg1);
|
||||
pop_arg(size & 0x0F, arg2);
|
||||
switch (op) {
|
||||
case 1:
|
||||
switch (size) {
|
||||
case 0x01:
|
||||
*(byte_t*)arg1 = *(byte_t*)arg1 + *(byte_t*)arg2;
|
||||
break;
|
||||
case 0x02:
|
||||
*(word_t*)arg1 = *(word_t*)arg1 + *(word_t*)arg2;
|
||||
break;
|
||||
case 0x04:
|
||||
*(dword_t*)arg1 = *(dword_t*)arg1 + *(dword_t*)arg2;
|
||||
break;
|
||||
case 0x08:
|
||||
*(qword_t*)arg1 = *(qword_t*)arg1 + *(qword_t*)arg2;
|
||||
break;
|
||||
case 0xF1:
|
||||
*(sbyte_t*)arg1 = *(sbyte_t*)arg1 + *(sbyte_t*)arg2;
|
||||
break;
|
||||
case 0xF2:
|
||||
*(sword_t*)arg1 = *(sword_t*)arg1 + *(sword_t*)arg2;
|
||||
break;
|
||||
case 0xF4:
|
||||
*(sdword_t*)arg1 = *(sdword_t*)arg1 + *(sdword_t*)arg2;
|
||||
break;
|
||||
case 0xF8:
|
||||
*(sqword_t*)arg1 = *(sqword_t*)arg1 + *(sqword_t*)arg2;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
switch (size) {
|
||||
case 0x01:
|
||||
*(byte_t*)arg1 = *(byte_t*)arg1 - *(byte_t*)arg2;
|
||||
break;
|
||||
case 0x02:
|
||||
*(word_t*)arg1 = *(word_t*)arg1 - *(word_t*)arg2;
|
||||
break;
|
||||
case 0x04:
|
||||
*(dword_t*)arg1 = *(dword_t*)arg1 - *(dword_t*)arg2;
|
||||
break;
|
||||
case 0x08:
|
||||
*(qword_t*)arg1 = *(qword_t*)arg1 - *(qword_t*)arg2;
|
||||
break;
|
||||
case 0xF1:
|
||||
*(sbyte_t*)arg1 = *(sbyte_t*)arg1 - *(sbyte_t*)arg2;
|
||||
break;
|
||||
case 0xF2:
|
||||
*(sword_t*)arg1 = *(sword_t*)arg1 - *(sword_t*)arg2;
|
||||
break;
|
||||
case 0xF4:
|
||||
*(sdword_t*)arg1 = *(sdword_t*)arg1 - *(sdword_t*)arg2;
|
||||
break;
|
||||
case 0xF8:
|
||||
*(sqword_t*)arg1 = *(sqword_t*)arg1 - *(sqword_t*)arg2;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
switch (size) {
|
||||
case 0x01:
|
||||
*(byte_t*)arg1 = *(byte_t*)arg1 * (*(byte_t*)arg2);
|
||||
break;
|
||||
case 0x02:
|
||||
*(word_t*)arg1 = *(word_t*)arg1 * (*(byte_t*)arg2);
|
||||
break;
|
||||
case 0x04:
|
||||
*(dword_t*)arg1 = *(dword_t*)arg1 * (*(byte_t*)arg2);
|
||||
break;
|
||||
case 0x08:
|
||||
*(qword_t*)arg1 = *(qword_t*)arg1 * (*(byte_t*)arg2);
|
||||
break;
|
||||
case 0xF1:
|
||||
*(sbyte_t*)arg1 = *(sbyte_t*)arg1 * (*(byte_t*)arg2);
|
||||
break;
|
||||
case 0xF2:
|
||||
*(sword_t*)arg1 = *(sword_t*)arg1 * (*(byte_t*)arg2);
|
||||
break;
|
||||
case 0xF4:
|
||||
*(sdword_t*)arg1 = *(sdword_t*)arg1 * (*(byte_t*)arg2);
|
||||
break;
|
||||
case 0xF8:
|
||||
*(sqword_t*)arg1 = *(sqword_t*)arg1 * (*(byte_t*)arg2);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
switch (size) {
|
||||
case 0x01:
|
||||
*(byte_t*)arg1 = *(byte_t*)arg1 / *(byte_t*)arg2;
|
||||
break;
|
||||
case 0x02:
|
||||
*(word_t*)arg1 = *(word_t*)arg1 / *(word_t*)arg2;
|
||||
break;
|
||||
case 0x04:
|
||||
*(dword_t*)arg1 = *(dword_t*)arg1 / *(dword_t*)arg2;
|
||||
break;
|
||||
case 0x08:
|
||||
*(qword_t*)arg1 = *(qword_t*)arg1 / *(qword_t*)arg2;
|
||||
break;
|
||||
case 0xF1:
|
||||
*(sbyte_t*)arg1 = *(sbyte_t*)arg1 / *(sbyte_t*)arg2;
|
||||
break;
|
||||
case 0xF2:
|
||||
*(sword_t*)arg1 = *(sword_t*)arg1 / *(sword_t*)arg2;
|
||||
break;
|
||||
case 0xF4:
|
||||
*(sdword_t*)arg1 = *(sdword_t*)arg1 / *(sdword_t*)arg2;
|
||||
break;
|
||||
case 0xF8:
|
||||
*(sqword_t*)arg1 = *(sqword_t*)arg1 / *(sqword_t*)arg2;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
sp -= size & 0x0F;
|
||||
size_t i = 0;
|
||||
while (i < (size & 0x0F)) {
|
||||
stack[sp + i] = arg1[i];
|
||||
i ++;
|
||||
}
|
||||
}
|
||||
|
||||
static void add(void) {
|
||||
operation(1);
|
||||
}
|
||||
|
||||
static void sub(void) {
|
||||
operation(2);
|
||||
}
|
||||
|
||||
static void mul(void) {
|
||||
operation(3);
|
||||
}
|
||||
|
||||
static void div_r(void) {
|
||||
operation(4);
|
||||
}
|
||||
|
||||
static void logic_operation(__e_byte_t n) {
|
||||
size_t size = buf[cnt++];
|
||||
pop_arg(size, arg1);
|
||||
pop_arg(size, arg2);
|
||||
switch (n) {
|
||||
case 1:
|
||||
switch (size) {
|
||||
case 0x01:
|
||||
*(byte_t*)arg1 = *(byte_t*)arg1 >> *(byte_t*)arg2;
|
||||
case 0x02:
|
||||
*(word_t*)arg1 = *(word_t*)arg1 >> *(word_t*)arg2;
|
||||
case 0x04:
|
||||
*(dword_t*)arg1 = *(dword_t*)arg1 >> *(dword_t*)arg2;
|
||||
case 0x08:
|
||||
*(qword_t*)arg1 = *(qword_t*)arg1 >> *(qword_t*)arg2;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
switch (size) {
|
||||
case 0x01:
|
||||
*(byte_t*)arg1 = *(byte_t*)arg1 << *(byte_t*)arg2;
|
||||
case 0x02:
|
||||
*(word_t*)arg1 = *(word_t*)arg1 << *(word_t*)arg2;
|
||||
case 0x04:
|
||||
*(dword_t*)arg1 = *(dword_t*)arg1 << *(dword_t*)arg2;
|
||||
case 0x08:
|
||||
*(qword_t*)arg1 = *(qword_t*)arg1 << *(qword_t*)arg2;
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
switch (size) {
|
||||
case 0x01:
|
||||
*(byte_t*)arg1 = *(byte_t*)arg1 | *(byte_t*)arg2;
|
||||
case 0x02:
|
||||
*(word_t*)arg1 = *(word_t*)arg1 | *(word_t*)arg2;
|
||||
case 0x04:
|
||||
*(dword_t*)arg1 = *(dword_t*)arg1 | *(dword_t*)arg2;
|
||||
case 0x08:
|
||||
*(qword_t*)arg1 = *(qword_t*)arg1 | *(qword_t*)arg2;
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
switch (size) {
|
||||
case 0x01:
|
||||
*(byte_t*)arg1 = *(byte_t*)arg1 & *(byte_t*)arg2;
|
||||
case 0x02:
|
||||
*(word_t*)arg1 = *(word_t*)arg1 & *(word_t*)arg2;
|
||||
case 0x04:
|
||||
*(dword_t*)arg1 = *(dword_t*)arg1 & *(dword_t*)arg2;
|
||||
case 0x08:
|
||||
*(qword_t*)arg1 = *(qword_t*)arg1 & *(qword_t*)arg2;
|
||||
}
|
||||
break;
|
||||
case 5:
|
||||
switch (size) {
|
||||
case 0x01:
|
||||
*(byte_t*)arg1 = *(byte_t*)arg1 ^ *(byte_t*)arg2;
|
||||
case 0x02:
|
||||
*(word_t*)arg1 = *(word_t*)arg1 ^ *(word_t*)arg2;
|
||||
case 0x04:
|
||||
*(dword_t*)arg1 = *(dword_t*)arg1 ^ *(dword_t*)arg2;
|
||||
case 0x08:
|
||||
*(qword_t*)arg1 = *(qword_t*)arg1 ^ *(qword_t*)arg2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
sp -= size;
|
||||
size_t i = 0;
|
||||
while (i < size) {
|
||||
stack[sp + i] = arg1[i];
|
||||
i ++;
|
||||
}
|
||||
}
|
||||
|
||||
static void nt_shr(void) {
|
||||
logic_operation(1);
|
||||
}
|
||||
|
||||
static void nt_shl(void) {
|
||||
logic_operation(2);
|
||||
}
|
||||
|
||||
static void nt_or(void) {
|
||||
logic_operation(3);
|
||||
}
|
||||
|
||||
static void nt_and(void) {
|
||||
logic_operation(4);
|
||||
}
|
||||
|
||||
static void nt_xor(void) {
|
||||
logic_operation(5);
|
||||
}
|
||||
|
||||
static void nt_goto(void) {
|
||||
pop_arg(2, arg1);
|
||||
cnt = *(word_t*)arg1;
|
||||
}
|
||||
|
||||
static void bez_bnez(__e_byte_t mode) {
|
||||
size_t size = buf[cnt++];
|
||||
pop_arg(size & 0x0F, arg1);
|
||||
__e_byte_t res = 0;
|
||||
switch (size) {
|
||||
case 0x01:
|
||||
if (*(byte_t*)arg1 == 0) res = 1;
|
||||
break;
|
||||
case 0x02:
|
||||
if (*(word_t*)arg1 == 0) res = 1;
|
||||
break;
|
||||
case 0x04:
|
||||
if (*(dword_t*)arg1 == 0) res = 1;
|
||||
break;
|
||||
case 0x08:
|
||||
if (*(qword_t*)arg1 == 0) res = 1;
|
||||
break;
|
||||
case 0xF1:
|
||||
if (*(sbyte_t*)arg1 == 0) res = 1;
|
||||
break;
|
||||
case 0xF2:
|
||||
if (*(sword_t*)arg1 == 0) res = 1;
|
||||
break;
|
||||
case 0xF4:
|
||||
if (*(sdword_t*)arg1 == 0) res = 1;
|
||||
break;
|
||||
case 0xF8:
|
||||
if (*(sqword_t*)arg1 == 0) res = 1;
|
||||
break;
|
||||
}
|
||||
if (mode) res = !res;
|
||||
pop_arg(2, arg2);
|
||||
if (res) {
|
||||
cnt = *(word_t*)arg2;
|
||||
}
|
||||
}
|
||||
|
||||
static void push_arg(size_t size, __e_byte_t* arg) {
|
||||
sp -= size;
|
||||
size_t i = 0;
|
||||
while (i < size) {
|
||||
stack[sp + i] = arg[i];
|
||||
i ++;
|
||||
}
|
||||
}
|
||||
|
||||
static void n_up_down_eq(__e_byte_t mode) {
|
||||
size_t size = buf[cnt++];
|
||||
pop_arg(size & 0x0F, arg1);
|
||||
pop_arg(size & 0x0F, arg2);
|
||||
__e_byte_t res = 0;
|
||||
switch (mode & 0x0F) {
|
||||
case 0:
|
||||
switch (size) {
|
||||
case 0x01:
|
||||
if (*(byte_t*)arg1 == *(byte_t*)arg2) res = 1;
|
||||
break;
|
||||
case 0x02:
|
||||
if (*(word_t*)arg1 == *(word_t*)arg2) res = 1;
|
||||
break;
|
||||
case 0x04:
|
||||
if (*(dword_t*)arg1 == *(dword_t*)arg2) res = 1;
|
||||
break;
|
||||
case 0x08:
|
||||
if (*(qword_t*)arg1 == *(qword_t*)arg2) res = 1;
|
||||
break;
|
||||
case 0xF1:
|
||||
if (*(qword_t*)arg1 == *(qword_t*)arg2) res = 1;
|
||||
break;
|
||||
case 0xF2:
|
||||
if (*(sword_t*)arg1 == *(sword_t*)arg2) res = 1;
|
||||
break;
|
||||
case 0xF4:
|
||||
if (*(sdword_t*)arg1 == *(sdword_t*)arg2) res = 1;
|
||||
break;
|
||||
case 0xF8:
|
||||
if (*(sqword_t*)arg1 == *(sqword_t*)arg2) res = 1;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
switch (size) {
|
||||
case 0x01:
|
||||
if (*(byte_t*)arg1 > *(byte_t*)arg2) res = 1;
|
||||
break;
|
||||
case 0x02:
|
||||
if (*(word_t*)arg1 > *(word_t*)arg2) res = 1;
|
||||
break;
|
||||
case 0x04:
|
||||
if (*(dword_t*)arg1 > *(dword_t*)arg2) res = 1;
|
||||
break;
|
||||
case 0x08:
|
||||
if (*(qword_t*)arg1 > *(qword_t*)arg2) res = 1;
|
||||
break;
|
||||
case 0xF1:
|
||||
if (*(qword_t*)arg1 > *(qword_t*)arg2) res = 1;
|
||||
break;
|
||||
case 0xF2:
|
||||
if (*(sword_t*)arg1 > *(sword_t*)arg2) res = 1;
|
||||
break;
|
||||
case 0xF4:
|
||||
if (*(sdword_t*)arg1 > *(sdword_t*)arg2) res = 1;
|
||||
break;
|
||||
case 0xF8:
|
||||
if (*(sqword_t*)arg1 > *(sqword_t*)arg2) res = 1;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
switch (size) {
|
||||
case 0x01:
|
||||
if (*(byte_t*)arg1 < *(byte_t*)arg2) res = 1;
|
||||
break;
|
||||
case 0x02:
|
||||
if (*(word_t*)arg1 < *(word_t*)arg2) res = 1;
|
||||
break;
|
||||
case 0x04:
|
||||
if (*(dword_t*)arg1 < *(dword_t*)arg2) res = 1;
|
||||
break;
|
||||
case 0x08:
|
||||
if (*(qword_t*)arg1 < *(qword_t*)arg2) res = 1;
|
||||
break;
|
||||
case 0xF1:
|
||||
if (*(qword_t*)arg1 < *(qword_t*)arg2) res = 1;
|
||||
break;
|
||||
case 0xF2:
|
||||
if (*(sword_t*)arg1 < *(sword_t*)arg2) res = 1;
|
||||
break;
|
||||
case 0xF4:
|
||||
if (*(sdword_t*)arg1 < *(sdword_t*)arg2) res = 1;
|
||||
break;
|
||||
case 0xF8:
|
||||
if (*(sqword_t*)arg1 < *(sqword_t*)arg2) res = 1;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if ((mode & 0xF0) == 0xF0) res = !res;
|
||||
pop_arg(2, arg2);
|
||||
if (res) {
|
||||
cnt = *(word_t*)arg2;
|
||||
}
|
||||
}
|
||||
|
||||
static void eq(void) {
|
||||
n_up_down_eq(0x00);
|
||||
}
|
||||
|
||||
static void neq(void) {
|
||||
n_up_down_eq(0xF0);
|
||||
}
|
||||
|
||||
static void up(void) {
|
||||
n_up_down_eq(0x01);
|
||||
}
|
||||
|
||||
static void down(void) {
|
||||
n_up_down_eq(0x02);
|
||||
}
|
||||
|
||||
static void upne(void) {
|
||||
n_up_down_eq(0xF1);
|
||||
}
|
||||
|
||||
static void downe(void) {
|
||||
n_up_down_eq(0xF2);
|
||||
}
|
||||
|
||||
static void bnez(void) {
|
||||
bez_bnez(1);
|
||||
}
|
||||
|
||||
static void bez(void) {
|
||||
bez_bnez(0);
|
||||
}
|
||||
|
||||
static void mwrt(void) {
|
||||
size_t size = buf[cnt++];
|
||||
pop_arg(2, arg1);
|
||||
pop_arg(size, arg2);
|
||||
word_t pos = *(word_t*)arg1;
|
||||
size_t i = 0;
|
||||
while (i < size) {
|
||||
stack[i + pos] = arg2[i];
|
||||
i ++;
|
||||
}
|
||||
}
|
||||
|
||||
static void mrd(void) {
|
||||
size_t size = buf[cnt++];
|
||||
pop_arg(2, arg1);
|
||||
word_t pos = *(word_t*)arg1;
|
||||
sp -= size;
|
||||
size_t i = 0;
|
||||
while (i < size) {
|
||||
stack[sp + i] = stack[pos + i];
|
||||
i ++;
|
||||
}
|
||||
}
|
||||
|
||||
static void get_sp(void) {
|
||||
push_arg(2, (__e_byte_t*)&sp);
|
||||
}
|
||||
|
||||
static void set_sp(void) {
|
||||
pop_arg(2, arg1);
|
||||
sp = *(word_t*)arg1;
|
||||
}
|
||||
|
||||
static word_t get_pop_sp_word(void) {
|
||||
pop_arg(2, arg1);
|
||||
return *(word_t*)arg1;
|
||||
}
|
||||
|
||||
static byte_t get_pop_sp_byte(void) {
|
||||
pop_arg(1, arg1);
|
||||
return *(byte_t*)arg1;
|
||||
}
|
||||
|
||||
static void nt_fs_syscall(void) {
|
||||
switch (get_pop_sp_byte()) {
|
||||
case 0x00:
|
||||
{
|
||||
fputs((char*)stack + sp, stdout);
|
||||
}
|
||||
break;
|
||||
case 0x01:
|
||||
{
|
||||
char ch = getchar();
|
||||
pop_arg(1, (__e_byte_t*)&ch);
|
||||
}
|
||||
break;
|
||||
case 0x02:
|
||||
{
|
||||
fGH6VSEzu7qNiGVE_stat = get_pop_sp_word();
|
||||
cnt = __ntsys_buffer_size - 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void (*fn_fGH6VSEzu7qNiGVE[])(void) = {
|
||||
/* Операции со стеком (0 - 2) */
|
||||
push, pop, push_str,
|
||||
/* Арифметические операции (3 - 6) */
|
||||
add, sub, mul, div_r,
|
||||
/* Логические операции (7 - 12) */
|
||||
nt_not, nt_shr, nt_shl, nt_or,
|
||||
nt_and, nt_xor,
|
||||
/* Переход (13) */
|
||||
nt_goto,
|
||||
/* Условия (14 - 21) */
|
||||
bnez, bez,
|
||||
up, down,
|
||||
eq, neq,
|
||||
upne, downe,
|
||||
/* Работа с памятью (22 - 23) */
|
||||
mwrt, mrd,
|
||||
/* Адресация на стеке (24 - 25) */
|
||||
get_sp, set_sp,
|
||||
/* Системные вызовы (26) */
|
||||
nt_fs_syscall
|
||||
};
|
||||
|
||||
#undef stack
|
||||
#undef sp
|
||||
#undef buf
|
||||
#undef cnt
|
||||
#undef ip
|
||||
|
||||
#undef arg1
|
||||
#undef arg2
|
||||
|
||||
#endif /* __LIB_ntfiles_H */
|
||||
91
ntsys.h
91
ntsys.h
@ -33,7 +33,14 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "ntfiles.h"
|
||||
|
||||
typedef unsigned char __e_byte_t;
|
||||
|
||||
typedef struct {
|
||||
__e_byte_t e_magic[3];
|
||||
__e_byte_t e_filesize[4];
|
||||
__e_byte_t e_memorysize[2];
|
||||
} __e_image_header_t;
|
||||
|
||||
#if (!defined(EXIT_SUCCESS))
|
||||
#define EXIT_SUCCESS 0
|
||||
@ -43,6 +50,16 @@
|
||||
#define EXIT_FAILURE 1
|
||||
#endif
|
||||
|
||||
__e_byte_t* __ntsys_stack = NULL;
|
||||
unsigned int __ntsys_stack_pointer = 0;
|
||||
__e_byte_t* __ntsys_buffer = NULL;
|
||||
size_t __ntsys_buffer_size = 0;
|
||||
unsigned int __ntsys_buffer_ptr = 0;
|
||||
int fGH6VSEzu7qNiGVE_stat = EXIT_SUCCESS;
|
||||
|
||||
|
||||
#include "ntfiles.h"
|
||||
|
||||
static void ntsys_error(char* _err) {
|
||||
printf("\033[1mntsys: \033[91m%s\033[0m\n", _err);
|
||||
}
|
||||
@ -61,15 +78,52 @@ static void __help(void) {
|
||||
" " "--help / -h - show this help" "\n"
|
||||
" " "--version / -v - show version" "\n"
|
||||
" " "--asm / -a - compile assembler program" "\n"
|
||||
" " "--out / -o - set output file name" "\0"
|
||||
" " "--out / -o - set output file name" "\n"
|
||||
" " "--debug / -d - display debugging info" "\0"
|
||||
);
|
||||
}
|
||||
|
||||
static int __exe_run(__e_byte_t* memory, unsigned int memorysize, unsigned long filesize, FILE* fp) {
|
||||
static int __exe_run(__e_byte_t* memory, unsigned int memorysize, unsigned long filesize, FILE* fp, __e_byte_t debug) {
|
||||
__ntsys_stack_pointer = memorysize;
|
||||
__ntsys_stack = memory;
|
||||
__e_byte_t* buff = malloc(filesize - 8);
|
||||
__ntsys_buffer = buff;
|
||||
__ntsys_buffer_size = fread(buff, 1, filesize - 8, fp);
|
||||
__ntsys_buffer_ptr = 0;
|
||||
if (!debug) {
|
||||
while (__ntsys_buffer_ptr < __ntsys_buffer_size) {
|
||||
__e_byte_t cmd = buff[__ntsys_buffer_ptr];
|
||||
__ntsys_buffer_ptr ++;
|
||||
fn_fGH6VSEzu7qNiGVE[cmd]();
|
||||
}
|
||||
} else {
|
||||
putchar('\n');
|
||||
while (__ntsys_buffer_ptr < __ntsys_buffer_size) {
|
||||
__e_byte_t cmd = buff[__ntsys_buffer_ptr];
|
||||
fprintf(stdout, "Command %d 0x%X\n"
|
||||
"Position %d 0x%X\n"
|
||||
"Stack point %d 0x%X\n\n"
|
||||
, cmd, cmd,
|
||||
__ntsys_buffer_ptr, __ntsys_buffer_ptr,
|
||||
__ntsys_stack_pointer, __ntsys_stack_pointer);
|
||||
__ntsys_buffer_ptr ++;
|
||||
fn_fGH6VSEzu7qNiGVE[cmd]();
|
||||
FILE* df = fopen("dump.bin", "wb");
|
||||
if (df == NULL) {
|
||||
ntsys_error("Cannot open dump file!");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
fwrite(__ntsys_stack, 1, memorysize, df);
|
||||
fclose(df);
|
||||
puts("Press any key to continue...");
|
||||
getchar();
|
||||
}
|
||||
}
|
||||
free(buff);
|
||||
if (fGH6VSEzu7qNiGVE_stat != EXIT_SUCCESS) return fGH6VSEzu7qNiGVE_stat;
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
int ntsys_api_call(char* filename) {
|
||||
int ntsys_api_call(char* filename, unsigned char debug) {
|
||||
|
||||
/* File data */
|
||||
|
||||
@ -78,7 +132,7 @@ int ntsys_api_call(char* filename) {
|
||||
|
||||
/* Parser */
|
||||
|
||||
FILE* fp = fopen(filename, "r");
|
||||
FILE* fp = fopen(filename, "rb");
|
||||
if (fp == NULL) {
|
||||
ntsys_error("Cannot open file!");
|
||||
return EXIT_FAILURE;
|
||||
@ -89,8 +143,8 @@ int ntsys_api_call(char* filename) {
|
||||
head.e_magic[2] = (__e_byte_t)0;
|
||||
int __i = 1;
|
||||
size_t i = 0;
|
||||
if (*((char *)&__i) == 1) {
|
||||
/* LITTLE ENDIAN */
|
||||
if (!(*((char *)&__i) == 1)) {
|
||||
/* BIG ENDIAN */
|
||||
head.e_memorysize[0] = head_bin[7];
|
||||
head.e_memorysize[1] = head_bin[6];
|
||||
i = 3;
|
||||
@ -100,7 +154,7 @@ int ntsys_api_call(char* filename) {
|
||||
i --;
|
||||
}
|
||||
} else {
|
||||
/* BIG ENDIAN */
|
||||
/* LITTLE ENDIAN */
|
||||
head.e_memorysize[0] = head_bin[6];
|
||||
head.e_memorysize[1] = head_bin[7];
|
||||
while (i != 4) {
|
||||
@ -114,15 +168,26 @@ int ntsys_api_call(char* filename) {
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
unsigned long int filesize = 0;
|
||||
if (sizeof(dword_t) != 4 || sizeof(qword_t) != 8 || sizeof(word_t) != 2) goto __exit_datatype_error;
|
||||
switch (4) {
|
||||
case sizeof(NAME_OF_64_BITS_TYPE): filesize = *((NAME_OF_64_BITS_TYPE*)head.e_filesize); break;
|
||||
case sizeof(NAME_OF_32_BITS_TYPE): filesize = *((NAME_OF_32_BITS_TYPE*)head.e_filesize); break;
|
||||
default:
|
||||
__exit_datatype_error:
|
||||
ntsys_error("Unknown data type! You must recompile the program and specify a different type.");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
unsigned int mem_size = (unsigned int)*((NAME_OF_16_BITS_TYPE*)head.e_memorysize);
|
||||
__e_byte_t* memory = malloc(*((NAME_OF_16_BITS_TYPE*)head.e_memorysize));
|
||||
int stat = __exe_run(memory, (unsigned int)*((NAME_OF_16_BITS_TYPE*)head.e_memorysize), filesize, fp);
|
||||
if (memory == NULL) {
|
||||
ntsys_error("Out of memory!");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
if (debug) {
|
||||
printf("File size %lu 0x%lX\n", filesize, filesize);
|
||||
printf("Memory size %u 0x%X\n", mem_size, mem_size);
|
||||
}
|
||||
int stat = __exe_run(memory, mem_size, filesize, fp, debug);
|
||||
fclose(fp);
|
||||
free(memory);
|
||||
return stat;
|
||||
@ -138,12 +203,16 @@ int _lib_ntsys_main(int argc, char** argv) {
|
||||
char* asm_out = "out.exe";
|
||||
char mode = 'R';
|
||||
unsigned char out = 0;
|
||||
unsigned char debug = 0;
|
||||
while (t < argc) {
|
||||
char* str = argv[t];
|
||||
if (str[0] == '-') {
|
||||
unsigned char f = 0;
|
||||
if (str[1] == '-') f = 1;
|
||||
switch (str[1 + f]) {
|
||||
case 'd':
|
||||
debug = 1;
|
||||
break;
|
||||
case 'h':
|
||||
__help();
|
||||
return EXIT_SUCCESS;
|
||||
@ -175,7 +244,7 @@ int _lib_ntsys_main(int argc, char** argv) {
|
||||
ntsys_error("Please specify the file name!");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
if (mode == 'R') return ntsys_api_call(filename);
|
||||
if (mode == 'R') return ntsys_api_call(filename, debug);
|
||||
return ntsys_compile_asm(filename, asm_out);
|
||||
}
|
||||
|
||||
|
||||
BIN
test/arifmetic_operation_test.exe
Normal file
BIN
test/arifmetic_operation_test.exe
Normal file
Binary file not shown.
BIN
test/goto_operator_test.exe
Normal file
BIN
test/goto_operator_test.exe
Normal file
Binary file not shown.
BIN
test/if_goto_operation_test.exe
Normal file
BIN
test/if_goto_operation_test.exe
Normal file
Binary file not shown.
BIN
test/logic_operation_test.exe
Normal file
BIN
test/logic_operation_test.exe
Normal file
Binary file not shown.
BIN
test/memory_read_write_test.exe
Normal file
BIN
test/memory_read_write_test.exe
Normal file
Binary file not shown.
BIN
test/syscall_test.exe
Normal file
BIN
test/syscall_test.exe
Normal file
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user