Escribir en /dev/mem

Iniciado por >FedeX<, 10 Febrero 2011, 04:25 AM

0 Miembros y 2 Visitantes están viendo este tema.

>FedeX<

Necesito parchear un trozo de codigo de la memoria del kernel de linux (android).

Por el momento estoy con esto: (corriendo como root)

Código (cpp) [Seleccionar]
int fp = syscall(SYS_open,"/dev/mem",O_RDWR|O_SYNC,0);
printf("ABIERTO\n");
syscall(SYS_lseek,fp,0x70000000,SEEK_SET);
syscall(SYS_lseek,fp,0x10000000,SEEK_CUR);
syscall(SYS_lseek,fp,inet_bind-0xC0000000+0x80C00000-0x80000000+0xB0,SEEK_CUR);
printf("POSICIONADO\n");
((unsigned int *)&path)[0] = 0xE3A00001;
((unsigned int *)&path)[1] = 0;
syscall(SYS_write,fp,path,8);
printf("PARCHEADO\n");


Esto me está generando algún kernel panic o algo, porque me reinicia el teléfono... Lo extraño es que, antes de reiniciar, la pantalla queda con "ABIERTO" y no en "POSICIONADO"... Sin embargo:

Código (cpp) [Seleccionar]
int fp = syscall(SYS_open,"/dev/mem",O_RDWR|O_SYNC,0);
printf("ABIERTO\n");
syscall(SYS_lseek,fp,0x70000000,SEEK_SET);
syscall(SYS_lseek,fp,0x10000000,SEEK_CUR);
syscall(SYS_lseek,fp,inet_bind-0xC0000000+0x80C00000-0x80000000+0xB0,SEEK_CUR);
printf("POSICIONADO\n");
syscall(SYS_read,fp,path,8);
printf("LEIDO 0x%08X 0x%08X\n",((unsigned int *)&path)[0],((unsigned int *)&path)[1]);


Devuelve correctamente los bytecodes que necesito parchear.. O sea, la posición de memoria es la correcta...

Con kmem, es exactamente igual...

Vi muchos ejemplos en google y son parecidos a este... Pero, por supuesto, ami no me funciona...

Quería consultar, si alguien conoce del asunto y que me pueda dar una mano...

Gracias y Salu2

Eternal Idol

¿Y el codigo de donde sale? ¿Estas seguro de que es correcto? Yo apostaria a que no lo es:


0100 add     dword ptr [eax],eax
a0e3000000 mov     al,byte ptr ds:[000000E3h]
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

>FedeX<

Perdón, no aclaré, es para ARM...

No sé mucho de la arquitectura, pero lo que tengo es:
(La parte que quiero modificar 0xb0 y 0xb4)
Código (asm) [Seleccionar]
inet_bind+0xb0: mov r0,#0xa ; push CAP_NET_BIND_SERVICE
inet_bind+0xb4: bl #0xffd325f8 ; call capable
inet_bind+0xb8: cmp r0,#0
inet_bind+0xbc: mvneq r5,#0xc
inet_bind+0xc0: beq #0x1d0


(Por esto)
Código (asm) [Seleccionar]
inet_bind+0xb0: mov r0,#1 ; capable, digamos que, devolvio true (?)
inet_bind+0xb4: andeq r0,r0,r0 ; NOP
inet_bind+0xb8: cmp r0,#0
inet_bind+0xbc: mvneq r5,#0xc
inet_bind+0xc0: beq #0x1d0


Igual, creo que no es el problema, porque si escribo lo que acabo de leer en esa dirección...:
Código (cpp) [Seleccionar]
int fp = syscall(SYS_open,"/dev/mem",O_RDWR|O_SYNC,0);
printf("ABIERTO\n");

syscall(SYS_lseek,fp,0x70000000,SEEK_SET);
syscall(SYS_lseek,fp,0x10000000,SEEK_CUR);
syscall(SYS_lseek,fp,inet_bind-0xC0000000+0x80C00000-0x80000000+0xB0,SEEK_CUR);
printf("POSICIONADO\n");
syscall(SYS_read,fp,path,8);

syscall(SYS_lseek,fp,0x70000000,SEEK_SET);
syscall(SYS_lseek,fp,0x10000000,SEEK_CUR);
syscall(SYS_lseek,fp,inet_bind-0xC0000000+0x80C00000-0x80000000+0xB0,SEEK_CUR);
printf("POSICIONADO\n");
syscall(SYS_write,fp,path,8);


... aún así, reinicia...

Gracias y salu2

Eternal Idol

#3
Asi puede ser que sea valido  ;D Depura tu programa para asegurarte de que este pasando los parametros correctos y fundamentalmente que esa direccion donde lees/escribis corresponde a inet_bind+0xb0 como queres, con el valor de retorno de la llamada al sistema lseek podes verlo, y de ser posible la ejecucion del SYS_write para ver que hace exactamente.

Me la impresion que esto seria mas corto y equivalente:

syscall(SYS_lseek, fp, inet_bind - 0xC0000000 + 0x80C00000 + 0xB0, SEEK_SET);

¿inet_bind es un offset basado en una direccion diferente de la base del Kernel (que asumo es 0x80?00000)? Hay varias direcciones hardcodeadas  :silbar:
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

>FedeX<

Lo del lseek era porque si uso la direccion 0x80000000 o una mayor, es como si pusiera un numero negativo... Con _llseek lo arreglé

Y no sé como haré para depurar aquí pero...

Para limpiar un poco:
Código (cpp) [Seleccionar]
#define PAGE_OFFSET (0xC0000000UL)
#define PHYS_OFFSET (0x80C00000UL)

int main(int argc,char ** argv){
inet_bind = GetVirtualAddr("inet_bind");
printf("GetVirtualAddr(%08X)\n",inet_bind);
if(inet_bind == 0){
printf(":(\n");
return 0;
}
int ret,fp;
fp = syscall(SYS_open,"/dev/mem",O_RDWR,0);
printf("SYS__open (%08X)\n",fp);
if(fp == -1){
printf(":(\n");
return 0;
}
ret = syscall(SYS__llseek,fp,0, inet_bind+0xB0 -PAGE_OFFSET+PHYS_OFFSET ,&path,SEEK_SET); // -1 si falla
printf("SYS__llseek (%d): 0x%08X%08X\n",ret,((unsigned int *)&path)[1],((unsigned int *)&path)[0]);
ret = syscall(SYS_read,fp,path,8);
printf("SYS_read (%d): %08X %08X\n",ret,((unsigned int *)&path)[0],((unsigned int *)&path)[1]);
syscall(SYS_close,fp);
return 0;
}

Resultado:
GetVirtualAddr(C0342418)
SYS__open (0000000A)
SYS__llseek (0): 0x0000000080F424C8
SYS_read (8): E3A0000A EBF4C94F


E3A0000A EBF4C94F son los bytecodes correctos...

Ahora para escribir:
Código (cpp) [Seleccionar]
#define PAGE_OFFSET (0xC0000000UL)
#define PHYS_OFFSET (0x80C00000UL)

int main(int argc,char ** argv){
inet_bind = GetVirtualAddr("inet_bind");
printf("GetVirtualAddr(%08X)\n",inet_bind);
if(inet_bind == 0){
printf(":(\n");
return 0;
}
int ret,fp;
fp = syscall(SYS_open,"/dev/mem",O_RDWR,0);
printf("SYS__open (%08X)\n",fp);
if(fp == -1){
printf(":(\n");
return 0;
}
ret = syscall(SYS__llseek,fp,0, inet_bind+0xB0 -PAGE_OFFSET+PHYS_OFFSET ,&path,SEEK_SET); // -1 si falla
printf("SYS__llseek (%d): 0x%08X%08X\n",ret,((unsigned int *)&path)[1],((unsigned int *)&path)[0]);
((unsigned int *)&path)[0] = 5; // 5 segundos
((unsigned int *)&path)[1] = 0;
((unsigned int *)&path)[2] = 0;
ret = syscall(SYS_nanosleep,path,0); // Para poder ver los resultados anteriores...
((unsigned int *)&path)[0] = 0xE3A0000A;
((unsigned int *)&path)[1] = 0xEBF4C94F;
ret = syscall(SYS_write,fp,path,8);
printf("SYS_write (%d): %08X %08X\n",ret,((unsigned int *)&path)[0],((unsigned int *)&path)[1]);
syscall(SYS_close,fp);
return 0;
}


Resultado:
GetVirtualAddr(C0342418)
SYS__open (0000000A)
SYS__llseek (0): 0x0000000080F424C8

6 segundos y reinicia :P

Es por algún tipo de protección??? y porqué reinicia? por mas que sea root, sigue siendo un proceso en user-mode... Error de hardware?? Hay algún log que pueda mirar??

Gracias y Salu2

Eternal Idol

Podria ser una proteccion, vaya uno a saber ... ¿No genera un Kernel panic? ¿Simplemente reinicia? ¿Podes depurar el Kernel?
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

>FedeX<

Lo encontre apanic_console :D
<1>[54537.815216] Unable to handle kernel paging request at virtual address c03424c8
<1>[54537.815307] pgd = c8fd0000
<1>[54537.815338] [c03424c8] *pgd=80e0840e(bad)
<4>[54537.815399] Internal error: Oops: 80d [#1] PREEMPT
<4>[54537.815429] Modules linked in: tiwlan_drv sec modem_pm_driver netmux_linkdriver netmux [last unloaded: tiwlan_drv]
<4>[54537.815551] CPU: 0    Not tainted  (2.6.29-omap1 #1)
<4>[54537.815612] PC is at __copy_from_user+0xd0/0x3b4
<4>[54537.815673] LR is at 0xebf4c94f
<4>[54537.815704] pc : [<c015a1bc>]    lr : [<ebf4c94f>]    psr: 00000053
<4>[54537.815734] sp : c8d5feec  ip : 00000018  fp : c8d5ff44
<4>[54537.815765] r10: c8d5e000  r9 : c03424c8  r8 : e3a0000a
<4>[54537.815795] r7 : 000110bc  r6 : 80f424c8  r5 : 00000000  r4 : 00000008
<4>[54537.815856] r3 : 00000000  r2 : ffffffe8  r1 : 000110c4  r0 : c03424c8
<4>[54537.815887] Flags: nzcv  IRQs on  FIQs off  Mode SVC_32  ISA ARM  Segment user
<4>[54537.815948] Control: 10c5387d  Table: 89bd0019  DAC: 00000015
<4>[54537.815979]
<4>[54537.815979] PC: 0xc015a13c:
<4>[54537.816009] a13c  e4b14004 e4b15004 e4b16004 e4b17004 e4b18004 e4b1c004 e4b1e004 e2522020
<4>[54537.816131] a15c  e8a051f8 aafffff3 e3720060 aafffff2 e212c01c e26cc020 108ff00c ea000011
<4>[54537.816223] a17c  e320f000 e4b13004 e4b14004 e4b15004 e4b16004 e4b17004 e4b18004 e4b1e004
<4>[54537.816345] a19c  e08ff00c e320f000 e320f000 e4803004 e4804004 e4805004 e4806004 e4807004
<4>[54537.816467] a1bc  e4808004 e480e004 e8bd01e0 e1b02f82 14f13001 24f14001 24f1c001 14c03001
<4>[54537.816589] a1dc  24c04001 24c0c001 e28dd008 e8bd8011 e26cc004 e35c0002 c4f13001 a4f14001
<4>[54537.816680] a1fc  e4f1e001 c4c03001 a4c04001 e052200c e4c0e001 baffffec e211c003 0affffbc
<4>[54537.816802] a21c  e3c11003 e35c0002 e4b1e004 0a000032 ca000063 e252201c ba000025 e92d03e0
<4>[54537.816925]
<4>[54537.816925] LR: 0xebf4c8cf:
<4>[54537.816955] c8cc  ******** ******** ******** ******** ******** ******** ******** ********
<4>[54537.817108] c8ec  ******** ******** ******** ******** ******** ******** ******** ********
<4>[54537.817230] c90c  ******** ******** ******** ******** ******** ******** ******** ********
<4>[54537.817352] c92c  ******** ******** ******** ******** ******** ******** ******** ********
<4>[54537.817474] c94c  ******** ******** ******** ******** ******** ******** ******** ********
<4>[54537.817596] c96c  ******** ******** ******** ******** ******** ******** ******** ********
<4>[54537.817749] c98c  ******** ******** ******** ******** ******** ******** ******** ********
<4>[54537.817871] c9ac  ******** ******** ******** ******** ******** ******** ******** ********
<4>[54537.817993] c9cc  ******** ******** ******** ******** ******** ******** ******** ********
<4>[54537.818115]
<4>[54537.818115] SP: 0xc8d5fe6c:
<4>[54537.818145] fe6c  00000000 0000c350 c5956274 e90c7331 00003198 ffffffff c8d5fed4 80f424c8
<4>[54537.818267] fe8c  000110bc c8d5ff44 c8d5fea0 c003e9ac c003e200 c03424c8 000110c4 ffffffe8
<4>[54537.818389] feac  00000000 00000008 00000000 80f424c8 000110bc e3a0000a c03424c8 c8d5e000
<4>[54537.818481] fecc  c8d5ff44 00000018 c8d5feec ebf4c94f c015a1bc 00000053 ffffffff c8d5ff84
<4>[54537.818603] feec  00000000 80f424c8 000110bc 00000000 c03424c8 00000008 00000000 00000008
<4>[54537.818725] ff0c  c0192c90 0000c350 c8d5ff70 c0573a30 00000008 c8ecbc40 000110bc c8d5ff70
<4>[54537.818817] ff2c  00000008 c8d5e000 00000000 c8d5ff6c c8d5ff48 c00c9ef8 c0192c0c c8d5ff44
<4>[54537.818939] ff4c  00000000 c8ecbc40 000110bc 80f424c8 00000000 c8d5ffa4 c8d5ff70 c00ca04c
<4>[54537.819061]
<4>[54537.819061] FP: 0xc8d5fec4:
<4>[54537.819091] fec4  c03424c8 c8d5e000 c8d5ff44 00000018 c8d5feec ebf4c94f c015a1bc 00000053
<4>[54537.819183] fee4  ffffffff c8d5ff84 00000000 80f424c8 000110bc 00000000 c03424c8 00000008
<4>[54537.819305] ff04  00000000 00000008 c0192c90 0000c350 c8d5ff70 c0573a30 00000008 c8ecbc40
<4>[54537.819427] ff24  000110bc c8d5ff70 00000008 c8d5e000 00000000 c8d5ff6c c8d5ff48 c00c9ef8
<4>[54537.819519] ff44  c0192c0c c8d5ff44 00000000 c8ecbc40 000110bc 80f424c8 00000000 c8d5ffa4
<4>[54537.819641] ff64  c8d5ff70 c00ca04c c00c9e4c 80f424c8 00000000 c8d5ffa4 00000000 c008605c
<4>[54537.819732] ff84  00000000 000118c0 00000001 00000004 c003f004 00000000 c8d5ffa8 c003ee80
<4>[54537.819854] ffa4  c00ca014 00000000 000118c0 0000000a 000110bc 00000008 000110bc 00000000
<4>[54537.819976]
<4>[54537.819976] R0: 0xc0342448:
<4>[54537.820007] 2448  ea000066 e352000f 93e05015 9a000063 e59f0190 e5951004 eb001566 e59f3188
<4>[54537.820129] 2468  e593305c e3530000 e1a06000 1a00000a e5d4315b e3130024 1a000007 e5953004
<4>[54537.820220] 2488  e3500002 13530000 0a000003 e3500003 13500005 13e05062 1a000050 e1d530b2
<4>[54537.820343] 24a8  e1a07423 e1877403 e30033fe e6ff7077 e2472001 e6ff2072 e1520003 8a000004
<4>[54537.820465] 24c8  e3a0000a ebf4c94f e3500000 03e0500c 0a000042 e1a00004 e3a01000 ebfe37dc
<4>[54537.820556] 24e8  e5d43002 e3530007 1a000039 e3003146 e19430b3 e3530000 1a000035 e5952004
<4>[54537.820678] 2508  e3560005 13560003 e1a00004 e1a01007 e5842148 e5842140 05843148 e5943020
<4>[54537.820800] 2528  e1a0e00f e593f044 e3500000 13a03000 13e05061 15843148 15843140 1a000025
<4>[54537.820922]
<4>[54537.820922] R8: 0xe39fff8a:
<4>[54537.820953] ff88  ******** ******** ******** ******** ******** ******** ******** ********
<4>[54537.821075] ffa8  ******** ******** ******** ******** ******** ******** ******** ********
<4>[54537.821197] ffc8  ******** ******** ******** ******** ******** ******** ******** ********
<4>[54537.821319] ffe8  ******** ******** ******** ******** ******** ******** dddcbe3c dddcbe3c
<4>[54537.821441] 0008  00000001 00000000 00000000 000d1237 00000000 d8dd8740 00000098 00000000
<4>[54537.821563] 0028  0000001e 006e0061 00720064 0069006f 002e0064 00700061 002e0070 00410049
<4>[54537.821685] 0048  00700070 0069006c 00610063 00690074 006e006f 00680054 00650072 00640061
<4>[54537.821777] 0068  00000000 3f800000 000002d2 00000007 00000001 00000002 00730065 00000000
<4>[54537.821899] 0088  00000002 00530055 00000000 00000000 00000000 00000000 00000003 00000002
<4>[54537.822021]
<4>[54537.822021] R9: 0xc0342448:
<4>[54537.822052] 2448  ea000066 e352000f 93e05015 9a000063 e59f0190 e5951004 eb001566 e59f3188
<4>[54537.822143] 2468  e593305c e3530000 e1a06000 1a00000a e5d4315b e3130024 1a000007 e5953004
<4>[54537.822265] 2488  e3500002 13530000 0a000003 e3500003 13500005 13e05062 1a000050 e1d530b2
<4>[54537.822387] 24a8  e1a07423 e1877403 e30033fe e6ff7077 e2472001 e6ff2072 e1520003 8a000004
<4>[54537.822509] 24c8  e3a0000a ebf4c94f e3500000 03e0500c 0a000042 e1a00004 e3a01000 ebfe37dc
<4>[54537.822601] 24e8  e5d43002 e3530007 1a000039 e3003146 e19430b3 e3530000 1a000035 e5952004
<4>[54537.822723] 2508  e3560005 13560003 e1a00004 e1a01007 e5842148 e5842140 05843148 e5943020
<4>[54537.822845] 2528  e1a0e00f e593f044 e3500000 13a03000 13e05061 15843148 15843140 1a000025
<4>[54537.822967]
<4>[54537.822967] R10: 0xc8d5df80:
<4>[54537.822998] df80  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
<4>[54537.823089] dfa0  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
<4>[54537.823211] dfc0  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
<4>[54537.823303] dfe0  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
<4>[54537.823425] e000  00000000 00000002 00000000 c5956000 c04e4e7c 00000000 00000017 c5956000
<4>[54537.823516] e020  c0530dc0 c8d5e000 00000420 c5956274 c8d29e00 cbe6ec00 c8d5feac c8d5fe68
<4>[54537.823638] e040  c03d0298 00000000 00000000 00000000 00000000 00000000 01000000 00000000
<4>[54537.823730] e060  afe44b1c 00000000 00000000 00000000 00000000 00000000 00000000 00000000
<4>[54537.823852] Process pa (pid: 2976, stack limit = 0xc8d5e2e0)
<4>[54537.823913] Stack: (0xc8d5feec to 0xc8d60000)
<4>[54537.823913] fee0:                            00000000 80f424c8 000110bc 00000000 c03424c8
<4>[54537.824035] ff00: 00000008 00000000 00000008 c0192c90 0000c350 c8d5ff70 c0573a30 00000008
<4>[54537.824127] ff20: c8ecbc40 000110bc c8d5ff70 00000008 c8d5e000 00000000 c8d5ff6c c8d5ff48
<4>[54537.824249] ff40: c00c9ef8 c0192c0c c8d5ff44 00000000 c8ecbc40 000110bc 80f424c8 00000000
<4>[54537.824340] ff60: c8d5ffa4 c8d5ff70 c00ca04c c00c9e4c 80f424c8 00000000 c8d5ffa4 00000000
<4>[54537.824432] ff80: c008605c 00000000 000118c0 00000001 00000004 c003f004 00000000 c8d5ffa8
<4>[54537.824554] ffa0: c003ee80 c00ca014 00000000 000118c0 0000000a 000110bc 00000008 000110bc
<4>[54537.824645] ffc0: 00000000 000118c0 00000001 00000004 00000000 00000000 00000000 bebbad04
<4>[54537.824768] ffe0: bebbace8 bebbacd8 000086d8 afe0e1f0 60000050 0000000a 00000000 00000000
<4>[54537.824859] Backtrace:
<4>[54537.824890] [<c0192c00>] (write_mem+0x0/0x12c) from [<c00c9ef8>] (vfs_write+0xb8/0x148)
<4>[54537.825012] [<c00c9e40>] (vfs_write+0x0/0x148) from [<c00ca04c>] (sys_write+0x44/0x70)
<4>[54537.825103]  r7:00000000 r6:80f424c8 r5:000110bc r4:c8ecbc40
<4>[54537.825164] [<c00ca008>] (sys_write+0x0/0x70) from [<c003ee80>] (ret_fast_syscall+0x0/0x2c)
<4>[54537.825286]  r8:c003f004 r7:00000004 r6:00000001 r5:000118c0 r4:00000000
<4>[54537.825347] Code: e4804004 e4805004 e4806004 e4807004 (e4808004)
<0>[54537.825683] Kernel panic - not syncing: Fatal exception
<0>[54537.826629] Timestamp = 1297360517.973
<0>[54537.826629] Current Time = 02-10 17:55:17.973, Uptime = 9992.264 seconds


Creo que es por la protección de la memoria virtual :(... No se como desactivarla!!!

Voy a seguir investigando....