Entwickler-Ecke

Open Source Projekte - ProcessView [9 KB] (Console)


retnyg - Fr 29.04.05 00:25
Titel: ProcessView [9 KB] (Console)
processview 1.0 by retnyg @ http://krazz.net/retnyg
___________________________________________________________________
download : hier [http://krazz.net/retnyg/psview.zip]

ein prozessmanager für die kommandozeile.
features:
- prozesse auflisten
- prozesse killen
- geladene dll's anzeigen
- verdächtige prozesse anzeigen

based on uallprocess unit [http://www.delphi-forum.de/topic_uallHook+uallProtect+uallDisasm+uallKernel+uallUtil+etc_39250.html] of uall

lists processes, kills processes the taskmgr.exe's way, not like
most other processmanager tools ie. those of sysinternals.
generates lists of all loaded processes including submodules
(injected dll's). use lists of clean systems to compare if u're infected.

Zitat:
Usage: psview options
if started without parameters, psview lists all running processes.
available options:

/lm:4104 - lists modules of process with ID 4104
/k:4104 - kills process with ID 4104
/f:explorer - shows pid of process explorer.exe
/d - detailed: lists all process with modules

to generate a list-file of all your processes, type:

psview /d > list.txt



use only on own risk.


Delete - Fr 29.04.05 01:00
Titel: Re: ProcessView [9 KB] (Console)
user profile iconretnyg hat folgendes geschrieben:
kills processes the taskmgr.exe's way, not like
most other processmanager tools ie.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
function KillProcess(pid: integer): boolean; register;
// by retnyg
asm
   push 0
   test eax, eax
   jz @out
   push EAX
   push 0
   push 1
   CALL OpenProcess
   MOV ESI, EAX
   TEST ESI, ESI
   JE @final
   PUSH 1
   PUSH ESI
   Call TerminateProcess
   TEST EAX, EAX
   JNZ @success
   jmp @final
   @success:
   pop edi
   push 1
   @final:
   PUSH ESI
   CALL closehandle
   @out:
   pop eax
end;
{  // pascal version
  var prochnd: thandle;
  begin
    result := false;
    if pid > 0 then begin
      procHnd := OpenProcess(1, False, pID);
      if procHnd <> 0 then  begin
         result:= TerminateProcess(procHnd, 1);
         CloseHandle(ProcHnd);
      end;
    end;
  end; }

Äh, TerminateProcess ist aber kein Geheimnis. ich wüßte gar nicht, wie es anders geht. Wie machen es denn die von SysInternals?

Und man sollte beachten, dass TermionateProcess asynchron arbeitet und sofort zurückkehrt. Deswegen sieht meine Methode so aus:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
procedure KillIt(dwProcID: DWORD); 
var 
  hProcess : Cardinal; 
  dw       : DWORD; 
begin 
  { open the process and store the process-handle } 
  hProcess := OpenProcess(SYNCHRONIZE or PROCESS_TERMINATE, False, dwProcID); 
  { kill it } 
  TerminateProcess(hProcess, 0); 
  { TerminateProcess returns immediately, so wie have to verify the result via 
    WaitfForSingleObject }
 
  dw := WaitForSingleObject(hProcess, 5000); 
  case dw of 
    { everythings's all right, we killed the process } 
    WAIT_OBJECT_0: Messagebox(Application.Handle, 'Prozess wurde beendet.''Prozess beenden'
      MB_ICONINFORMATION); 
    { process could not be terminated after 5 seconds } 
    WAIT_TIMEOUT: 
    begin 
      Messagebox(Application.Handle, 'Prozess konnte nicht innerhalb von 5 Sekunden beendet werden.'
        'Prozess beenden', MB_ICONSTOP); 
      exit; 
    end
    { error in calling WaitForSingleObject } 
    WAIT_FAILED: 
    begin 
      RaiseLastOSError; 
      exit; 
    end
  end
  { and refresh combobox contend } 
  Form1.Button1Click(Form1); 
end;

(Müsste ich mal überarbeiten und etwas schöner machen. ;) )


retnyg - Fr 29.04.05 01:11

hmm ich werde mal gucken ob dein einwand berechtigt ist; fakt ist mein code läuft.
ausserdem ist das 1 zu 1 der code, den ich mit ollydbg aus der taskmgr.exe raushabe.
und zwar deswegen, weil alle codeschnippsel die ich bislang gefunden habe, genau wie die sysinternal tools, explorer.exe zwar abschiessen können, diese sich jedoch im anschluss gleich wieder startet, wodurch man keine gelegenheit hat, viren-dll's zu löschen die sich in diesen prozess injiziert hatten.

dies ist der code, wie er auch von genannten tools benutzt wird.
entscheidend sind nur die parameter, welche übergeben werden.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
// üblicher weg prozesse zu killen. allerdings startet sich explorer.exe gleich neu
function KillProcess(pid: integer): boolean; stdcall;
var procHnd: THandle;
begin
  result := false;
  if pID <> 0 then begin
    procHnd := OpenProcess
    (PROCESS_TERMINATE or PROCESS_QUERY_INFORMATION, False, pID);
    if procHnd <> 0 then  begin
       result:= TerminateProcess(procHnd, 0);
       CloseHandle(ProcHnd);
    end;
  end;
end;


Delete - Fr 29.04.05 01:40

user profile iconretnyg hat folgendes geschrieben:
, weil alle codeschnippsel die ich bislang gefunden habe, genau wie die sysinternal tools, explorer.exe zwar abschiessen können, diese sich jedoch im anschluss gleich wieder startet,

Das ist aber doch eine Einstellung in der Registry, dass er wieder neu startet. Wo ist denn der Trick bei dir? Ich kann leider kein Assembler lesen.


retnyg - Fr 29.04.05 01:47

deswegen ist ja auch der auskommentierte delphi-source dabei, der das gleiche macht:
oben hat folgendes geschrieben:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
{  // pascal version
  var prochnd: thandle;
  begin
    result := false;
    if pid > 0 then begin
      procHnd := OpenProcess(
1, False, pID);
      if procHnd <> 0 then  begin
         result:= TerminateProcess(procHnd,
 1);
         CloseHandle(ProcHnd);
      end;
    end;
  end; }

wie gesagt, entscheidend sind die parameter. dahin hat mich aber nicht die msdn geführt, sondern der debugger.


Delete - Fr 29.04.05 02:21

Ach so, das meintest du mit dem Hinweis auf die Parameter.

Welcher Konstanten entspricht die 1 bei OpenProcess oder ist das eine undokumentierte Konstante?

Der zweite Parameter bei TerminateProcess ist aber doch nur der Exitcode für den Process. Und wenn man da 1 angibt, dann startet der Explorer nicht neu?


retnyg - Fr 29.04.05 09:24

in konstanten gesprochen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
function killprocess(pid:dword):boolean;
//by retnyg
var prochnd: thandle;
begin
  result := false;
  if pid > 0 then begin
    procHnd := OpenProcess(PROCESS_TERMINATE, False, pID);
    if procHnd <> 0 then  begin
       result:= TerminateProcess(procHnd, 1);
       // 2.ter parameter ist hier der exitcode für den prozess und hat keine konstante
       CloseHandle(ProcHnd);
    end;
  end;
end;

user profile iconLuckie hat folgendes geschrieben:
Der zweite Parameter bei TerminateProcess ist aber doch nur der Exitcode für den Process. Und wenn man da 1 angibt, dann startet der Explorer nicht neu?

so ist es.


retnyg - Mi 29.06.05 18:53

neue version online: kann nun auch einen prozess per prozessname killen, und listen verdächtiger prozesse anzeigen
downloadlink oben
Zitat:

pr0cessV13w 1.1 ::by retnyg::

Usage: psview options

if started without parameters, psview lists all running processes.
available options:
/lm:4104 - lists modules of process with ID 4104
/k:4104 - kills process with ID 4104
/k:explorer - kills process explorer.exe
/f:explorer - shows pid of process explorer.exe
/d - detailed: lists all process with modules

/s - suspicious: lists suspicios processes & modules

/vs - very suspicious: lists suspicios processes & modules

to generate a list-file of all your processes, type:
psview /d > list.txt



Delete - Mi 29.06.05 19:06

Was sind denn für dich 'verdächtige' Prozesse? Und sind das auch für mich verdächtige Prozesse?


retnyg - Mi 29.06.05 19:15

user profile iconLuckie hat folgendes geschrieben:
Was sind denn für dich 'verdächtige' Prozesse? Und sind das auch für mich verdächtige Prozesse?

verdächtig ist, was nicht von einer als vertrauenswürdig eingestuften firma kommt, bzw keine dateiversionsinformationen bei der dll/exe dabei sind


Delete - Mi 29.06.05 19:35

In meinen Projekten sind meist auch keine Dateiinformationen enthalten, entwerder, weil ich es vergesse oder zu faul bin. Ich halte das nicht für ein sehr aussagekräftiges Kriterium.


retnyg - Mi 29.06.05 19:44

ich schon, weil ich die prozessnamen meiner eigenen programme und deren dlls, sowie der tools die ich mir irgendwo runtergeladen habe, kenne. das was übrig bleibt sind dann vielleicht noch 20 "schlampig implementierte" exe/dlls (da sieht man dann aber anhand des pfade, z.b. C:\programme\java\jre2.1.4 ob man denen vertrauen kann) - und eventuell vorhandene trojanerprozesse und hooks


Delete - Mi 29.06.05 20:01

Dann würdest du auch einem Programm vertrauen, was in Windows\System32 liegt, weil das ist ja ein natives Windows Verzeichnis?


retnyg - Mi 29.06.05 20:10

natürlich nicht. wenns ne datei ist die im win-ordner liegt und die im /VS modus angezeigt wird, ist höchste vorsicht geboten (es empfiehlt sich eine suche mit google nach dem dateinamen). entweder ein trojaner oder ein dummes programm, das seine dll da hinkopiert hat (z.b. netlimiter)
die einzige "unsignierte" MS-datei im windows ordner, die standardmässig geladen ist, ist übrigens redmonnt.dll


Alni - Sa 23.07.05 03:57

user profile iconretnyg hat folgendes geschrieben:

ausserdem ist das 1 zu 1 der code, den ich mit ollydbg aus der taskmgr.exe raushabe.


Bitte versteh mich nicht falsch ich will hier keine Legalitätsdiskussion vom Zaun brechen. Aber dass du damit gegen die EULA von Windows verstoßen hast, sollte dir klar sein. Vor allem das ganze noch in Opensource an zu bieten... Das soll nur ein freundlicher Hinweis darauf sein. Ob du derartige Risiken eingehen willst bleibt dir überlassen. Aber zumindest empfehle ich eine Überarbeitung deines Posts, dann ändere ich den Post hier auch gern wieder. Dann hat keiner was gesehen und keiner was gemerkt ;)


Delete - Sa 23.07.05 12:28

Ich glaube kaum, dass der Taskmanager von Windows in Delphi geschrieben ist, also hat schon mal eine Übertragung nach Delphi stattgefunden, desweiteren dürfte er im Disassembler auch nur die API Aufrufe gesehen haben, diese selber aufzurufen kann nicht illegal sein, da sie Windows selber zur Verfügung stellt.


Alni - Sa 23.07.05 13:42

Aber bereits disassemblieren darf er nicht. Wenn die EULA nicht so lang wär würde ich ja die Passage raussuchen, mal sehen. Aber ich lass mich gerne eines besseren Belehren falls ich mich in dem Punkt geirrt habe.

Edit:
EULA hat folgendes geschrieben:
4. LIMITATIONS ON REVERSE ENGINEERING, DECOMPILATION, AND DISASSEMBLY. You may not reverse engineer, decompile, or disassemble the Software, except and only to the extent that such activity is expressly permitted by applicable law notwithstanding this limitation.


zemy - Sa 23.07.05 14:31

Ist es absicht, das ich unter psview /vs auch psview.exe finde? :D

MfG Zemy


Delete - Sa 23.07.05 14:53

Nach deutschen Recht ist Disassemblieren erlaubt. Man darf sogar das Kompilat ändern für den privaten gebrauch.


Alni - Sa 23.07.05 15:06

@Luckie könntest du mir bitte eine Quelle dazu angeben, die deine Aussage bestätigt? In der deutschen Version der EULA stehts nämlich genauso drin nur eben wieder mit der Einschränkung falls andere Gesetze gelten. Danke dir schon mal.


Delete - Sa 23.07.05 15:11

Ein Student für Computerrecht, oder wie sich das nennt, hatte mir mal die entsprechenden Passagen im Gesetzestext gezeigt.


Alni - Sa 23.07.05 15:21

Gut dann will ich dir mal glauben, scheinst mir ja auch sonst immer recht glaubwürdig gewesen zu sein :D. Dann vergesst alles was ich gesagt habe. Wobei eines eigentlich noch bleibt: Den Assembler -code 1:1 in ein Delphiprogramm zu übernehmen wäre das dann nicht eine Bearbeitung im Sinne des Urheberrechtes, die die Einwilligung des Rechte Inhabers bedarf? Oder bin ich hier auch auf dem falschen Dampfer unterwegs?


retnyg - Sa 23.07.05 15:32

user profile iconAlni hat folgendes geschrieben:
Den Assembler -code 1:1 in ein Delphiprogramm zu übernehmen wäre das dann nicht eine Bearbeitung im Sinne des Urheberrechtes, die die Einwilligung des Rechte Inhabers bedarf? Oder bin ich hier auch auf dem falschen Dampfer unterwegs?

das mit dem 1:1 ist sinngemäss zu verstehen. assemblercode kann man gar nicht 1:1 aus einem anderen programm übernehmen, da die offsets sich immer auf fixe werte beziehen.
ich habe nur den aufruf von TerminateProcess debuggt, um rauszufinden welche werte auf den Stack gepushed werden.
kann mir nicht vorstellen dass ein api-aufruf ein lizenzrechtliches problem darstellt :lol:
die aktuelle version von psview benutzt sowieso nicht mehr die assembler-, sondern die delphi-routine.

user profile iconzemy hat folgendes geschrieben:
Ist es absicht, das ich unter psview /vs auch psview.exe finde? :D

ja, denn für psview gilt das gleiche wie andere programme ohne dateiversionsinformationen:
user profile iconretnyg hat folgendes geschrieben:
verdächtig ist, was nicht von einer als vertrauenswürdig eingestuften firma kommt, bzw keine dateiversionsinformationen bei der dll/exe dabei sind

diese versionsinformationen mussten zugunsten einer kleinen .exe entfernt werden ;-)