Kako podesiti pametne telefone i računare. Informativni portal
  • Dom
  • Recenzije
  • Promijenite vid pid iz windowsa. Pokušajte #2 dodatna PID polja

Promijenite vid pid iz windowsa. Pokušajte #2 dodatna PID polja



U ovom članku pokušaćemo da kreiramo modul kernela koji će već moći da promeni PID pokrenuti proces u Linux OS-u, kao i eksperimentirati s procesima koji su primili promijenjeni PID.


Upozorenje: promjena PID-a je nestandardan proces i pod određenim okolnostima može dovesti do panike kernela.

Naš test modul će implementirati /dev/test karakterni uređaj, čitanje sa kojeg će promijeniti PID procesa. Hvala ovom članku za primjer implementacije karakternog uređaja. Pun kod modul je dat na kraju članka. Naravno, najviše ispravna odluka bio je dodati sistemski poziv samom kernelu, međutim to bi zahtijevalo ponovno kompajliranje kernela.

Životna sredina

Sve aktivnosti testiranja modula izvedene su virtuelno virtualbox mašina sa 64-bitnom distribucijom LInuxa i verzijom kernela 4.14.4-1. Komunikacija sa mašinom je obavljena pomoću SSH.

Pokušaj #1 jednostavno rješenje

Nekoliko riječi o struji: trenutna varijabla ukazuje na strukturu task_struct sa opisom procesa u kernelu (PID, UID, GID, cmdline, imenski prostori, itd.)

Prva ideja je bila jednostavno promijeniti parametar current->pid iz modula kernela u željeni.

Statički ssize_t device_read(struct file *filp, char *buffer, size_t dužina, loff_t * offset) ( printk("PID: %d.\n",current->pid); current->pid = 1; printk("new PID: %d.\n",trenutni->pid); , )
Da testiram funkcionalnost modula, napisao sam program na C ++:

#include #include #include int main() ( std::cout<< "My parent PID " << getppid() << std::endl; std::cout << "My PID " << getpid() << std::endl; std::fstream f("/dev/test",std::ios_base::in); if(!f) { std::cout << "f error"; return -1; } std::string str; f >>str; std::out<< "My new PID " << getpid() << std::endl; execl("/bin/bash","/bin/bash",NULL); }
Učitajte modul naredbom insmod, kreirajte /dev/test i pokušajte.

# ./a.out Moj roditelj PID 293 Moj PID 782 Moj novi PID 782
PID se nije promijenio. Možda ovo nije jedino mjesto gdje je specificiran PID.

Pokušajte #2 dodatna PID polja

Ako current->pid nije ID procesa, šta je onda? Brzi pogled na getpid() kod ukazao je na strukturu task_struct koja opisuje Linux proces i datoteku pid.c u izvornom kodu kernela. Potrebna funkcija je __task_pid_nr_ns. U kodu funkcije postoji poziv task-> pids.pid, ovaj parametar ćemo promijeniti

Sastavljanje i pokušaj

Pošto sam testirao preko SSH-a, uspeo sam da dobijem izlaz programa pre nego što se kernel sruši:

Moj roditelj PID 293 Moj PID 1689 Moj novi PID 1689
Prvi rezultat, već nešto. Ali PID se još uvijek nije promijenio.

Pokušaj #3 nisu izvezeni simboli kernela

Pažljiviji pogled na pid.c dao je funkciju koja radi ono što nam treba.
static void __change_pid(struct task_struct *task, enum tip pid_type,
struct pid *novo)
Funkcija prihvaća zadatak za koji je potrebno promijeniti PID, tip PID-a i, zapravo, novi PID. Kreiranjem novog PID-a upravlja funkcija
struct pid *alloc_pid(struct pid_namespace *ns)

Ova funkcija prihvaća samo prostor imena u kojem će biti novi PID, ovaj prostor se može dobiti pomoću task_active_pid_ns.
Ali postoji jedan problem: kernel ne izvozi ove simbole kernela i ne mogu se koristiti u modulima. Wonderful mi je pomogao u rješavanju ovog problema. Funkcijski kod find_sym je preuzet odatle.

Statički asmlinkage void (*change_pidR)(struct task_struct *task, enum pid_type type, struct pid *pid); statički asmlinkage struct pid* (*alloc_pidR)(struct pid_namespace *ns); static int __init test_init(void) ( printk(KERN_ALERT "TEST drajver je učitan!\n"); change_pidR = find_sym("change_pid"); alloc_pidR = find_sym("alloc_pid"); ... ) static ssize_t device_read(struct file * filp, char *buffer, size_t dužina, loff_t * offset) ( printk("PID: %d.\n",current->pid); struct pid* newpid; newpid = alloc_pidR(task_active_pid_ns(current)); change_pidR(current) ,PIDTYPE_PID,newpid); printk("novi PID: %d.\n",trenutni->pid); ... )
Kompajlirajte, pokrenite

Moj roditelj PID 299 Moj PID 750 Moj novi PID 751
PID promijenjen! Kernel je automatski dodijelio besplatni PID našem programu. Ali da li je moguće koristiti PID koji je zauzeo drugi proces, kao što je PID 1? Dodajte kod nakon dodjele

Newpid->numbers.nr = 1;
Kompajlirajte, pokrenite

Moj roditelj PID 314 Moj PID 1172 Moj novi PID 1
Dobijamo pravi PID 1!

Bash baca grešku koja sprečava prebacivanje zadataka na naredbu %n, ali sve ostale funkcije rade dobro.

Zanimljive karakteristike procesa sa promijenjenim PID-om

PID 0: Ne mogu se prijaviti

Vratimo se kodu i promijenimo PID na 0.

Newpid->numbers.nr = 0;
Kompajlirajte, pokrenite

Moj roditelj PID284 Moj PID 1517 Moj novi PID 0
Ispada da PID 0 nije tako poseban? Radujemo se, pišemo izlaz i...

Jezgro pada! Kernel je definirao naš zadatak kao IDLE TASK i, vidjevši završetak, jednostavno se srušio. Očigledno, naš program se mora vratiti na “normalni” PID prije završetka.

Nevidljivi proces

Vratimo se kodu i postavimo PID, garantovano da nije zauzet
newpid->numbers.nr = 12345;

Kompajlirajte, pokrenite

Moj roditelj PID296 Moj PID 735 Moj novi PID 12345
Hajde da vidimo šta je u /proc

11488693 Consoles FB KCORE brave Particije SWAPS verzija 10149 2226294887 ACPI CPUINFO datotečni sustavi Meminfo Schen_debug Sys Vmallocinfo 88 ASUND Crypto-Ched FS tipke Razno Trigger VMSTAT 11 16 209 24 291 6 81 89 BuddyInfo uređaji prekida kmsg moduli scsi sysvipc zoneinfo 12 17 21 25 296 7 82 9 139 18 22 27 30 76 84 91 cmdline drajver irq kpageflags net softirqs tty 14 182 2212 ka88 2312 upload stranica
Kao što vidite, /proc ne definira naš proces, čak i ako smo uzeli besplatni PID. Prethodni PID također nije u /proc, a ovo je vrlo čudno. Možda se nalazimo u drugom imenskom prostoru i stoga nismo vidljivi glavnom /proc. Montirajte novi /proc i pogledajte šta ima

1 14 18 210 25 291 738 81 9 bus uređaji fs ključ-korisnici zaključavanja pagetypeinfo softirqs timer_list 10 148 182 22 26 296 741 82 90 sched_debug zamjena zamjena za vrijeme rada u pogonu sched_debug zamjena zamena1 upravljačkog programa igroup_debug zamjena 1 148 182 22 26 296 741 82 90 12 16 20 226 288 4 79 85 acpi konzole execdomains irq kpagecount mounts scsi sysrq-trigger vmallocinfo 16 6 17 203 cpuinfo fb ​​kallsyms kpageflags mtrr self sys13g net crypt7 stat sys139 kpage8 self zoneinfo
Kao i ranije, naš proces ne postoji, što znači da smo u uobičajenom imenskom prostoru. Hajde da proverimo

Ps-e | grep bash
296 poena/0 00:00:00 bash

Samo jedan bash, sa kojeg smo pokrenuli program. Ni prethodni PID ni trenutni nisu na listi.

Pažnja! nakon promjene PID-a - naši drajveri neće biti prikladni za oscill. Drugi će biti potrebni. Ako ovo zaboravite - pokušaji instaliranja oscill-a na novi PC će biti neuspješni.

PID - Product IDentifier / product number - karakteristika USB uređaja, zajedno sa VID (Vendor IDentifier - proizvođačev broj) jedinstveno karakteriše ovaj uređaj sa strane domaćina. Upravljački programi za svaki povezani uređaj su instalirani i kojima upravlja VID/PID.

Osciloskop usb.oscill im je dodeljen jedinstveni VID+PID, odnosno isporučuju se sa (i dostupnim za preuzimanje na ovoj stranici) drajverima za Windows 98, 98SE, ME, 2000, XP, Vista, Seven. Međutim, za sljedeće slučajeve:

  • koristeći oscill u Linux OS-u (softver u virtuelna mašina) - FreeBSD varijanta
  • oscil konekcija na Pocket PC / Windows Mobile preko virtuelnog COM porta
  • Windows Seven 64bit sa obaveznim potpisivanjem drajvera

možda ćete morati koristiti standardne Silabs drajvere, za koje ćete morati zamijeniti PID oscil u PID Silabs. To se može učiniti posebnim uslužnim programom SetPID:

Preporučljivo je promijeniti PID u EA61 i koristiti novu verziju Silabs v3.X softvera i DLL drajvera. Ovaj softver omogućava automatski i ručni izbor USB drajvera između v2.0 i v3.X. Za ručni odabir, potrebno je da uradite: Link-Setup-Port-Driver-V3

Pažnja! Promjena PID-a pomoću ovog uslužnog programa je moguća samo na PC-u koji radi pod Windowsom, gdje je upravljački program koji odgovara trenutnom PID-u već instaliran. U suprotnom, SetPID neće vidjeti oscil. To jest, oscill mora biti prisutan u "Device Manageru" na "Control Panel". algoritam:

  1. ako je USB (ili VCP) drajver iz ovog odeljka već instaliran - uslužni program setpid će pokazati PID=840E, a možete promeniti PID u generički SILABS;
  2. SetPID će izgubiti oscilovanje, takođe će nestati u Device Manageru;
  3. Windows će pronaći novi uređaj za koji morate preuzeti standardni drajver sa Silabsa za PID EA60 ili za PID EA61
  4. ovaj drajver je potpisan i ljuska bi trebala početi raditi s njim.

Obrnuti postupak:

  1. nakon instaliranja standardnog drajvera, uslužni program SetPID detektuje oscilovanje sa PID=EA60 ili EA61
  2. možete vratiti prilagođeni OSCILL PID pritiskom na odgovarajuće dugme
  3. SetPID će prikazati originalni PID oscil= 840E

Osim setpid-a, možete koristiti uslužni program Silabs za promjenu PID-a: na ovoj stranici odaberite an144.pdf i an144sw.zip

Napomena: Korisnik Usatenko je na forumu objavio recept za promjenu PID-a na jednom računaru sa Win7 64

  • abnormalno programiranje,
  • Programiranje
  • U ovom članku ćemo pokušati kreirati modul kernela koji može promijeniti PID već pokrenutog procesa u Linux OS-u, kao i eksperimentirati s procesima koji su primili promijenjeni PID.


    Upozorenje: promjena PID-a je nestandardan proces i pod određenim okolnostima može dovesti do panike kernela.

    Naš test modul će implementirati /dev/test karakterni uređaj, čitanje sa kojeg će promijeniti PID procesa. Hvala članku za primjer implementacije karakternog uređaja. Kompletan kod modula dat je na kraju članka. Naravno, najispravnije rješenje je bilo dodavanje sistemskog poziva samom kernelu, ali to bi zahtijevalo ponovno kompajliranje kernela.

    Životna sredina

    Sve akcije testiranja modula izvedene su u virtuelnoj mašini VirtualBox sa 64-bitnom LInux distribucijom i verzijom kernela 4.14.4-1. Komunikacija sa mašinom je obavljena pomoću SSH.

    Pokušaj #1 jednostavno rješenje

    Nekoliko riječi o struji: trenutna varijabla ukazuje na strukturu task_struct sa opisom procesa u kernelu (PID, UID, GID, cmdline, imenski prostori, itd.)

    Prva ideja je bila jednostavno promijeniti parametar current->pid iz modula kernela u željeni.

    Statički ssize_t device_read(struct file *filp, char *buffer, size_t dužina, loff_t * offset) ( printk("PID: %d.\n",current->pid); current->pid = 1; printk("new PID: %d.\n",trenutni->pid); , )
    Da testiram funkcionalnost modula, napisao sam program na C ++:

    #include #include #include int main() ( std::cout<< "My parent PID " << getppid() << std::endl; std::cout << "My PID " << getpid() << std::endl; std::fstream f("/dev/test",std::ios_base::in); if(!f) { std::cout << "f error"; return -1; } std::string str; f >>str; std::out<< "My new PID " << getpid() << std::endl; execl("/bin/bash","/bin/bash",NULL); }
    Učitajte modul naredbom insmod, kreirajte /dev/test i pokušajte.

    # ./a.out Moj roditelj PID 293 Moj PID 782 Moj novi PID 782
    PID se nije promijenio. Možda ovo nije jedino mjesto gdje je specificiran PID.

    Pokušajte #2 dodatna PID polja

    Ako current->pid nije ID procesa, šta je onda? Brzi pogled na getpid() kod ukazao je na strukturu task_struct koja opisuje Linux proces i datoteku pid.c u izvornom kodu kernela. Potrebna funkcija je __task_pid_nr_ns. U kodu funkcije postoji poziv task-> pids.pid, ovaj parametar ćemo promijeniti

    Sastavljanje i pokušaj

    Pošto sam testirao preko SSH-a, uspeo sam da dobijem izlaz programa pre nego što se kernel sruši:

    Moj roditelj PID 293 Moj PID 1689 Moj novi PID 1689
    Prvi rezultat, već nešto. Ali PID se još uvijek nije promijenio.

    Pokušaj #3 nisu izvezeni simboli kernela

    Pažljiviji pogled na pid.c dao je funkciju koja radi ono što nam treba.
    static void __change_pid(struct task_struct *task, enum tip pid_type,
    struct pid *novo)
    Funkcija prihvaća zadatak za koji je potrebno promijeniti PID, tip PID-a i, zapravo, novi PID. Kreiranjem novog PID-a upravlja funkcija
    struct pid *alloc_pid(struct pid_namespace *ns)

    Ova funkcija prihvaća samo prostor imena u kojem će biti novi PID, ovaj prostor se može dobiti pomoću task_active_pid_ns.
    Ali postoji jedan problem: kernel ne izvozi ove simbole kernela i ne mogu se koristiti u modulima. Wonderful mi je pomogao u rješavanju ovog problema. Funkcijski kod find_sym je preuzet odatle.

    Statički asmlinkage void (*change_pidR)(struct task_struct *task, enum pid_type type, struct pid *pid); statički asmlinkage struct pid* (*alloc_pidR)(struct pid_namespace *ns); static int __init test_init(void) ( printk(KERN_ALERT "TEST drajver je učitan!\n"); change_pidR = find_sym("change_pid"); alloc_pidR = find_sym("alloc_pid"); ... ) static ssize_t device_read(struct file * filp, char *buffer, size_t dužina, loff_t * offset) ( printk("PID: %d.\n",current->pid); struct pid* newpid; newpid = alloc_pidR(task_active_pid_ns(current)); change_pidR(current) ,PIDTYPE_PID,newpid); printk("novi PID: %d.\n",trenutni->pid); ... )
    Kompajlirajte, pokrenite

    Moj roditelj PID 299 Moj PID 750 Moj novi PID 751
    PID promijenjen! Kernel je automatski dodijelio besplatni PID našem programu. Ali da li je moguće koristiti PID koji je zauzeo drugi proces, kao što je PID 1? Dodajte kod nakon dodjele

    Newpid->numbers.nr = 1;
    Kompajlirajte, pokrenite

    Moj roditelj PID 314 Moj PID 1172 Moj novi PID 1
    Dobijamo pravi PID 1!

    Bash baca grešku koja sprečava prebacivanje zadataka na naredbu %n, ali sve ostale funkcije rade dobro.

    Zanimljive karakteristike procesa sa promijenjenim PID-om

    PID 0: Ne mogu se prijaviti

    Vratimo se kodu i promijenimo PID na 0.

    Newpid->numbers.nr = 0;
    Kompajlirajte, pokrenite

    Moj roditelj PID284 Moj PID 1517 Moj novi PID 0
    Ispada da PID 0 nije tako poseban? Radujemo se, pišemo izlaz i...

    Jezgro pada! Kernel je definirao naš zadatak kao IDLE TASK i, vidjevši završetak, jednostavno se srušio. Očigledno, naš program se mora vratiti na “normalni” PID prije završetka.

    Nevidljivi proces

    Vratimo se kodu i postavimo PID, garantovano da nije zauzet
    newpid->numbers.nr = 12345;

    Kompajlirajte, pokrenite

    Moj roditelj PID296 Moj PID 735 Moj novi PID 12345
    Hajde da vidimo šta je u /proc

    11488693 Consoles FB KCORE brave Particije SWAPS verzija 10149 2226294887 ACPI CPUINFO datotečni sustavi Meminfo Schen_debug Sys Vmallocinfo 88 ASUND Crypto-Ched FS tipke Razno Trigger VMSTAT 11 16 209 24 291 6 81 89 BuddyInfo uređaji prekida kmsg moduli scsi sysvipc zoneinfo 12 17 21 25 296 7 82 9 139 18 22 27 30 76 84 91 cmdline drajver irq kpageflags net softirqs tty 14 182 2212 ka88 2312 upload stranica
    Kao što vidite, /proc ne definira naš proces, čak i ako smo uzeli besplatni PID. Prethodni PID također nije u /proc, a ovo je vrlo čudno. Možda se nalazimo u drugom imenskom prostoru i stoga nismo vidljivi glavnom /proc. Montirajte novi /proc i pogledajte šta ima

    1 14 18 210 25 291 738 81 9 bus uređaji fs ključ-korisnici zaključavanja pagetypeinfo softirqs timer_list 10 148 182 22 26 296 741 82 90 sched_debug zamjena zamjena za vrijeme rada u pogonu sched_debug zamjena zamena1 upravljačkog programa igroup_debug zamjena 1 148 182 22 26 296 741 82 90 12 16 20 226 288 4 79 85 acpi konzole execdomains irq kpagecount mounts scsi sysrq-trigger vmallocinfo 16 6 17 203 cpuinfo fb ​​kallsyms kpageflags mtrr self sys13g net crypt7 stat sys139 kpage8 self zoneinfo
    Kao i ranije, naš proces ne postoji, što znači da smo u uobičajenom imenskom prostoru. Hajde da proverimo

    Ps-e | grep bash
    296 poena/0 00:00:00 bash

    Samo jedan bash, sa kojeg smo pokrenuli program. Ni prethodni PID ni trenutni nisu na listi.

    Top Related Articles