PolymorphicEngine
Barry Cleaning up code 5f6e3ab (3 years, 10 months ago)diff --git a/src/main.c b/src/main.c
index ab676ef..4048b5d 100644
--- a/src/main.c
+++ b/src/main.c
@@ -14,51 +14,10 @@
#define POLYMORPHIC __attribute__((noinline, section(".polymorphic")))
-/* Linked values */
-extern unsigned char binaryStart[], polymorphicStart[], polymorphicEnd[];
-
/* Keys */
const uint8_t act[KEY_SIZE] = {}, /* Operators */
key[KEY_SIZE] = {}; /* Operands */
-
-/* Functions */
-int polymorphic_main(int argc, char **argv);
-
-/* Traditional main function */
-int
-main(int argc, char **argv)
-{
- size_t i, mask;
- void *aligned;
- uint8_t *code = (uint8_t *) polymorphicStart;
- long pageSize = sysconf(_SC_PAGESIZE);
-
- /* Make memory writable */
- if (pageSize <= 0)
- return 1;
- mask = pageSize - 1;
- aligned = (void *) ((size_t) code & ~mask);
- if (mprotect(aligned, (polymorphicEnd - polymorphicStart) + pageSize, PROT_READ|PROT_WRITE|PROT_EXEC))
- return 1;
-
- /* Decrypt our code */
- for (i = 0; i < (polymorphicEnd - polymorphicStart); i++) {
- switch (act[i % KEY_SIZE]) {
- case 0:
- code[i] ^= key[i % KEY_SIZE];
- break;
- case 1:
- code[i] -= key[i % KEY_SIZE];
- break;
- case 2:
- code[i] += key[i % KEY_SIZE];
- break;
- }
- }
-
- /* Run the decrypted code */
- return polymorphic_main(argc, argv);
-}
+extern uint8_t binaryStart[], polymorphicStart[], polymorphicEnd[];
/* Copy a file */
POLYMORPHIC
@@ -98,8 +57,9 @@ polymorphic_main(int argc, char **argv)
{
char filename[NAME_PREFIX_LENGTH + NAME_AFFIX_LENGTH + 1] = NAME_PREFIX,
/* Possible characters in filename */
- alpha[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
- uint8_t dKey[KEY_SIZE], dAct[KEY_SIZE], data, *code = (uint8_t *) polymorphicStart;
+ alpha[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
+ uint8_t dKey[KEY_SIZE], dAct[KEY_SIZE], data,
+ *code = (uint8_t *) polymorphicStart;
FILE *child;
size_t i;
@@ -107,8 +67,8 @@ polymorphic_main(int argc, char **argv)
srand(time(NULL));
/* Duplicate file */
- for (i = NAME_PREFIX_LENGTH; i < sizeof(filename)-1; i++)
- filename[i] = alpha[rand() % (sizeof(alpha)-1)];
+ for (i = NAME_PREFIX_LENGTH; i < sizeof(filename) - 1; i++)
+ filename[i] = alpha[rand() % (sizeof(alpha) - 1)];
copy_file(argv[0], filename);
chmod(filename, 0777);
@@ -129,7 +89,7 @@ polymorphic_main(int argc, char **argv)
fwrite(dKey, 1, KEY_SIZE, child);
/* Encrypt our code */
- fseek(child, (unsigned long int) (polymorphicStart - binaryStart), SEEK_SET);
+ fseek(child, (uint64_t) (polymorphicStart - binaryStart), SEEK_SET);
for (i = 0; i < (polymorphicEnd - polymorphicStart); i++) {
data = code[i];
switch (dAct[i % KEY_SIZE]) {
@@ -151,3 +111,39 @@ polymorphic_main(int argc, char **argv)
return 0;
}
+
+/* Traditional main function */
+int
+main(int argc, char **argv)
+{
+ size_t i, mask;
+ void *aligned;
+ uint8_t *code = (uint8_t *) polymorphicStart;
+ long pageSize = sysconf(_SC_PAGESIZE);
+
+ /* Make memory writable */
+ if (pageSize <= 0)
+ return 1;
+ mask = pageSize - 1;
+ aligned = (void *) ((size_t) code & ~mask);
+ i = (polymorphicEnd - polymorphicStart) + pageSize;
+ if (mprotect(aligned, i, PROT_READ|PROT_WRITE|PROT_EXEC))
+ return 1;
+
+ /* Decrypt our code */
+ for (i = 0; i < (polymorphicEnd - polymorphicStart); i++)
+ switch (act[i % KEY_SIZE]) {
+ case 0:
+ code[i] ^= key[i % KEY_SIZE];
+ break;
+ case 1:
+ code[i] -= key[i % KEY_SIZE];
+ break;
+ case 2:
+ code[i] += key[i % KEY_SIZE];
+ break;
+ }
+
+ /* Run the decrypted code */
+ return polymorphic_main(argc, argv);
+}