Pitanje:
Obrnuti inženjering Solaris upravljačkog programa
cb88
2013-03-20 03:51:02 UTC
view on stackexchange narkive permalink

Imam nekoliko upravljačkih programa iz doba Solarisa 2.6, želio bih napraviti inverzni inženjering.

Imam rastavljač Sparc koji pruža neke informacije, ali se više ne održava, pa mislim da mi možda neće pružiti sve moguće informacije.

Pokretači su za Sbusov grafički akcelerator koji posjedujem. Naime, ZX aka Leo jedan od ranih 3d akceleratora.

Pa, na koje sve načine mogu obrnuto inženjerirati ovaj upravljački program? Mogu ga rastaviti, ali nisam siguran što učiniti s izlazom. Imam i Solaris, naravno, pa možda i tamo mogu nešto učiniti.

Konačni cilj je imati dovoljno informacija za dizajniranje upravljačkog programa za operativni sustav. Postoje upravljački programi za NetBSD, iako nepotpuni jer hardverska dokumentacija koja postoji (kojoj se ne može pristupiti) nema Window ID kodiranje jer nedostaje. Također, budući da hardver koristi Sbus sučelje na dvostruko širokoj međuspratnoj kartici, bilo bi nepraktično koristiti ga na bilo čemu osim na SparcStationu ili ranom UltraSparc stroju.

Vjerojatno biste trebali dodati koji je vaš konačni cilj. Želite li koristiti karticu u drugom stroju? Napraviti upravljački program za drugi OS na istom okviru? Samo znatiželja?
@Igor Skochinsky Dobar prijedlog Pokrenuo sam vas! I da samo zbog znatiželje i zabave .. Vintage SparcStation moj je hobi, mogli biste reći.
Ako imate upravljačke programe za NetBSD, preporučio bih da ih pogledate i pokušate pronaći podudaranja s onim što radi Solarisov upravljački program. To bi trebalo ubrzati postupak.
U stvari, međutim, kao što sam rekao ... NetBsd upravljački program za ZX je nepotpun i zasigurno ne pokriva mogućnosti opengl 1.1 koje uređaj ima, tako da ću gotovo definitivno morati dobiti kopiju IDA-e ili prijatelja pustiti skupština za mene. Također imam TGS opengl upravljački program za njega koji bi me zanimao, siguran sam, međutim, potrebna je flekslm licenca koju nažalost nemam.
Pronašao sam i neku vrstu [Linux upravljačkog programa] (https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/drivers/video/leo.c) koji bi mogao biti koristan .
Da, možda se na NetBSD upravljačkom programu barem neko vrijeme radi, pa bih ga zamišljao potpunijeg.
Jedan odgovor:
#1
+10
Igor Skochinsky
2013-03-20 05:03:38 UTC
view on stackexchange narkive permalink

Pa, budući da je riječ o upravljačkom programu Solarisa, prvo morate pronaći neke dokumente o tome kako upravljački programi Solarisa komuniciraju s jezgrom (ili kernelom s njima). Pokazalo se brzo pretraživanje ovo:

_init () inicijalizira modul koji se može učitati. Poziva se prije bilo koje druge rutine u modulu koji se može učitati. _init () vraća vrijednost koju je vratio mod_install (9F) . Modul po želji može obaviti neki drugi posao prije izvođenja poziva mod_install (9F) . Ako je modul izvršio neko postavljanje prije nego što je pozvana funkcija mod_install (9F) , tada treba biti spreman poništiti to postavljanje ako mod_install (9F) vrati pogrešku.

_info () vraća informacije o modulu koji se može učitati. _info () vraća vrijednost koju je vratio mod_info (9F) .

_fini () priprema modul koji se može učitati za istovar. Poziva se kada sustav želi istovariti modul. Ako modul utvrdi da se može istovariti, tada _fini () vraća vrijednost koju vraća mod_remove (9F) . Nakon uspješnog povratka iz _fini () neće se pozivati ​​nijedna druga rutina u modulu prije nego što se pozove _init () .

Postoji lijep uzorak koda u nastavku.

Ovaj se vodič također čini relevantnim.

Jednom kada pronađete ulazne točke, samo je pitanje praćenja poziva i pokazivača.

Evo kako to izgleda u IDA-i:

  .text: 00000000 _init:! DATA XREF: leo_attach + 5A8o.text: 00000000! leo_attach + 5BCo .... tekst: 00000000 spremi% sp, -0x60,% sp.text: 00000004 sethi% hi (leo_debug),% i2.text: 00000008 ld [leo_debug],% o0.text: 0000000C cmp% o0 , 4.tekst: 00000010 bl loc_38.text: 00000014 sethi% hi (leo_state),% o0
.text: 00000018 set aLeoCompiledSS,% o0! "leo: kompajlirano% s,% s \ n" .text: 00000020 postavljeno a141746,% o1! "14:17:46" .text: 00000028 sethi% hi (aLeo_c6_6Jun251),% l0! "leo.c 6.6 25. lipnja 1997. 14:17:46" .text: 0000002C poziv leo_printf.text: 00000030 postavljen aJun251997,% o2! "25. lipnja 1997" .text: 00000034 sethi% hi (leo_state),% o0.text: 00000038.text: 00000038 loc_38:! KOD XREF: _init + 10j.text: 00000038 set leo_state,% i1.text: 0000003C sethi% hi (0x1800),% l0.text: 00000040 mov% i1,% o0.text: 00000044 set 0x1980,% o1.text: 00000048 poziv ddi_soft_state_init.text: 0000004C mov 1,% o2.text: 00000050 orcc% g0,% o0,% i0.text: 00000054 bne, a loc_80.text: 00000058 ld [% i2 + (leo_debug & 0x3FF)],% .text: 0000005C sethi% hi (0x14C00),% l0.text: 00000060 call mod_install.text: 00000064 set modlinkage,% o0.text: 00000068 orcc% g0,% o0,% i0.text: 0000006C be, a loc_80. tekst: 00000070 ld [% i2 + (leo_debug & 0x3FF)],% o0.text: 00000074 poziv ddi_soft_state_fini.text: 00000078 mov% i1,% o0.text: 0000007C ld [% i2 + (leo_de bug & 0x3FF)],% o0.text: 00000080.text: 00000080 loc_80:! KOD XREF: _init + 54j.text: 00000080! _init + 6Cj.text: 00000080 cmp% o0, 4.text: 00000084 bl locret_9C.text: 00000088 nop.text: 0000008C set aLeo_initDoneRe,% o0! "leo: _init done, return (% d) \ n" .text: 00000094 call leo_printf
.text: 00000098 mov% i0,% o1.text: 0000009C.text: 0000009C locret_9C:! KOD XREF: _init + 84j.text: 0000009C ret.text: 000000A0 restore.text: 000000A0! Kraj funkcije _init  

Na 0x60 možete vidjeti kako se mod_install poziva pokazivačem na modlinkage , tako da možete tamo pratiti i vidjeti na što polja upućuju.

Ali to čak ne morate raditi cijelo vrijeme. U ovom su slučaju programeri vrlo promišljeno ostavili netaknute sve simbole i ispravili pogreške. Ovo bi vam trebalo pomoći u radu :)

Ovisno o situaciji, možete preskočiti izravno na korisno imenovane funkcije poput leo_blit_sync_start ili leo_init_ramdac . Ja osobno preferiram prvi način, odozgo prema dolje, ali svakom svom.

EDIT : jedna prilično jednostavna stvar koju možete učiniti je zakrpati leo_debug varijabla na početku odjeljka .data na 5 ili tako nešto. To bi trebalo proizvesti puno rezultata za otklanjanje pogrešaka o operacijama koje vozač izvodi.

Jasno je da IDA pro govori za sebe :) ... što je reklo da si zasad ne mogu priuštiti licencu. Pomalo je van teme, ali licenciranje arhitekture može biti zanimljivo ljudima poput mene.
@cb88: Pretpostavljam da bi to i dalje bilo skuplje nego što će vam se svidjeti. IDA je jedinstvena. Cijena je poštena, ali ne prema svima. Oni, međutim, imaju studentske dozvole. Ali mislim da vam treba netko tko će vas poznavati i jamčiti za vas (ako to još uvijek čini). U prošlosti je previše curenja prouzročilo financijsku štetu DataRescueu i kasnije Hex-Raysu.
0xC0000022L 75 dolara bilo bi 3x koliko naplaćuju po luku u cijelom softveru i ako biste ga kasnije mogli nadograditi na punu verziju po punoj cijeni - cijena jednog luka bila bi sasvim poštena, ali pretpostavljam da je previše tražiti. Ne sumnjam da vrijedi svaki peni, jednostavno mi ne treba bojni brod za moju vožnju brodom na veslu: D


Ova pitanja su automatski prevedena s engleskog jezika.Izvorni sadržaj dostupan je na stackexchange-u, što zahvaljujemo na cc by-sa 3.0 licenci pod kojom se distribuira.
Loading...