elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Sistemas Operativos
| |-+  GNU/Linux (Moderador: MinusFour)
| | |-+  Como buscar un Integer en la memoria de forma manual?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Como buscar un Integer en la memoria de forma manual?  (Leído 3,234 veces)
WHK
Moderador Global
***
Desconectado Desconectado

Mensajes: 6.589


Sin conocimiento no hay espíritu


Ver Perfil WWW
Como buscar un Integer en la memoria de forma manual?
« en: 26 Abril 2015, 00:17 am »

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?


En línea

WHK
Moderador Global
***
Desconectado Desconectado

Mensajes: 6.589


Sin conocimiento no hay espíritu


Ver Perfil WWW
Re: Como buscar un Integer en la memoria de forma manual?
« Respuesta #1 en: 26 Abril 2015, 01:41 am »

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
  1. <?php
  2. $map = '/proc/'.$argv[1].'/maps';
  3. echo "Leyendo ".$map." ...\n";
  4. $lines = file($map);
  5.  
  6. foreach($lines as $line){
  7. $line = trim($line);
  8.  
  9. $mode = substr($line, 26, 4);
  10. $start = hexdec(substr($line, 0, 12));
  11. $end = hexdec(substr($line, 14, 25));
  12. $length = $start - $end;
  13. echo "Start: ".$start."  End: ".$end."  Mode: ".$mode."\n";
  14. $mem = file_get_contents('/proc/'.$argv[1].'/mem', NULL, NULL, $start, $length);
  15. echo $length." ------------\n".$mem."\n------------\n";
  16. }

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:

Citar
7ffd9c73b000-7ffd9c73d000 r--p 00000000 00:00 0                          [vvar]

Código:
------------
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 :-/


En línea

WHK
Moderador Global
***
Desconectado Desconectado

Mensajes: 6.589


Sin conocimiento no hay espíritu


Ver Perfil WWW
Re: Como buscar un Integer en la memoria de forma manual?
« Respuesta #2 en: 26 Abril 2015, 01:47 am »

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
Código:
<?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?
« Última modificación: 26 Abril 2015, 16:29 pm por WHK » En línea

WHK
Moderador Global
***
Desconectado Desconectado

Mensajes: 6.589


Sin conocimiento no hay espíritu


Ver Perfil WWW
Re: Como buscar un Integer en la memoria de forma manual?
« Respuesta #3 en: 26 Abril 2015, 02:08 am »

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.
En línea

scott_


Desconectado Desconectado

Mensajes: 458


Mientras luches, ya eres un ganador


Ver Perfil
Re: Como buscar un Integer en la memoria de forma manual?
« Respuesta #4 en: 26 Abril 2015, 09:12 am »

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

Saludos.
En línea

Si no intentas salvar una vida, jamás salvarás la de nadie más
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
SQLite integer como float
Bases de Datos
Dukatus 0 2,175 Último mensaje 17 Marzo 2013, 01:20 am
por Dukatus
Poachable, o cómo buscar empleo de forma anónima
Noticias
wolfbcn 0 1,173 Último mensaje 9 Octubre 2014, 13:58 pm
por wolfbcn
Cómo encontrar y eliminar virus de forma manual
Noticias
wolfbcn 0 1,967 Último mensaje 28 Diciembre 2014, 14:13 pm
por wolfbcn
[RESUELTO] Como modificar el agente de usuario de forma manual en Firefox?
Dudas Generales
Killlztream 3 2,960 Último mensaje 9 Agosto 2015, 01:10 am
por Killlztream
Cómo descargar actualizaciones de Windows 10 de forma manual
Noticias
wolfbcn 0 1,653 Último mensaje 11 Enero 2018, 21:27 pm
por wolfbcn
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines