etc.git


etc

~ scripts and random things
git clone https://github.com/djnnvx/etc.git
log | files | refs | archive

utils.c (3991B)

      1 #define _CRT_SECURE_NO_WARNINGS
      2 #include "utils.h"
      3 #include "logger.h"
      4 #include <stdlib.h>
      5 #include <string.h>
      6 
      7 // ======================================
      8 //  Functions to XOR encrypt/decrypt
      9 // ======================================
     10 const char* XOR_KEY = "0123456789abcdefghij";
     11 size_t key_len = 20;
     12 
     13 char* xor_decrypt_string(const unsigned char* cipher, size_t len, const char* key, size_t key_len)
     14 {
     15     char* result = (char*)malloc(len + 1);
     16     if (!result) return NULL;
     17     for (size_t i = 0; i < len; i++) {
     18         result[i] = cipher[i] ^ key[i % key_len];
     19     }
     20     result[len] = '\0';
     21     return result;
     22 }
     23 
     24 void xor_buffer(unsigned char* buffer, size_t len, const char* key, size_t key_len)
     25 {
     26     for (size_t i = 0; i < len; i++) {
     27         buffer[i] ^= key[i % key_len];
     28     }
     29 }
     30 
     31 // ========================================
     32 //  Function to convert string to UNICODE
     33 // ========================================
     34 wchar_t* to_wide(const char* str) {
     35     int len = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);
     36     if (len == 0) return NULL;
     37     wchar_t* wstr = (wchar_t*)malloc(len * sizeof(wchar_t));
     38     if (!wstr) return NULL;
     39     MultiByteToWideChar(CP_UTF8, 0, str, -1, wstr, len);
     40     return wstr;
     41 }
     42 
     43 // =====================================================
     44 // Function to load clean versions of DLLs
     45 // =====================================================
     46 HMODULE LoadCleanDLL(char* dllPath) {
     47 
     48     HMODULE hDLL = LoadLibraryA(dllPath);
     49     /* DEBUG
     50     if (hDLL)
     51     {
     52         log_success("Loaded clean copy of %s at: %p", dllPath, hDLL);
     53     }
     54     else
     55     {
     56         log_error("Failed to load %s. Error: %lu", dllPath, GetLastError());
     57     }*/
     58 
     59     return hDLL;
     60 }
     61 
     62 // =====================================================
     63 // GetProcAddress reimplementation
     64 // =====================================================
     65 
     66 FARPROC CustomGetProcAddress(HMODULE hModule, LPCSTR lpProcName) {
     67     if (!hModule || !lpProcName) return NULL;
     68 
     69     BYTE* baseAddr = (BYTE*)hModule;
     70     IMAGE_DOS_HEADER* dosHeader = (IMAGE_DOS_HEADER*)baseAddr;
     71     if (dosHeader->e_magic != IMAGE_DOS_SIGNATURE) return NULL;
     72 
     73     IMAGE_NT_HEADERS* ntHeaders = (IMAGE_NT_HEADERS*)(baseAddr + dosHeader->e_lfanew);
     74     if (ntHeaders->Signature != IMAGE_NT_SIGNATURE) return NULL;
     75 
     76     IMAGE_DATA_DIRECTORY exportDirData = ntHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT];
     77     if (!exportDirData.VirtualAddress) return NULL;
     78 
     79     IMAGE_EXPORT_DIRECTORY* exportDir = (IMAGE_EXPORT_DIRECTORY*)(baseAddr + exportDirData.VirtualAddress);
     80 
     81     DWORD* names = (DWORD*)(baseAddr + exportDir->AddressOfNames);
     82     WORD* ordinals = (WORD*)(baseAddr + exportDir->AddressOfNameOrdinals);
     83     DWORD* functions = (DWORD*)(baseAddr + exportDir->AddressOfFunctions);
     84 
     85     for (DWORD i = 0; i < exportDir->NumberOfNames; i++) {
     86         char* name = (char*)(baseAddr + names[i]);
     87         if (_stricmp(name, lpProcName) == 0) {
     88             WORD ordinal = ordinals[i];
     89             DWORD funcRVA = functions[ordinal];
     90             FARPROC address = (FARPROC)(baseAddr + funcRVA);
     91 
     92             // Check if it's a forward export
     93             DWORD exportStart = exportDirData.VirtualAddress;
     94             DWORD exportEnd = exportStart + exportDirData.Size;
     95             if (funcRVA >= exportStart && funcRVA <= exportEnd) {
     96                 // It's a forward export (e.g., "sechost.OpenProcessToken")
     97                 char* forwardName = (char*)address;
     98                 char dllName[256] = { 0 };
     99                 char funcName[128] = { 0 };
    100 
    101                 sscanf(forwardName, "%[^.].%s", dllName, funcName);
    102                 strcat_s(dllName, sizeof(dllName), ".dll");
    103 
    104                 HMODULE hFwd = LoadLibraryA(dllName);
    105                 if (!hFwd) return NULL;
    106 
    107                 return GetProcAddress(hFwd, funcName);
    108             }
    109 
    110             return address;
    111         }
    112     }
    113 
    114     return NULL;
    115 }