Hola, actualmente para buscar valores en la memoria y modificarlos utilizaba la herramienta scanmem y quiero hacer una gui que haga lo mismo pero sin utilizar el binario :)
Se que suena raro pero en la práctica estoy utilizando ARM y es muy dificil encontrar un binario compatible debido a los sistemas de protección del dispositivo pero tengo acceso desde el terminal a leer y escribir los archivos /proc/pid/maps.
Se que en ese lugar se aloja la memoria de cada aplicación y me gustaría hacer una app gráfica capaz de leer y escribir los valores de memoria. Solo necesito manipular enteros de 32 bits.
Alguien me da una mano sobre la estructura de estos archivos y donde buscar estos valores?
Bueno, leyendo algunos documentos oficiales sobre la estructura de estos archivos hice este pequeño script para leer la memoria de una aplicación a traves de su pid:
<?php
$map = '/proc/'.$argv[1].'/maps';
echo "Leyendo ".$map." ...\n";
$lines = file($map);
foreach($lines as $line){
$line = trim($line);
$mode = substr($line, 26, 4);
$start = hexdec(substr($line, 0, 12));
$end = hexdec(substr($line, 14, 25));
$length = $start - $end;
echo "Start: ".$start." End: ".$end." Mode: ".$mode."\n";
$mem = file_get_contents('/proc/'.$argv[1].'/mem', NULL, NULL, $start, $length);
echo $length." ------------\n".$mem."\n------------\n";
}
Comprendiendo que los primeros dos valores de cada línea es la posición en hexadecimal de los bytes que se alojan en el archivo /proc/pid/mem, el problema es que parece que lo estoy haciendo mal ya que al convertir el valor hexadecimal a decimal me arroja un error exageradamente elevado:
Citar7ffd9c73b000-7ffd9c73d000 r--p 00000000 00:00 0 [vvar]
------------
Start: 140727228280832 End: 7.5513797076684E+22 Mode: r--p
PHP Warning: file_get_contents(/proc/3385/mem): failed to open stream: Permission denied in /home/whk/Escritorio/read.php on line 14
-7.5513796935957E+22 ------------
Algo estoy haciendo mal :-/
Bueno, fue un error mio, usé mal el substr, puse el valor final en ves de la cantidad de bytes y también me equivoqué al restar inicio con final, era final con inicio xD
Ahora si funciona de lujo :D
<?php
if(!isset($argv[1])){
echo "Uso: sudo php read.php PID\n";
exit;
}
$regiones = array("misc", "code", "exe", "heap", "stack");
$map = '/proc/'.$argv[1].'/maps';
echo "Leyendo ".$map." ...\n";
$lines = file($map);
foreach($lines as $line){
$line = trim($line);
$separator = substr($line, 12, 1);
if((string)$separator !== '-')
continue;
$mode = substr($line, 26, 4);
/*
r = read
w = write
x = execute
s = shared
p = private (copy on write)
*/
$start = substr($line, 0, 12);
$end = substr($line, 13, 12);
$length = (hexdec($end) - hexdec($start));
$mem = file_get_contents('/proc/'.$argv[1].'/mem', NULL, NULL, hexdec($start), $length);
/*if(strpos($mem, "testdisk.log") !== false){
//echo substr($mem, strpos($mem, "testdisk.log"), 100)."\n";
echo $mem;
exit;
}
$cmd = substr($mem, 0, 512);*/
//if($length < 2048){
echo
"------------------------------------------\n".
"Start : ".$start." (".hexdec($start).")\n".
"End : ".$end." (".hexdec($end).")\n".
"Length : ".$length."\n".
"Mode : ".$mode."\n".
//"Mem (15) : ".$mem."\n";
"Mem (15) : ".bin2hex(substr($mem, 0, 15))."\n";
//}
}
Ahora mi pregunta es:
Tengo una serie de bytes, si quiero buscar un valor entero (Int32) debo convertir los bytes a int32?
Bueno, finalmente veo que tiene una estructura ya mas definida cada bloque de memoria.
Finalmente me estoy guiando por el mismo proyecto de scanmem
https://github.com/scanmem/scanmem
Igual gracias de todas maneras.
Saludos.
Es algo raro este tema no? que un usuario se responda así solo ;-), me ha asado no te preocupes :xD
Saludos.