aboutsummaryrefslogtreecommitdiff
path: root/source/tests/test_asm.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/tests/test_asm.c')
-rw-r--r--source/tests/test_asm.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/source/tests/test_asm.c b/source/tests/test_asm.c
new file mode 100644
index 0000000..8f49f8f
--- /dev/null
+++ b/source/tests/test_asm.c
@@ -0,0 +1,51 @@
+#include "tests.h"
+
+#include "compat.h"
+#include "loader_x86.h"
+#include "distorm/distorm.h"
+
+
+static volatile unsigned char loader_bin[] = LOADER_SHELLCODE;
+#define MAX_INSTRUCTIONS (1000)
+static volatile _DecodedInst decodedInstructions[MAX_INSTRUCTIONS];
+
+
+BOOL test_distorm(void)
+{
+ ERRETCP(bInitCompat(LoadLibraryA(TEXT("KERNEL32.dll")), GetProcAddress) == TRUE);
+
+ _DecodeType dt = Decode32Bits;
+ _DecodeResult res;
+ _OffsetType offset = 0;
+ unsigned char* buf = (unsigned char*)&loader_bin[0];
+ size_t size = sizeof(loader_bin)/sizeof(loader_bin[0]);
+ unsigned int decodedInstructionsCount = 0, i, next;
+
+ COMPAT(memset)((unsigned char*)&decodedInstructions[0], '\0', sizeof(_DecodedInst)*MAX_INSTRUCTIONS);
+ while (1) {
+ res = distorm_decode(offset, buf, size, dt, (_DecodedInst*)&decodedInstructions[0], MAX_INSTRUCTIONS, &decodedInstructionsCount);
+ if (res == DECRES_INPUTERR)
+ break;
+
+ ERRETCP(res == DECRES_SUCCESS);
+ ERRETCP(decodedInstructionsCount > 0);
+ for (i = 0; i < decodedInstructionsCount; i++) {
+ ERRETCPDW_NOLOG( decodedInstructions[i].offset < size, decodedInstructions[i].offset );
+ ERRETCPDW_NOLOG( decodedInstructions[i].size > 0, decodedInstructions[i].size );
+ ERRETCPDW_NOLOG( decodedInstructions[i].size < 15, decodedInstructions[i].size );
+ ERRETCP_NOLOG( strnlen( (const char*)(&decodedInstructions[i])->mnemonic.p, MAX_TEXT_SIZE ) > 0 );
+ }
+
+ if (res == DECRES_SUCCESS) break; // All instructions were decoded.
+ else if (decodedInstructionsCount == 0) break;
+
+ // Synchronize:
+ next = (unsigned int)(decodedInstructions[decodedInstructionsCount-1].offset - offset);
+ next += decodedInstructions[decodedInstructionsCount-1].size;
+ // Advance ptr and recalc offset.
+ buf += next;
+ size -= next;
+ offset += next;
+ }
+ return TRUE;
+}