dll/exe laden/ausgeben/speichern

iLu_is_a_loser

Erfahrenes Mitglied
Hex/Asm Editor - Brauche Hilfe

Gutn abend!
ich verzweifel gerade am laden einer dll oder einer exe datei! enthälft die dll nur ein paar zeichen, so kann sie mit fopen / ReadFile geöffnet/ausgegeben/gespeichert werden..
wenn es allerdings riesig große dlls sind mit zb 100.000 bytes, dann wird entweder gar nichts ausgegeben oder das programm kackt ab! bei cout und bei der darstellung in einer editbox
ich versuche nur einen kleinen hexeditor zu machen, wobei ihr mir sicher helfen könnt!
schonmal danke fürs reinschauen!
 
Zuletzt bearbeitet:
moin


Also das hat garncihts damit zu tun welche Art Datei das ist, du solltest sie auf jedenfall binär öffnen.

wenn es allerdings riesig große dlls sind mit zb 100.000 bytes,
Jo riesen groß, haben glatt 0,1MB so groß sind die, naja wie dem auch sei.
Kann es sein das du die Datei erst in ein Array lädst, das nciht großgenug ist?!


mfg
umbrasaxum
 
och^^ 100.000 bytes in einer textbox sind nich wenig...
ich denke mit der funktion mit LPSTR sollte ich keine probleme mit dem array haben:
auserdem gehts ja mit ner kleinen file
Code:
LPSTR LoadFile2Str(LPSTR pszFileName)
{
   HANDLE hFile;   
   LPSTR pszFileText;
   hFile = CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
		   OPEN_EXISTING, 0, 0);
		   
   if(hFile != INVALID_HANDLE_VALUE)
   {
	  DWORD dwFileSize;
	  dwFileSize = GetFileSize(hFile, NULL);
	  if(dwFileSize != 0xFFFFFFFF)
	  {		
		 pszFileText = (LPSTR)GlobalAlloc(GPTR, dwFileSize + 1);
		 if(pszFileText != NULL)
		 {
			DWORD dwRead;
			if(ReadFile(hFile, pszFileText, dwFileSize, &dwRead, NULL))
			{
			   pszFileText[dwFileSize] = 0;			  
			}			
		 }
	  }
	  CloseHandle(hFile);
   }
   return pszFileText;
}

Code:
void OutputHex(HWND hwnd)
{
LPSTR Buffer = LoadFile2Str("ws2_32.dll");
SetDlgItemText(hwnd, IDC_HEX, Buffer);
}
MZé steht am ende in der editbox bzw in der console
sollte ich vll __wfopen und SetDlgItemTextW verwenden mein problem war nur den filepfad in wchar * umzuwandeln^^.. kann mir da jemand behilflich sein?

greetz
 
moin


och 100.000 bytes in einer textbox sind nich wenig...
Ja gut 100.000 bytes = 100000Zeichen, das ist für ne TextBox wirklich nciht wenig.

auserdem gehts ja mit ner kleinen file
Ja das meinte ich doch, das es mit einer kleinen geht und eine "große" zuviel für den Speicher ist...
Aber du allocierst den ja entsprechend der Größe der Datei, drum sollte das kein Problem sein.


Ich denke dort ist der Fehler:
Code:
LPSTR Buffer = LoadFile2Str("ws2_32.dll");
Vielleicht solltest du dort auch erst Speicherplatz allozieren.
Möglicherweise wird ab einer bestimmten Größe bzw Menge an Zeichen, irgendwas überschrieben.

Sonst würde ich einfach mal mit nem Debugger drüber gehen, dann weisst du wenigstens genau wo der Fehler auftritt.


mfg
umbrasaxum
 
Du kannst dir nur die ersten 3 bytes als Ascii Wert anzeigen lassen weil das 4te byte in deiner Datei ein 0byte ist. Du musst den Buffer formatiert ausgeben (vorzugsweise als Hexwert via "%02X" wie's bei Hexeditoren so üblich ist). dwFileSize musst du natürlich auch noch aus der LoadFile2Str Funktion mitnehmen, sonst weisst du ja nicht wieviel bytes du ausgeben musst.
 
ich habs rausgefunden.. die schleife hats nicht überlebt bei sovielen widerholungen :D
ich hab mal den timer genommen:
Code:
 LPSTR hex;
int size;
LPSTR FileText; 
 
LPSTR LoadFile2Str(LPSTR pszFileName)
{
   HANDLE hFile;   
   LPSTR pszFileText;
   hFile = CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
		   OPEN_EXISTING, 0, 0);
		   
   if(hFile != INVALID_HANDLE_VALUE)
   {
	  DWORD dwFileSize;
	  dwFileSize = GetFileSize(hFile, NULL);
	  if(dwFileSize != 0xFFFFFFFF)
	  {		
		 pszFileText = (LPSTR)GlobalAlloc(GPTR, dwFileSize + 1);
		 if(pszFileText != NULL)
		 {
			DWORD dwRead;
			if(ReadFile(hFile, pszFileText, dwFileSize, &dwRead, NULL))
			{
			   pszFileText[dwFileSize] = 0;			  
			}			
		 }
	  }
	  CloseHandle(hFile);
   }
   return pszFileText;
}
int FileSize(LPSTR pszFileName)
{
 HANDLE hFile;
 DWORD dwFileSize;
 hFile = CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ, NULL,OPEN_EXISTING, 0, 0);
		   
 if(hFile != INVALID_HANDLE_VALUE)
  {
  dwFileSize = GetFileSize(hFile, NULL);
  }
 return (int)dwFileSize;
}
void SetHex()
{
 size = FileSize("C:/WINDOWS/system32/wmiscmgr.dll");
 hex = new char[size];
 FileText = LoadFile2Str("C:/WINDOWS/system32/wmiscmgr.dll");
 sprintf(hex,"");
}
Code:
  void CALLBACK IncTimer1 (HWND hwnd, UINT iMsg, UINT iTimer, DWORD dwTime)
{
 i++;
 if(i<=size)
 {
  sprintf(hex,"%s%.2x%c%c",hex,FileText[i],0x0d,0x0a);
  SetDlgItemText(hwnd, EDIT_HEX, hex);
 }
 if(i >= size)
  KillTimer(hwnd, INCTIMERID1);
}
Code:
...case IDC_OPEN:
	 {
	  PrintHex();
	  SetTimer(hwnd, INCTIMERID1, 10, (TIMERPROC) IncTimer1);//PrintHex(hwnd);
	 }


jetzt tritt aber ein anderes problem auf.. ist es normal, dass bei %.2x // %02x sowas ausgegeben wird:

5e
00
00
59
ffffff8b
ffffffc7
5f
ffffffeb
15
ffffff8b
ffffffce
ffffffe8

und ab und zu hunderte von nullen?
greetz
 
Zuletzt bearbeitet:
FileText ist vom typ LPSTR vermute ich mal, dh. du musst das sprintf in etwa so gestalten:

Code:
sprintf(hex,"%s%.2x%\r\n",hex,(UCHAR)FileText[i]);
 
Code:
void SetHex()
{
size = FileSize("C:/WINDOWS/system32/ws2_32.dll");
hex = new char[size*4];
FileText = LoadFile2Str("C:/WINDOWS/system32/ws2_32.dll");
sprintf(hex,"");
}
Code:
void CALLBACK IncTimer1 (HWND hwnd, UINT iMsg, UINT iTimer, DWORD dwTime)
{
 
if(i<=size-1)
{
sprintf(hex,"%s%.2x%\r\n",hex,(UCHAR)FileText[i]);
SetDlgItemText(hwnd, EDIT_HEX, hex);
}
else
KillTimer(hwnd, INCTIMERID1);
i++;
}

was macht den timer zu einer endlosschleife wenn ich ihn so aufrufe:
SetHex();
SetTimer(hwnd, INCTIMERID1, 1, (TIMERPROC) IncTimer1);

hättet ihr andere ideen?
thx @ rockbaer! es geht perfekt

[edit]:
sry.. doch keine endlosschleife^^ dauert nur ne halbe stunde :(
 
Zuletzt bearbeitet:
Wieso willst du das ganze eigtl. via Timer ausgeben ? So wie ich das sehe gibst du alle 10 millisekunden einen Hexwert mehr im Editfenster aus. Du kannst doch alles zusammen ausgeben, oder hast du den Timer noch aus einem anderen Grund eingefügt?
 
asm editor

gute frage^^
es soll ja ein asm editor werden und deswegen soll für jedes offset erstma ein byte stehn. wie bekomm ich denn sonst ohne timer/schleife \r\n in den string nach jedem byte? und später sollten dann die offsets zusammengeschweist werden, wenn die bytes eine asm funktion ergeben.

andere ideen? würd mich freuen, wenn ihr mir da weiterhelfen könnt!
 
Zurück