Avatar billede sessa Nybegynder
05. juni 2008 - 21:14 Der er 7 kommentarer og
1 løsning

Hvorfor kan jeg ikke læse fra User32's memory?

Jeg sidder og pusler med funktioner som CreateProcess, ReadProcessMemory og den slags, og pludselig er jeg løbet ind i et underligt problem:

STARTUPINFO si;
ZeroMemory( &si, sizeof( si ));
si.cb = sizeof( si );

PROCESS_INFORMATION pi;
ZeroMemory( &pi, sizeof( pi ));

if ( !CreateProcess( "target.exe", NULL, NULL, NULL, false,
                      SUSPENDED, NULL, NULL, &si, &pi ))
  MessageBox( NULL, "", "CreateProcessFejl", MB_OK );

BYTE bt = 0;
LPVOID addr = (LPVOID)0x77D50B22;
if ( ReadProcessMemory( pi.hProcess, addr, &bt, 1, NULL ) == NULL )
  MessageBox( NULL, "", "ReadProcessMemoryFejl", MB_OK );

I ovenstående lille kodestump forsøger jeg at læse en byte fra den process jeg har startet med CreateProcess. Det går osse fint, så længe adressen jeg læser fra hører til selve target.exe - men når jeg som her bevæger mig udenfor det område, altså til 77D50B22, som hører til user32, så kommer messageboxen med "ReadProcessMemoryFejl".

Hvordan kan det være? Jeg troede at user32 bare var et af de moduler, der hører til i target.exe's adresserum. Og derfor skulle være til at læse uden videre.

Jeg håber nogen vil fortælle mig, hvad jeg har misforstået.
Avatar billede sessa Nybegynder
05. juni 2008 - 22:45 #1
Jeg fandt lige ud af, at hvis jeg i stedet for:

LPVOID addr = (LPVOID)0x77D50B22;
if ( ReadProcessMemory( pi.hProcess, addr, &bt, 1, NULL ) == NULL )

skriver:

long addr = 0x77D50B22;
if ( ReadProcessMemory( pi.hProcess, &addr, &bt, 1, NULL ) == NULL )

...så undgår jeg fejlmeldingen. Men den læser stadig ikke den pågældende byte. bt bliver ved med at være 0, uanset hvor meget jeg ændrer på addr - så nu har jeg to spørgsmål:
1. Hvorfor læser den ikke noget?
2. Hvorfor er LPVOID ikke lige så godt som long?
Avatar billede sessa Nybegynder
05. juni 2008 - 23:06 #2
Suk! Jeg vrøvler vist - glem venligst mit andet indlæg...
Avatar billede arne_v Ekspert
06. juni 2008 - 00:41 #3
77D50B22 lyder altså som en adresse i stak ikke som en adresse i user32.dll
Avatar billede sessa Nybegynder
06. juni 2008 - 08:33 #4
Hvis jeg kikker på det med en debugger, i dette tilfælde Ollydbg, så ser det sådan ud:

77D50B22  /74 1C          JE SHORT USER32.77D50B40
77D50B24  |6A 02          PUSH 2
77D50B26  |FF75 18        PUSH DWORD PTR [EBP+18]
77D50B29  |FF75 14        PUSH DWORD PTR [EBP+14]
77D50B2C  |FF75 10        PUSH DWORD PTR [EBP+10]
77D50B2F  |50              PUSH EAX
77D50B30  |56              PUSH ESI
77D50B31  |E8 7BCEFEFF    CALL USER32.DialogBoxIndirectParamAorW

...og debuggeren skriver, at dette er "main thread, module user32".

Men selv hvis det var stakken, skulle jeg vel kunne læse fra den alligevel?
Avatar billede frand Nybegynder
06. juni 2008 - 10:37 #5
Prøv at undersøge den aktuelle process, som du har startet med CREATE_SUSPENDED. Alle de forskellige dll filer er nok ikke indlæst på dette tidspunkt
Avatar billede sessa Nybegynder
06. juni 2008 - 16:19 #6
Du har ret, frand! Jeg kan ganske vist ikke påstå, at jeg helt forstår det, for som jeg læser beskrivelsen af CreateProcess burde en process være helt klar til at køre efter at være 'created'. Dvs at det hele burde være indlæst.

Men jeg prøvede at injicere bytes EB FE ( som får processen til at køre på stedet ), og derefter bruge ResumeThread og SuspendThread. Og så virkede min ReadprocessMemory pludselig!

Der er noget at undersøge her, men tak for hjælpen - lægger du et svar?
Avatar billede sessa Nybegynder
17. juni 2008 - 08:59 #7
Et svar, frand?
Avatar billede sessa Nybegynder
29. juli 2008 - 11:39 #8
Jeg må vist hellere lukke...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester