Продолжаю копать темы шелл кодов, сжатия файлов и их динамического запуска. На сей раз кинул взгляд на функцию RtlDecompressBuffer и RtlCompressBuffer соответственно. Если со второй функцией все в порядке, то первая работать отказывается, выкидывая: "The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention." Каким боком нарушается соглашение о вызове не понимаю.
Сам код:
Сам код:
C++:
#include <Windows.h>
int DecompressData(PUCHAR Data, ULONG ulDataSize, PUCHAR lpEncryptData, ULONG ulEncSize)
{
typedef NTSTATUS(__stdcall * fpRtlDecompressBuffer)(USHORT, PUCHAR, ULONG, PUCHAR, ULONG, PULONG);
HMODULE ntdll = LoadLibraryA("ntdll.dll");
if (ntdll)
{
fpRtlDecompressBuffer RtlDecompressBuffer = reinterpret_cast<fpRtlDecompressBuffer>(GetProcAddress(ntdll, "RtlCompressBuffer"));
DWORD dwDecompSize;
RtlDecompressBuffer(COMPRESSION_FORMAT_LZNT1, lpEncryptData, ulEncSize, Data, ulDataSize, &dwDecompSize); // при вызове выкидывает ошибку
}
else return -1;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
unsigned char data[5203] = {
/* байты упакованного функцией RtlCompressBuffer файла*/
};
DWORD dwSize = 0x2200; //Размер распакованного файла
LPVOID lpEncData = VirtualAlloc(NULL, dwSize, MEM_COMMIT, PAGE_READWRITE); // Память для распакованного файла
DecompressData(data, sizeof(data), (PUCHAR)lpEncData, dwSize); // Отправляем на распаковку
//Здесь запуск кода
return 0;
}