View Full Version : Come viene utilizzata la memoria?
Ciao, volevo sapere una cosa particolare.
Le memorie di un processo sono suddivise in locazioni con un loro indirizzo.
Ma questi indirizzi sono globali oppure ogni processo ha una memoria destinata?
Se devo cambiare la locazione 00441D1E del processo pippo.exe che ha id 14B basta usare un comando che cambi la locazione 00441D1E o devo specificare il processo?
Grazie.
Non è un problema di facile risoluzione... Ogni applicazione ha un indirizzamento virtuale completo a 32 bit...che poi viene rimappato in memoria fisica...
Il problema è che accedere alla memoria di una ltro processo non è consentito...o meglio si può fare, non so come, ma è sicuramente molto complesso...
ilsensine
01-06-2004, 21:42
Cosa devi fare esattamente? Devi accedere a un particolare indirizzo fisico?
Devo fare un trainer quindi devo accedere alla particolare locazione "00441B4c" (esempio) di un particolare processo:
pippo.exe con Id 14B...
ma non so come specificare indirizzo e processo in VBasic.
Ciao
Te l'ho detto non è facile... Sotto DOS era facilissimo...ma sotto Windows diventa difficilissimo farlo...ancor più in Visual Basic...
e dal prompt di dos si può fare?
Da un file per DOS è ancora più improbabile accedere alal memoria di un processo a 32 bit...
Forse ho trovato come fare....in assembly, ma a questo punto mi dovrei tradurre tutto in chiamate in C++ e poi in Vb...
http://win32assembly.online.fr/w32_02.txt
Non ti chiedo così tanto!!!
Proverò a dare un occhio su Planetsourcecode.
Eventualmente vi saprò dire.
ciao
ariagiovannifanboy
03-06-2004, 01:51
Usa WriteProcessMemory:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/debug/base/writeprocessmemory.asp
ora, non ricordo se sotto W2K/XP è necessario abilitarsi qualche privilegio, cmq in caso puoi lanciare prima il processo con CreateProcess e a quel punto dovresti essere in grado di farci un po' cosa ti pare.
Ciaus :)
Ma sei un DIO!
Anche perchè sei fan di quella gran :oink: !!
Ma è una funzione che c'è già dentro VBasico o devo richiamarla da Kernel?
Se si come?
E poi devo definire la sub tipo
Define Sub..
BOOL WriteProcessMemory(
HANDLE hProcess,
LPVOID lpBaseAddress,
LPCVOID lpBuffer,
SIZE_T nSize,
SIZE_T* lpNumberOfBytesWritten
);
Qualcosa del genere?
Hai capito cosa devo mettere su
LPVOID lpBaseAddress,
LPCVOID lpBuffer
??
Grazie infinite!
Sì...è la strada giusta... Viene usata anche nel link che ti ho postato sopra...
Si ho trovato qualcosa, però la strada sempre molto in salita!
Visto che il process ID è dinamico, mi devo basare sul nome del processo o il file EXE per determinare il process ID.
Ma è possibile che il nome del processo su API Guide sia chiamato Class name? Oppure è un'altra cosa?
Grazie,ciao
Sono riuscito ad entrare nel processo, ora però ho un'altro problema:
WriteProcessMemory
mi chiede l'indirizzo di memoria come "pointer base address", ma cosa vuol dire?
Io devo scriver sull'indirizzo 0046AFBF (Hex) come converto questo valore esadecimale dell'indirizzo in una stringa Unicode in modo che la funzione mi scriva proprio in quell'indirizzo?
Grazie!
Ciao
L'indirizzo fisico viene mappato a partire da un indirizzo logico. Lo spazio logico di un processo è consecutivo (vedilo come un array) , ma quello fisico non lo è!!
Di solito esiste un registro base che indica il punto di partenza dello spazio logico , e un offset per muoversi al suo interno (che non può superare il limite). O ancora con un sistema di paginazione (che è quello che usa WinXP), esistono delle tabelle di pagina con relativo algoritmo di traduzione in indirizzo fisico.
Io non ho ancora capito come tu possa accedere ad un indirizzo fisico. E' il kernel che sceglie il tipo di mappatura, come si può conoscere tale indirizzo fisico a priori?? IlSensine che dici?
No, ma io non cerco l'IND fisico, quello sono cavoli del sig. Kernel.
Io voglio cambiare l'indirizzo specifico di un processo particolare, esempio "pippo.exe". Ho ricavato l'handle a questo processo, ora però devo scrivergli in memoria.
Avevi capito male (o mi sono spieg male) o la tua perplessità rimane(e quindi non si può..)?
Fammi capire: tu vuoi assegnare a un processo un dato spazio di indirizzi fisici, un po' come i .com del DOS? Ovvero con binding degli indirizzi in fase di compilazione?
Originariamente inviato da beog
Sono riuscito ad entrare nel processo, ora però ho un'altro problema:
WriteProcessMemory
mi chiede l'indirizzo di memoria come "pointer base address", ma cosa vuol dire?
Io devo scriver sull'indirizzo 0046AFBF (Hex) come converto questo valore esadecimale dell'indirizzo in una stringa Unicode in modo che la funzione mi scriva proprio in quell'indirizzo?
WriteProcessMemory scrive una sequenza di BYTE...quindi il base address dovrebbe essere l'indirizzo di partenza da cui cominciare a scrivere...
No, devo fare un trainer. Quindi devo modificare una variabile di un programma. L'allocazione non è fisica, è riferita al processo.
Se il processo ha l'allocaz da 000000 a FFFFFFF (che fisicamente sarà dove sarà...) io voglio cambiare il valore di alcuni byte di questa memoria.
Precisamente la locaz 0046AFBF ma non è la posizione assoluta in memoria, ma è quella assegnata al processo che voglio io.
Capisci?
Quello che volevo sapere in soldoni è se quando uso:
WirteProcessMemory (handle,address,bufferDaMandare,Flase,Null)
quel Address che è definito come Long può essere ricollegato all'indirizzo di memoria relativo al processo.
Esempio se il long è:
0000000000000000 (Long Dex) è assegnato all'indirizzo 000000 (Hex)
Se il long è 0000000000000015 è assegnato all'indirizzo 00000F.
O comunque se c'è un modo per capire questo paramento decide l'indirizzo.
Grazie ancora per la pazienza.Ciao
Ricordati che la scrittura funziona solamente se l'area di memoria è accessibile in scrittura...
Comunque dai un'occhiata qui, c'è scritto ;) http://msdn.microsoft.com/library/default.asp?url=/library/en-us/debug/base/writeprocessmemory.asp
me sono già riuscito a scrivere (la funzione mi restituisce "1" quindi..penso di aver il permesso) il problema è che non so dove ho scritto!!!
Non so perchè io ho i riferimenti in HEX (come tutti gli indirizzi di mem) mentre la funzione accetta un long... che è definito come
lpBaseAddress
[in] Pointer to the base address in the specified process to which data will be written. Before any data transfer occurs, the system verifies that all data in the base address and memory of the specified size is accessible for write access. If this is the case, the function proceeds; otherwise, the function fails.
Cosa devo fare per metterci dentro l'HEx che ho io?
ariagiovannifanboy
03-06-2004, 20:47
Allora,
premetto che non so nulla di Visual Basic quindi se ho scritto qualche cacchiata perdonami :-)
in lpBaseAddress ci devi mettere appunto l'indirizzo di base da dove iniziare a scrivere (come diceva giustamente cionci), scrivilo pure in "HEX", l'Hex non è altro che una notazione, che tu scriva in hex[esadecimale] o in decimale è indifferente.
lpBuffer è l'indirizzo di memoria dove la funzione va a leggere i byte che vuoi scrivere
nSize il numero di byte che vuoi scrivere
lpNumberOfBytesWritten il numero di byte che WriteProcessMemory ha scritto (puoi anche non passarlo)
Ciao
ariagiovannifanboy
03-06-2004, 20:52
Originariamente inviato da ariagiovannifanboy
Allora,
premetto che non so nulla di Visual Basic quindi se ho scritto qualche cacchiata perdonami :-)
quel Address che è definito come Long può essere ricollegato all'indirizzo di memoria relativo al processo.
Si =)
in lpBaseAddress ci devi mettere appunto l'indirizzo di base da dove iniziare a scrivere (come diceva giustamente cionci), scrivilo pure in "HEX", l'Hex non è altro che una notazione, che tu scriva in hex[esadecimale] o in decimale è indifferente.
lpBuffer è l'indirizzo di memoria dove la funzione va a leggere i byte che vuoi scrivere
nSize il numero di byte che vuoi scrivere
lpNumberOfBytesWritten il numero di byte che WriteProcessMemory ha scritto (puoi anche non passarlo)
Ciao
ariagiovannifanboy
03-06-2004, 20:53
Mi sono auto quotato.. ehm :) ops :rotfl:
Mi dispiace alquanto, ma non mi risulta!
Almeno con il programma che ho io per vedere la memoria dei processi non sono riuscito a vedere nessun cambiamento nell'indirizzo che mi sono inserito.
Tra l'altro il valore in Hex io l'ho inserito come Stringa (TExtBox) come fa lui a capire che quello è un val in Hex?
Anche se converto l'Hex in Decimale e poi lo butto dentro non funziona.
Non è che per caso lui accetta stringhe, long, di tutto come indirizzo e poi le converte tutte in un numero?
Grazie
Devi convertire la stringa in numero... Questo senza dubbio... Altrimenti non ti funziona una cippa... HEX o dec non conta niente (basta usare l'opportuna notazione), basta convertire la stringa in numero...
Raga sono riuscito a vedere qualcosa, però non ci capisco molto.
vi descrivo quello che ho fatto:
Siccome il parametro Address deve essere scritto in Unicode ho dovuto convertire prima la Stringa dell'address:
indirizzoPerFunzione = StrPtr(indirizzoLetto)
Dopo l'ho buttata dentro la funzione e mi sono fatto restituire in MsgBox questo:
MsgBox CLng(indirizzoPerFunzione)
Ho convertito il valore numerico in Hex e ho guardato nella locaz relativo e... è cambiata!!!
Ora il mio problema è:
Questo StrPtr che è OBLIGATORIO (ho provato ad ometterlo e non va più la funzione), mi scombina tutto perchè come paramentro vuole solo stringhe e quindi quando butto dentro un numero DEc 124513 lui me lo converte in Stringa con consegente alterazione del valore!
Come faccio a scrivere un valore in Unicode senza usare StrPtr?
Esiste una funzione inversa?
Grazie
PS:
Ho provato anche a fare:
Text1.text = StrPtr("Ciao Mondo!")
E ogni volta text1 cambia valore (continuano ad alternarsi 3 valori)
Che cos'è?
Con un po' di fantasia non ci voleva tanto a farsela la funzioen ;)
Function Hex2Dec(txt As String)
Dim base As Long
base = 1
Hex2Dec = 0
For i = Len(txt) To 1 Step -1
If Mid(txt, i, 1) = "A" Or Mid(txt, i, 1) = "a" Then
Hex2Dec = Hex2Dec + base * 10
ElseIf Mid(txt, i, 1) = "B" Or Mid(txt, i, 1) = "b" Then
Hex2Dec = Hex2Dec + base * 11
ElseIf Mid(txt, i, 1) = "C" Or Mid(txt, i, 1) = "c" Then
Hex2Dec = Hex2Dec + base * 12
ElseIf Mid(txt, i, 1) = "D" Or Mid(txt, i, 1) = "d" Then
Hex2Dec = Hex2Dec + base * 13
ElseIf Mid(txt, i, 1) = "E" Or Mid(txt, i, 1) = "e" Then
Hex2Dec = Hex2Dec + base * 14
ElseIf Mid(txt, i, 1) = "F" Or Mid(txt, i, 1) = "f" Then
Hex2Dec = Hex2Dec + base * 15
Else
Hex2Dec = Hex2Dec + base * CLng(Mid(txt, i, 1))
End If
base = base * 16
Next
End Function
Private Sub Command1_Click()
Dim v1 As Long
v1 = Hex2Dec(Text1.Text)
Text2.Text = "" & v1
End Sub
Ma la funzione inversa a StrPtr non per l'Hex!
Cmq la funzione inversa prob non esiste... resta che io sto StrPtr non lo capisco!
Sono riuscito a imbroccare l'indirizzo... ora come cambiarlo?
Provando a fare così:
WriteProcessMemory (processHandle, Indirizzo(Long), stringaDaScrivere(Long), 6, vbNullString)
mi cambia le 6 locazioni (giustamente)
ma però se io su stringaDaScrivere gli do "0" (poi la converte con CLng)
Dovrebbe darmi "00 00 00 00 00 00" invece non cambia niente!
Se invece io cambio la dichiarazione della stringa con:
stringaDaScrivere = Clng(StrPtr(TExt3.text))
allora mi scrive dei valori (non 0, valora che non so da cosa derivino!)
controllando poi il valore long di StringadaScrivere vedo che ha valori tipo 1314421 (7 cifre) e sempre tra 1300000 e 1400000
se scrivo altri valori (anche inferiori) la mappatura della memoria resta invariata!
I valori variano solo se metto numeri così alti... anche se cambio il numero di bit da scirivere?
PERCHE'?
Veramente io non capisco perchè con StrPtr cambi qualcosa altrimenti non funzia.
Illuminatemi :muro:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.