Potrebno objasnjenje

Potrebno objasnjenje

offline
  • Pridružio: 15 Jul 2009
  • Poruke: 150

Pozdrav svima, radim nesto u linux kernelu tj pokusavam da definisem par funkcija kako nebi morao da "portujem" komplet "kod" iz kernela u neki "userspace" program, znaci hocu jednostavno da te funkcije/intervale citam/pozivam iz memorije... slucaj je sledeci:

- par funkcija u kernel modulu sam napravio ovako:
int a, b, c, d, e; int recovery_leave(void) {    if (a) return a;    else return 0; } EXPORT_SYMBOL(recovery_leave); int recovery_x(void) {    if (b) return b;    else return 0; } EXPORT_SYMBOL(recovery_x); int recovery_y(void) {    if (c) return c;    else return 0; } EXPORT_SYMBOL(recovery_y); int recovery_w(void) {    if (d) return d;    else return 0; } EXPORT_SYMBOL(recovery_w); int recovery_z(void) {    if (e) return e;    else return 0; } EXPORT_SYMBOL(recovery_z);
Intervali a,b,c,d,e bi trebali da su promenjivi posto sam ih u kernel modulu postavio na mestima gde odredjena funkcija cita vrednosti... otprilike ovako: a=neki_nesto[i][0]; c=0; ...itd. E sad "kallsyms" i adrese do funkcija kada "objdump" vmlinux izgledaju ovako:
c02c7c88 <recovery_leave>: c02c7c88:       e1a0c00d        mov     ip, sp c02c7c8c:       e92dd800        push    {fp, ip, lr, pc} c02c7c90:       e24cb004        sub     fp, ip, #4      ; 0x4 c02c7c94:       e59f3004        ldr     r3, [pc, #4]    ; c02c7ca0 <recovery_leave+0x18> c02c7c98:       e5930000        ldr     r0, [r3] c02c7c9c:       e89da800        ldm     sp, {fp, sp, pc} c02c7ca0:       c074878c        .word   0xc074878c c02c7ca4 <recovery_x>: c02c7ca4:       e1a0c00d        mov     ip, sp c02c7ca8:       e92dd800        push    {fp, ip, lr, pc} c02c7cac:       e24cb004        sub     fp, ip, #4      ; 0x4 c02c7cb0:       e59f3004        ldr     r3, [pc, #4]    ; c02c7cbc <recovery_x+0x18> c02c7cb4:       e5930004        ldr     r0, [r3, #4] c02c7cb8:       e89da800        ldm     sp, {fp, sp, pc} c02c7cbc:       c074878c        .word   0xc074878c c02c7cc0 <recovery_y>: c02c7cc0:       e1a0c00d        mov     ip, sp c02c7cc4:       e92dd800        push    {fp, ip, lr, pc} c02c7cc8:       e24cb004        sub     fp, ip, #4      ; 0x4 c02c7ccc:       e59f3004        ldr     r3, [pc, #4]    ; c02c7cd8 <recovery_y+0x18> c02c7cd0:       e5930008        ldr     r0, [r3, #8] c02c7cd4:       e89da800        ldm     sp, {fp, sp, pc} c02c7cd8:       c074878c        .word   0xc074878c c02c7cdc <recovery_w>: c02c7cdc:       e1a0c00d        mov     ip, sp c02c7ce0:       e92dd800        push    {fp, ip, lr, pc} c02c7ce4:       e24cb004        sub     fp, ip, #4      ; 0x4 c02c7ce8:       e59f3004        ldr     r3, [pc, #4]    ; c02c7cf4 <recovery_w+0x18> c02c7cec:       e593000c        ldr     r0, [r3, #12] c02c7cf0:       e89da800        ldm     sp, {fp, sp, pc} c02c7cf4:       c074878c        .word   0xc074878c c02c7cf8 <recovery_z>: c02c7cf8:       e1a0c00d        mov     ip, sp c02c7cfc:       e92dd800        push    {fp, ip, lr, pc} c02c7d00:       e24cb004        sub     fp, ip, #4      ; 0x4 c02c7d04:       e59f3004        ldr     r3, [pc, #4]    ; c02c7d10 <recovery_z+0x18> c02c7d08:       e5930010        ldr     r0, [r3, #16] c02c7d0c:       e89da800        ldm     sp, {fp, sp, pc} c02c7d10:       c074878c        .word   0xc074878c

Ono sto ja hocu a nikad nisam radio (ovo mi je prvi put) je da citam interval recovery_z "iz userspace programa" tako sto bi pozvao kernel funkciju koja bi trebala da je u memoriji na adresi 0xc02c7cf8 otprilike ovako:
int (*recovery_z)(void) = (void*) 0xc02c7cf8;
a novi interval "int nn_z = recovery_z();"
medjutim nesto nije u redu, verovatno se to tako ne radi Smile... svaka pomoc dobro dosla!



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Pridružio: 19 Maj 2011
  • Poruke: 297

Pozdrav Savan2,

Nije mi bas jasno sta pokusavas da radis a assembly ne poznajem.

Sintaksa za onaj zadnji kod koji si postavio treba da bude ovako:

// ovo uglavis negde na vrh typedef int (*pFunkcija) (void); ... ... // dodelis tvoju adresu pFunkcija recovery_z = (pFunkcija) 0xc02c7cf8; ... ... // i posle kad hoces da je pozoves recovery_z();

E sad nemam blage veze da li je ta adresa uvek fiksna i da li ce ovo uopste da radi kako treba. Question

Javi sta si uradio. Smile



offline
  • Pridružio: 15 Jul 2009
  • Poruke: 150

Napisano: 16 Avg 2012 15:32

Poz, prvo hvala ti puno na svakoj pomoci do sada sto si mi pruzio, svaka cast! Kernel funkcija je uvek na toj adresi "staticka", tj kada disasemblujem uncompressed kernel (vmlinux) vidim gde se "raspakiva" u memoriji, i proverio sam u telefonu (cat /proc/kallsyms | grep recovery_z) dali je na toj adresi, jeste! Igram se sa telefonom i pokusavam da naucim kako da iskoristim nesto sto je "u memoriji" (da haknem Smile) kako bih dobio "nesto", samo mi nije jasno kako se to radi i dali je uopste moguce (uglavnom adrese nebi trebale da su promenjive jer su "dodeljene" da budu tu)... pokusao sam ovako:
int (*recovery_z)(void) = (void*) 0xc02c7cf8; printk("%d\n", (int)recovery_z());
medjutim nista se ne desava (dobijam stalno neki negativan broj, uvek isti), pomislio sam da nesto nije ok u kernel modulu medjutim kada sam dodao printk u kernel modulu da vidim dali je ok potvrdio sam da je int ok), ali iz nekog userspace programa stalno negativan broj, deluje mi kao da cita memoriju na toj adresi umesto sto poziva funkciju! Pokusacu ovako kako si ti napisao pa javim !

Dopuna: 16 Avg 2012 16:19

Upravo sam testirao ono sto si napisao kako treba i dobijam "segmentation fault", Sad adrese sam dodelio posle ovoga:
~ # cat /proc/kallsyms | grep recovery cat /proc/kallsyms | grep recovery c017ed8c t ext4_mark_recovery_complete c019d76c T jbd2_journal_skip_recovery c02c2b04 T recovery_leave c02c2b20 T recovery_x c02c2b3c T recovery_y c02c2b58 T recovery_w c02c2b74 T recovery_z c031cd40 t mmc_blk_cmd_recovery c03a330c t tcp_try_undo_recovery c04e0f34 t _V76LogicalChannelParameters_mode_eRM_recovery c05e1d50 r __ksymtab_recovery_leave c05e1d58 r __ksymtab_recovery_w c05e1d60 r __ksymtab_recovery_x c05e1d68 r __ksymtab_recovery_y c05e1d70 r __ksymtab_recovery_z c05f54da r __kstrtab_recovery_z c05f54e5 r __kstrtab_recovery_w c05f54f0 r __kstrtab_recovery_y c05f54fb r __kstrtab_recovery_x c05f5506 r __kstrtab_recovery_leave ~ #
nisam rebootovao telefon bas da vidim dali ce pozvati funkciju koja bi trebala da je na toj adresi trenutno, medjutim problem, nemam ideju...

Dopuna: 16 Avg 2012 16:51

Pokusao sam ovako:
typedef int (*nesto) (void); nesto recovery_x = (nesto) 0xc02c2b20; int new = recovery_x();
Ne mogu da kompilujem program jer dobijam gresku: error: initializer element is not constant... tu nesto fali jer onako imam seg fault ?

Dopuna: 16 Avg 2012 17:46

Mislim da sam nasao odgovor Sad linuxquestions.org/questions/programmin.....ng-787187/

Seg fault je zato sto pokusavam da pristupim memoriji koja nije dostupna iz user space ? Izgleda nije to tako bas jednostavno kao sto sam mislio jer na ovaj nacin bi se moglo na lak nacin hakovati npr telefon koji ima npr zastitu s-on... ustvari i pokusavam da svatim kako da pozovem neku funkciju na ovaj nacin, a to bi mi bila velika pomoc za dalji rad jer bih onda pokusao da probijem neku zastitu u samom telefonu tako sto bi bootloader "by self" pozvao funkciju za skidanje zastite i dozvolio mi da uradim nesto posle svega Sad U svakom slucaju pokusacu preko modul to kernel da uradim ovo sto sam pokusao iz user space bas da vidim dali je problem u tome ili je problem u definiciji za int koji smo pokusali da napravimo.

Dopuna: 16 Avg 2012 18:20

Upravo to! Segfault je nepostojeca adresa! Preko kernel modula sam uspeo da pozovem funkciju sa date adrese i dobio rezultat:
<4>[ 516.188690] recovery_x=500

E sad ne znam dali bi bilo moguce sa mmap ili neki iomap...itd da alociram kernel memoriju i da joj pristupim nekako? Hvala puno u svakom slucaju!

Ko je trenutno na forumu
 

Ukupno su 1286 korisnika na forumu :: 36 registrovanih, 8 sakrivenih i 1242 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: 357magnum, A.R.Chafee.Jr., Bickoooo, bojank, Boris90, CrazyDiablo, draganl, dragoljub11987, Duh sa sekirom, Georgius, GORDI, goxin, ivan1973, kobaja77, Krusarac, Kubovac, kubura91, M1los, Marko Marković, Mendonca, mikrimaus, mile33, milenko crazy north, Milos ZA, milos.cbr, miodrag, MiroslavD, nemkea71, nenooo, redstar72, ruma, Stija zmija, styg, tmanda323, vathra, Vlad000