[so2] [Tema 1][Windows] KeAddSystemServiceTable

Razvan Deaconescu razvan.deaconescu at cs.pub.ro
Sun Mar 11 08:12:39 EET 2012


Cristian Chilipirea <cristian.chilipirea at cti.pub.ro> writes:
> 2012/3/11 Buruiana Filip <filipb2001 at yahoo.com>
>> Am incercat sa adaug o noua tabela folosind KeAddSystemServiceTable si am
>> descantat parametrii in o mie de feluri, functia imi intoarce FALSE. Din ce
>> am vazut in codul functiei, se verifica ca ambii pointeri (st-ul / Base-ul
>> pentru KeServiceDescriptorTable si KeServiceDescriptorTableShadow) sa fie
>> NULL pentru un Index, pentru a putea adauga pe Indexul respectiv.
>
> Vrei sa faci ambii st == NULL de mana dupa ce ii salvezi

Vina este a noastră. NU trebuie să apelați KeAddSystemServiceTable
pentru că nu aveți unde să adăugați o nouă tabelă. Am actualizat
fișierul sci_win.h din arhiva temei[1].

Trebuie să lucrezi peste tabelele vechi. Asta înseamnă să salevezi
pointerii din cadrul structurilor de tip tabelă și să aloci unii noi. De
asemenea, la "unload" trebuie să refaci pointerii.

>> Am verificat si KeServiceDescriptorTableShadow[0].st si
>> KeServiceDescriptorTableShadow[1].st sunt ambii diferiti de NULL. In plus,
>> la link-ul [1] spune ca sunt 4 SSDT (la noi sunt numite std), dar eu in
>> sci_win.h vad ca se declara doar 2. Daca modific eu in 4 cele doua valori,
>> atunci doar pentru indexul 1 apar ambele NULL, desi in link spune ca al
>> 4-lea (adica indexul 3) este liber. Sunt confuz.
>>
>
> Noi nu rescriem 1 liber in enuntz zice clar sa folosim indexul 0

De la Windows XP sunt doar 2 tabele de apeluri de sistem:
KeServiceDescriptorTable și KeServiceDescriptorTableShadow (vezi
header-ul sci_win.h); până la Windows 2000 inclusiv erau 4. Trebuie să
le actualizezi pe ambele.

>> Aveti vreo sugestie? Macar unde as putea sa ma uit.
>>
>> Deci in final se doreste sa facem o noua tabela pe indexul 1? Este
>> suficient daca tabela are o singura intrare cu functia my_syscall?
>
> pe indexul 0 nu 1, nu nu e suficient sa aiba my_syscall trebuie sa aiba tot
> ce avea cea veche + my_syscall

Trebuie să aloci un array st și un array spt nou de deimensiunea
MY_SYSCALL_NO + 1(stocat în ls). Pe ultima poziție vei stoca
informațiile aferente apelului de system my_syscall. Nu e nevoie să
modificați ct. Trebuie să faci asta și pentru KeServiceDescriptorTable
și pentru KeServiceDescriptorTableShadow.

[1] http://elf.cs.pub.ro/so2/res/teme/tema1-checker-win.zip

Răzvan


More information about the so2 mailing list