From 55baaa8952567fbccfbb65972153bfd7ad320263 Mon Sep 17 00:00:00 2001 From: german Date: Tue, 24 Feb 2026 19:07:12 +0400 Subject: [PATCH] Command interpetation --- dump.bin | Bin 0 -> 32 bytes example.exe | Bin 8 -> 16 bytes ntfiles.h | 616 +++++++++++++++++++++++++++++- ntsys | Bin 16304 -> 22320 bytes ntsys.h | 91 ++++- test/arifmetic_operation_test.exe | Bin 0 -> 18 bytes test/goto_operator_test.exe | Bin 0 -> 13 bytes test/if_goto_operation_test.exe | Bin 0 -> 20 bytes test/logic_operation_test.exe | Bin 0 -> 18 bytes test/memory_read_write_test.exe | Bin 0 -> 26 bytes test/syscall_test.exe | Bin 0 -> 36 bytes 11 files changed, 690 insertions(+), 17 deletions(-) create mode 100644 dump.bin create mode 100644 test/arifmetic_operation_test.exe create mode 100644 test/goto_operator_test.exe create mode 100644 test/if_goto_operation_test.exe create mode 100644 test/logic_operation_test.exe create mode 100644 test/memory_read_write_test.exe create mode 100644 test/syscall_test.exe diff --git a/dump.bin b/dump.bin new file mode 100644 index 0000000000000000000000000000000000000000..0d2b7c6fd767e5d3da7f111adaaa4ed76a31d6bc GIT binary patch literal 32 ZcmZQzKm#7BIXU?{3g!7lIVp-<3;-#Y1e5>( literal 0 HcmV?d00001 diff --git a/example.exe b/example.exe index bfad7a83fb7c797c59d38ec88de81c40b062935a..472b7655490f0566d854cd7af7cd4fa48bb86e29 100644 GIT binary patch literal 16 VcmeZ`5@KLrP+(wSGyo!IMgR^Z0YCr% literal 8 PcmeZ`Vqjq4U{C-61s(v< diff --git a/ntfiles.h b/ntfiles.h index 9dffbe6..6fea630 100644 --- a/ntfiles.h +++ b/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 */ \ No newline at end of file diff --git a/ntsys b/ntsys index 73d2a05eeb4bf5cb9a00803b4fa404c77121363d..5d750c5705d115eee6419bd9ebcbdb8aea78658e 100755 GIT binary patch literal 22320 zcmeHvd3aP+w(qG*4n#=mgdvI`SS`WJl$Zd4fQh7_0u?)u2mxu)E-FcdM3YLo>J$V% zyG@&l)UixA`mkGHJ3xOpw0isEz1(1{En!dwhi0&C9Igh(lsE)MiP}={xAss~IXB$* z-u>Pm_kPa}*=w)gUTf{W*B;L~bVsBkpL-C3Y84R zmnsvKA>dOP#`8-!K`sv`tOIG9z*9g;Zww^{p_g!2kyO@@DCwOqWTx{RNtH~_lb%XR z!JBEr1TH73%#W9s$MY2vy-zeq(qujI&8lLqw`$2ix>dA0-WX9Yau?~<3%z=wCuyH> zgrw4+e;idXspd?Z14qJb6N{$=ggj!8)(j*!Ky&@ zvg41&)Z(Qp6qxBIOm?fajq}nT<&75kB!Bn6w7+uTrB_NWxPN+1+Wp}R-5I;SAQ`GR z>5vQsvL~t-=SLz%GTa~Alr~GILKxYnFnRnPmmKxJ(zJGkN4kM$B*jyaCLMFQ9>8Gu zLEv_?F!&Dq4JLoZdGMc~2d8N}n4Qph@S*3y-v@5TpE-~>2eUu^Jovox;J2R#Uwj_? zOW=0=nL`19!Rk{2e1tMqQLf<{a-RCYUdEvTF^vO~&os#^0ll`tr?dq18pZ7n=$@LJ z+%@$#x$8U)jR0Ew4L-e&5T(xV^-|=iRn~eTUDw>=^^tmWP={n)l4z5sv9X!#VRF=v zQNQkP@}L;EyQbCSu50jl8XGpkT1{hf00gB6l)Cl)2HmTW3QeEc%Hr~}1q-BrrHUxC9ziP?C#%7nth@kZZ0~gAbe!S zOtK)Rf2k}cPGu=Io?}HSRk;)La^mP0H(Wro{C5Hy-O!LhEA1nK-+AY6Fbz|bCj}oI zOY&CbS@0C(x-a|ji0Je+VqKT`W`UiH%&Z*dJ}#`;4LP+N8qg{yiee5CLBi-7Q!an zp2hLaCcNchj^AU#+XTMVg!hQa_^1i*6Zj4j-YxK_O!yIjcbjl!BCpRu6P_vXBPM)@ z@bd{1-XhxDW5TzJ&7#+Y_XxbtgtuM9>vKY!18MKEa)`w}Nx0ktDWf+DAC@HFmxN~~ z;r&Ut7_vN9tZ%g6Ca;@v-6LG?f21JKtF%wh8Yx4ouunMcw=%RP;bcpOa1ze?aMIZSz5lkf|qFzBO6`0ylrM-ncMv@G|jBpeG-Jai}Fwm7ON2a|9u2|tpA zk4VCQNdDk~A3X5?j|aZgCVcB^|0K;7QD2|0D6Wof-5NXMYTuu>k2xV$Fb{BSQW0Y9 z(h`N_>nSJtZY&n7+st@cV57$pJZ%ioy$PN+gy=sfcv^U)zfbVA;70FC@U+lIZ%y#D zz()NEo)*?Wi}SHbpIxOWb=sv)g|#m>X{Cu@ zYT_4}_^V9(Y!jbr;x9Mx6HNStCf;V^hnV*0Qv`ZS)}ihmAW zB{*$`tG##`Bo&wOfu8P)6t4u+TXrrM>#apyUr<*-&T<2Em1OowOZ8eBvqH_5Ash$-N?j>Zvk;eGTK1eiiRp>Mz96RJ<8fI<-3sBx7pEoP0Yx8 z4r#3`oeF#gNqGF!Ula2&qCNl+eti(6v+|sg^(zt@JtCrZAfa_-+`{s+h=j|nmVIV_ z{gmgsnRL1}oRPy)POBxXPNd{6bsUJH79dV`H}9XU34l@lr6k%lYXrtmd$+YDT=3zQ z1XPW{p!p8TaMo)C>{4F=G1ONPCmWONXGDD(IgyNmh~ce6AguGZGd}ANAaJD3Nh82z z94rYJ{{j$7)Vj)T7Uz`iaE6a$c4gFo7-}2hC76vRTGwbBy44aMJ%sgCS$n@lpUV0R zp7lU1Qm~vfyNc3W7Oe7nEhJtNF3KyLdnEYgKE9qu)Ugm^RT_Z=#^Z$`tU6STKT>Q1 zpWp3DDbAq$&VsjbyM*@_sxZ`L>_H7&oh6pCx!u7}wJ!BJA5~yY~2>Qnw zQJau*z_t~0qRcq$fb+sxg&ah$I}P>6V8ZIn%=WZ+>@KXVFMkXI2_OIe%zW zhSROQCNBj0;PlgTsTB2HkW$MYr;(wMkU$baz21C zTLf5(4g`CX*Q<#79I~;z?IvREMZXX2yc$Du6L=$I8{#61zNE;iUl8iny-+QI-Bhi8 zZ%SCLL9W*2)UbH8A{kbf6R=DDF^HiqK^##l5V!YYkS;(1>e%P_o?n~+p!eW6u~@r0 z7fI9`8$a2{xI9@1G0R_~bCDhQe?&b8xI8j`6vUT1jBlC$KPJ&g*5@D?Ch68l)+Z!o z{KaX!Sk^gfR2e4BM_T)Pntlt0O=rd*ksBW`L&Bp`F7@;Q__ym#hvfwN=W&QQ+P*oh zg|=bLtiJ;3R4w!nr57S?(Lx5&NLhoE>e`D}LtN3e>^U`u+eOA1eIw$2eJtWH^f&Vl zof=oS8R=BLdffrgwBRS$UoI1hPNSPf2@RT*aF$A?!>uVaRP12F>X&oSxWc1)2AumL z(uR5l@oE~H@Ml}`>)==o{+0X}Q4fRf=%y-dH?7~h*?H-ov5oQhmLH2g1V*f@4?xcu z$$A{bQROhcTLBL*H?lT?hl}q3VPmS}Yb~VVVC9O850i#*%w>GVoO=yPb{36d_Gmtm ze=(UbA6;`_2!2|kbv<9+sa^)L(#~vaez((@R19W`@$S;j^ohcMSR*Wsa1qAi0p2-( z3!ZYceTP1H64gga)k5#E9{A3xg|cwu1D2w7%tUTU+xMyZ722lzfFg~)dY-4OT8EAl zJovsCy8jDNhrbsXh*ZHoQcf zp*{o>U5MifD<@yuw3)jP)qafv? zOHn4OpCLBXKE!BHl*mN&4G@(19dX$6K%#zDW*ds)N`(;LKFv~h&q9c4OcY~$mJ1ds27m}{RuTcJyTJJ zsqY~Us~;ea=0FDc>qyT~Uu5{pg!gb=Ob@!&h;Br*8AXEsEo?<^Bp!O(APZ021#-MU ztP+i8K!DeMFE@TOP*m-15E|LhX#``Pq5Y7rCwsq>>&b46OI&Xycy|5u`vjj#`FACF zcKvlLF^^1T$we*7tNIml#K!#&K+#qg=*OM|%$~@LFgd zN~d+G;Lr?3LHlU^86wsnb{>F*eN1301e}&V#vvo)&q%sxuP7QW_XXN_p|?jK0zP#b z2OXX1V^EHf(Fyq?Op*`K66}jV33Y27+mJR6JKDa*o)MtIy=gwG!Vs)l6>x%aSld*A z9LQL-jwgY@{bOOOP`v~(vbS_cX?!NmkJ8|LX7KVPgU_+FwrO14;973*P(B%a5itzj z)g8T;49fEa?43R8_~pqyfLiDrVr(<1qi_}vtDB)ho6abUk?{o5Vf7ZotJ!|c>!Hun zHcdr&vQfM~>nHFAy@eW~LDxX3P+f?am4E6Ia2jpy1D8~UTXAm6esqvwr|g9pp}ECEGGINTG0Pc=N{7kQhPx7*rD1am%Cr;&EtCKXx8phAK`kBa=rVy zqwAmt-~Ac@e78An@24DJ&+*o{{34FKIlhMDsCzE(i0T4ASG_upj$!CLhE7LJgEEz2 z6BuR}SRZN^QHL=s9Wigy8w@>@OE$ko3=}oq&(OCS+Jl&8&JJK`XR7|Nwn>G3q|rm^ zK+)!Zfe?CVC&{AxkdW0vbRS3Cw2JePf9vl|KEma17V=fdHx8eA%QzfOfoUYSvGGFd zAI?vuSiIu=?moCZIwP^ZVZ7jePlCrhQKBOg{AuE?3H}S>zxbBc(}-$A4R9VC2jZyW zhq3RBto|HyRV3?s5O(4%H(qfXFSmcFwSRy$a0p7k8u~fq8pqhF>=~qKsZ3n=40bNV z?UUOf7(bUi1P14_iq6!;xhx&m$8?P)7sgNM+!dmY9mg|$Q5&7dI>F(Hds??^n@*tl zbnMkaJ}ms&ri-vlfyWB?TjXHD7=uC-bu8lOS4i=7fgQbHU<#+=2DUMNf;14y1rJl` zwJT}u*`@wW72`5k-fTrdzB z3F2r!X^by4xf5D@3bAxQr3&X05+xdb&TX^Wu?_Mjd}p^H9; zXD~)ygkhXwc?Z2rUfi^fw+CLJ?G0X74;hGV<)U>K)rVBH3=;=xSe|~v8;s@cO(+1v z5;cvc)h@LNl29lng)wo3@o|L{QX%v!OsnWuY}%5|wQ-TZNRf`eAy?b2_Dw~tc4wRf zx%cch=$Chpias4z{fyVYU$0?R35Ce=?+~F4Z$UKP+}}{AY@(m~!2M4nrzG^L7J7zC z>B_ntJl4d=K^BBZXR<>j_?rl}sEr`e#Y|FNMG!ibQA53kvZf;o(xsF&O`T1|Q0Gw2 zNS-r|pnF|s=L5f#@Nd})^bK~h9yA!b7NDr{R1mt%u&Di0Aa)#LKt~I-v-l05y!YCv zIk)9=FT>6~+|C{d$5B>uxUP&3#R0o%Y$b6)ru!bZ@K@#^R;P5iA%;8t_8VLDl zKNjGKIvlyv)bA%_!B=C5qi@i<+@*er^i=f {R#!uN9gIMS%zt00E@3T6C(*?9&@ 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 KH7S@_<$nR%Ec$%_ literal 16304 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 diff --git a/ntsys.h b/ntsys.h index 6e76e9b..f992757 100644 --- a/ntsys.h +++ b/ntsys.h @@ -33,7 +33,14 @@ #include #include #include -#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); } diff --git a/test/arifmetic_operation_test.exe b/test/arifmetic_operation_test.exe new file mode 100644 index 0000000000000000000000000000000000000000..fca64178a5b65d30887d4d199c50ad1879179e85 GIT binary patch literal 18 ZcmeZ`l4D?CP+(wS5)x)$5*B9r1OO3=0xbXl literal 0 HcmV?d00001 diff --git a/test/goto_operator_test.exe b/test/goto_operator_test.exe new file mode 100644 index 0000000000000000000000000000000000000000..d2598e0a180ee1440c01af2c919aab613023eb53 GIT binary patch literal 13 UcmeZ`5@KLrP+(wSVqo9}014>;=>Px# literal 0 HcmV?d00001 diff --git a/test/if_goto_operation_test.exe b/test/if_goto_operation_test.exe new file mode 100644 index 0000000000000000000000000000000000000000..c737428473cf3b783a3d09feef33da177dde4d47 GIT binary patch literal 20 ZcmeZ`l4oFGP+(wS0#b|u42-OT9|00q0s;U4 literal 0 HcmV?d00001 diff --git a/test/logic_operation_test.exe b/test/logic_operation_test.exe new file mode 100644 index 0000000000000000000000000000000000000000..d11c6b60f5d25855c94d04fc5fed188fe4519117 GIT binary patch literal 18 XcmeZ`5@KLrP+(wSVg%y<3>-`V5=a5) literal 0 HcmV?d00001 diff --git a/test/memory_read_write_test.exe b/test/memory_read_write_test.exe new file mode 100644 index 0000000000000000000000000000000000000000..11a5e688642938a544318b6a6d7170dc8d2305d8 GIT binary patch literal 26 ecmeZ`l4oFGaA06y5i$v@U|?ck5Mu$6;w%6t_ySk} literal 0 HcmV?d00001 diff --git a/test/syscall_test.exe b/test/syscall_test.exe new file mode 100644 index 0000000000000000000000000000000000000000..d84fa40fed9bd618a1e1301c1312454acea86e22 GIT binary patch literal 36 pcmeZ`a$sO!P+(y4NX^N~*HI|XFUm<#