Como buscar un Integer en la memoria de forma manual?

Iniciado por WHK, 26 Abril 2015, 00:17 AM

0 Miembros y 1 Visitante están viendo este tema.

WHK

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?

WHK

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:

Código (php) [Seleccionar]
<?php
$map 
'/proc/'.$argv[1].'/maps';
echo 
"Leyendo ".$map." ...\n";
$lines file($map);

foreach(
$lines as $line){
$line trim($line);

$mode substr($line264);
$start hexdec(substr($line012));
$end hexdec(substr($line1425));
$length $start $end;
echo "Start: ".$start."  End: ".$end."  Mode: ".$mode."\n";
$mem file_get_contents('/proc/'.$argv[1].'/mem'NULLNULL$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 :-/

WHK

#2
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($line121);

if((string)$separator !== '-')
continue;

$mode substr($line264);
/*
r = read
w = write
x = execute
s = shared
p = private (copy on write)
*/

$start substr($line012);
$end substr($line1312);
$length = (hexdec($end) - hexdec($start));
$mem file_get_contents('/proc/'.$argv[1].'/mem'NULLNULLhexdec($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($mem015))."\n";
//}
}


Ahora mi pregunta es:

Tengo una serie de bytes, si quiero buscar un valor entero (Int32) debo convertir los bytes a int32?

WHK

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.

scott_

Es algo raro este tema no? que un usuario se responda así solo  ;-), me ha asado no te preocupes  :xD

Saludos.
Si no intentas salvar una vida, jamás salvarás la de nadie más