[c++] mein prog verabschiedet sich..

hoi alle zusammen!
sodala, hab wiedermal ein problem i sachen c++ und so..
mein code:
Code:
#define MAX_PIDS 30
	char *puf = (char*)malloc(BUFMAX);
	DWORD pids[MAX_PIDS];
	printf("***** !procpid\n\tPID listing for %s:\n", argv[1]);
	name2pid(argv[1], (DWORD *)&pids, MAX_PIDS);
	if(!pids[0]) {
		AddText(ctl_stat, "** No Process with this name found!");
		printf("\tNo process found\n");
	}
	else {
		for(int i=1;i<=pids[0];i++) {
			bool dwRet = false;
			HANDLE hProcess = OpenProcess(  PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pids[i]);
			/*if(hProcess) {
				GETMODULEFILEN imp_GetModuleFileNameEx = (GETMODULEFILEN)GetProcAddress(LoadLibrary("psapi.dll"), "GetModuleFileNameExA");
				dwRet = imp_GetModuleFileNameEx(hProcess, NULL, modPath, MAX_PATH);
				}
			if(!hProcess || !dwRet)*/
				sprintf(modPath, "**Error retrieving module path. [%i]", GetLastError());
			printf("\t[%5i]\t%s\n", pids[i], modPath);
		}
	}
	free(puf);
ein bisschen erläuterung: die funktion kriegt also argv[1] einen prozessnamen und holt sich mit der funktion name2pid alle pids, die diesen prozessnamen haben. soweit sogut, aber sobalt ich den auskommentierten teil wieder "einkommentiere", schmiert mri das ganze (komplett ohne fehlermeldung ?() einfach ab..
hier noch der code der name2pid() [die fuellt das uebergebene array mit den pids auf, wobei das erste element des arrays die anzahl der zurueckgegebenen pids angibt.]
Code:
#define SystemProcessInformation 5
int name2pid(char*pName, DWORD outArray[], int maxpids)
{
  DWORD len = 0;
  BYTE * buf = (BYTE*)malloc(BUFMAX);
  char * procname = (char*)malloc(1024);
  strcpy(procname, pName);
  outArray[0] = 0;
  NTQUERYSYSINFO NtQuerySystemInphormation = (NTQUERYSYSINFO)GetProcAddress(LoadLibrary("ntdll.dll"), "NtQuerySystemInformation");  

  NtQuerySystemInphormation(SystemProcessInformation, buf, BUFMAX, &len);
  SYSTEM_PROCESS_INFORMATION* info = (SYSTEM_PROCESS_INFORMATION*)buf;
  static char temp[1024];
  for(;;)
  {
    sprintf(temp,"%S",info->ImageName);
    if (stricmp(temp,procname)==0) if(++outArray[0]<=maxpids) outArray[outArray[0]] = (DWORD)info->UniqueProcessId;
    if (info->NextEntryOffset==0) break;
    (DWORD)info += info->NextEntryOffset;
  }
  free(procname);
  free(buf);
  return 0;
}

irgendwer ne erklärung, an was das liegt? meiner meinung nach irgendwas mit dem puffer modPath, in den der pfad geschrieben wird, denn je nachdem wie und wo ich den deklariere, variieren die ergebnisse, aber funktioniert hats noch nie X(

mfg jacky

edit: achja, gibts eigentlich ne explizite methode, um bei einem edit feld einen text dranzuhängen? also z.b. wie bei einem chat-fenster.. denn momentan kopier ich zuerst den ganzen alten inhalt, häng das neue dran und kopiers dann wieder rein, und das is anscheinend nich sehr ressourcensparend...
 
Kleiner Tipp:
Es ist keine gute Idee jeden Prozess des Systems zu öffnen,
das macht manche Prozesse sauer :D
 
naja ok ich wollt sie ja nur n bisschen ärgern ;) naja aber davon abgesehen, dass ich vergessen hab die handles wieder mit closehandle zu schließen, funktionierts ja. nur der auskommentierte teil macht probleme.. hab irgendwie das gefuehl, das ganze liegt an meinem compiler, meine programme scheinen nämlich auch von einem aufs andere mal einfach pointer-werte zu "vergessen", z.b. auch hier:
Code:
	treedump_buf = (char*)malloc(BUFMAX);
	DWORD len = 0;

    SYSTEM_PROCESS_INFORMATION* info = (SYSTEM_PROCESS_INFORMATION*)treedump_buf;
    for(;;)
    {
      if (info->unk14 != 666) // temp id
      {
        printf("%s (PID=%i)\n",
          info->InheritedFromUniqueProcessId==0?"<root>":"<terminated>",
          info->InheritedFromUniqueProcessId);
        tree_dump((int)info->InheritedFromUniqueProcessId,0);
      }
      printf("&info=0x%.8X", info); //wenn diese zeile auskommentiert wird, zeigt info auf einmal auf eine ungueltige addresse...
      if (info->NextEntryOffset==0) break;
      (DWORD)info += info->NextEntryOffset;
#

werd dann mal versuchen, mein programm mit nem anderen compiler zum laufen zu bringen und kucken, ob das ganze da genauso aussieht..

mfg
 
Es wäre auf jedenfall eine gute Idee, "imp_GetModuleFileNameEx" vor dem Gebrauch auf Gültigkeit zu testen - denn es könnte ja auch NULL sein.
Wenn Du das Programm als Binray anhängst (das erste - mit dem im_GetModuleFileNameEx Problem), schmeiße ich gerne meinen Debugger an und schaue, was da falsch läuft.
 
ok die funktion zu ueberpruefen is natuerlich sinnvoll, aber nicht das eigentliche problem, da ich ja mit meinem printf den pointer schon ausgegeben habe und die funktion richtig geladen wurde.
hab jetz mal den source und ein binary angehängt, vielleicht kannst dus dir mal ansehen und mir sagen was ich falsch mache. da das ganze "projekt" ein bisschen größer ist, hab ich dir einen int3 an den beginn der funktion gesetzt (die problemfunktion befindet sich in der cmdhandlers.cpp als "cmdHDL_procpid(....)", die name2pid funktion in functions.cpp)
zum ausprobieren das programm starten und "!pid <prozessname>" eingeben..
hab jetz die name2pid nochmal umgeschrieben, so dass sie einfach das array fuellt und ans ende eine 0 setzt:
///////////////////////////////////////////////////
// Get PID from process name
DWORD name2pid(char*pName, DWORD *outArray, int maxpids)
{
odprintf("name2pid(%s, %.8X, %i)", pName, outArray, maxpids);
DWORD len = 0;
static DWORD pidFound = 0;
BYTE * buf = (BYTE*)malloc(BUFMAX);
char * procname = (char*)malloc(1024);
strcpy(procname, pName);
outArray[0] = 0;
NTQUERYSYSINFO NtQuerySystemInphormation = (NTQUERYSYSINFO)GetProcAddress(LoadLibrary("ntdll.dll"), "NtQuerySystemInformation");

NtQuerySystemInphormation(SystemProcessInformation, buf, BUFMAX, &len);
SYSTEM_PROCESS_INFORMATION* info = (SYSTEM_PROCESS_INFORMATION*)buf;
static char temp[1024];
for(;;)
{
odprintf("**&info=%.8X; info->NextEntryOff=%.8X", info, info->NextEntryOffset);
sprintf(temp,"%S",info->ImageName);
odprintf("checking process %s", temp);
if (stricmp(temp,procname)==0)
if(pidFound<=maxpids-1) {
outArray[pidFound++] = (DWORD)info->UniqueProcessId;
odprintf("Match!");
}
if (info->NextEntryOffset==0) break;
(DWORD)info += info->NextEntryOffset;
odprintf("##&info=%.8X; info->NextEntryOff=%.8X", info, info->NextEntryOffset);
}
//odprintf("name2pid ends, returning %i", pidFound);
outArray[pidFound+1] = 0;
free(procname);
free(buf);
return pidFound;
}
vielleicht kann mir dann auch mal wer erklären, wieso mir die funktion nur mist zurueckgibt? bzw. könnte die funktion mal wer selbst implementieren und sehen, ob das bei ihm genauso ist? bin schön langsam ziemlich ratlos..

mfg jacky
 
im Moment sehe ich Probleme in dieser Zeile:
Code:
 if(pidFound<=maxpids-1)
frag mich nicht warum, aber pidFound ist zu dem Zeitpunkt ein Pointer auf den gesuchten Namen. Wird anscheinend immer von den "odprintfs" überschrieben. So auch am Ende der Funktion:
outArray[pidFound+1] = 0;
hat pidFound einen pointer auf "MATCH".
Habe die Werte (pidFound) im Debugger "per Hand" korrigiert - und siehe da:

Die Funktion GetModuleFileNameEx liefert anstandlos den Namen:
C:\download\crackmes\26.10.06\stdcmd>
** pid
**Privileges for current process adjusted OK
**Listing PIDS for process name procexp.exe:
[ 628] C:\download\ProcessExplorerNt\procexp.exe
[ 374] **Error retrieving module path. [87]
-------------------------------------
Die "Error retrieving" Zeile kommt davon, dass Du GetModuleFileNameEx auf 0 testest, die Funktion aber im Erfolgsfall die Anzahl der geschriebenen Zeichen zurückgibt ;).
Im Quelltext kann ich beim besten Willen nicht die Ursache dafür finden, warum pidFound überschrieben wird - sind odprintfs von Dir?
 
also die odprintf funktion hab ich von dieser seite hier: http://www.unixwiz.net/techtips/outputdebugstring.html
dachte mir is ne ganz nette funktion fuer debugging-zwecke, aber ich hab das programm jetz mal so umgeschrieben dass es sich mit meinem borland c++builder kompilieren lässt (hab dem digital mars-compiler nicht so ganz vertraut X( ) und bin jetz mal mit dem borland-debugger durchgegangen. hab jedenfalls festgestellt dass da was auf dem stack mächtigst schief läuft und da is wohl die odprintf funktion am ehesten dafuer verantwortlich.. werd die mal rauswerfen und schaun obs dann funktioniert..

danke erstmal :)

edit: hab jetz alle odprintfs raus, aber daran liegts nicht, die sprintfs schmeißen mir auch meine variablen durcheinander... hab allerdings rausgefunden, dass wenn ich sie als static deklariere, werden die in ruhe gelassen (static liegt dann nimmer aufm stack oder wie?) naja dann werd ich einfach mal alle variablen als static deklarieren und schaun was da rauskommt ^^ schön langsam verzweifel ich an dem milde gesagt 'unkonventionellen' verhalten meines programms..
edit2: hab nochmal was gefunden, nämlich codeguard von borland meckert bei einigen sprintfs und snprintfs, z.b.
Code:
	sprintf(buf, "\r\n**%10s", argv[0])
:
"Attempt to access 1 bytes at 0x0012FEB4, that is at offset 4 in local block 0", wobei hier mein "buf" auf 0x0012FEC0 zeigt. irgendwer ne idee wieso meine sprintfs auf einmal mist bauen?
 
Zurück
Oben