Bir SMI flash sürücünün kimlik bilgileri nasıl değiştirilir

  • 16.04.2019

Dikkat! PID'yi değiştirdikten sonra - sürücülerimiz salınım için uygun olmayacaktır. Diğerlerine ihtiyaç duyulacak. Bunu unutursanız, yeni bir PC'ye oscill yükleme girişimleri başarısız olacaktır.

PID - Ürün Tanımlayıcı / numara ürün özelliği Bir VID (Satıcı Kimliği - üretici numarası) ile birlikte USB cihazları, bu cihazı ana bilgisayar tarafından benzersiz bir şekilde karakterize eder. Bağlı her cihaz için sürücüler VID / PID tarafından kurulur ve çalıştırılır.

Osiloskop usb.oscill sırasıyla benzersiz bir VID + PID atanmışsa, bunlar Windows 98, 98SE, ME, 2000, XP, Vista, Seven için sürücülerle birlikte sağlanır (ve bu siteden indirilebilir). Ancak aşağıdaki durumlar için:

  • Linux'ta osil kullanma (yazılım sanal makine) - FreeBSD seçeneği
  • Sanal COM bağlantı noktası üzerinden Pocket PC / Windows Mobile'a osilatör bağlantısı
  • Zorunlu sürücü imzalı Windows Seven 64bit

PID'yi değiştirmeniz gereken standart Silabs sürücülerini kullanmanız gerekebilir. salınım PID Silabs üzerinde. Yapılabilir özel yardımcı program SetPID:

PID'yi EA61 olarak değiştirmeniz ve yeni yazılım sürümünü ve DLL sürücüsü Silabs v3.X'i kullanmanız önerilir. Bu yazılım, otomatik ve manuel sağlar USB seçimi v2.0 ve v3.X arasındaki sürücüler. İçin manuel seçim yapılacaklar: Bağlantı-Kurulum-Port-Sürücüsü-V3

Dikkat! Bu yardımcı programla PID'yi değiştirmek, yalnızca aşağıdaki bir bilgisayarda mümkündür: Windows denetimi, geçerli PID'ye karşılık gelen sürücünün zaten kurulu olduğu yerde. Aksi takdirde SetPID görmez. salınım... Yani, "Kontrol Paneli"nin "Aygıt Yöneticisi"nde osil bulunmalıdır. algoritma:

  1. bu bölümdeki USB (veya VCP) sürücüsü zaten kuruluysa - setpid yardımcı programı PID = 840E gösterecektir ve PID'yi genel SILABS olarak değiştirebilirsiniz;
  2. SetPID salınımı kaybedecek, Aygıt Yöneticisinde de kaybolacak;
  3. Windows, PID EA60 veya PID EA61 için Silabs'tan standart bir sürücü indirmeniz gereken yeni bir aygıt bulacaktır.
  4. bu sürücü imzalanmıştır ve kabuk onunla çalışmaya başlamalıdır.

Ters prosedür:

  1. yüklemeden sonra standart sürücü, SetPID yardımcı programı salınımı PID = EA60 veya EA61 ile algılar
  2. ilgili düğmeye basarak özel OSCILL PID'yi iade edebilirsiniz
  3. SetPID, orijinal PID'yi gösterecek salınım= 840E

Setpid'e ek olarak, PID'yi değiştirmek için Silabs yardımcı programını kullanabilirsiniz: bu sayfada an144.pdf ve an144sw.zip

Not: Forumdaki Kullanıcı Usatenko, PID'yi şu şekilde değiştirmek için bir tarif yayınladı: tek bilgisayar Win7 64 ile

Bu, nasıl olduğuna bakacağımız ana makaledir. klasik yol flash sürücünün verilerini değiştirin ve ayrı makalelerde ayrıntılı olarak açıklanan iki egzotik olanla karşılaştırın.

Program ayarlarının normal düzenlenmesiyle değiştirilemeyen bu tür verileri değiştirme yöntemlerini açıklarlar. Kısacası, sorunu çözmek için standart olmayan bir yaklaşım uygulandı.

GİRİŞ

Kontrolörler neden iyidir SMI, böylece onları değiştirmek için onları dikmek gerekli değildir. seri numarası ve diğer bilgilerin çoğu. Bu da çıkışta ölü bir flash sürücü alma riskini azaltır.

Ancak yine de rahatlamanıza gerek yok, yöntemlerden herhangi birinin kullanılması hem ek biçimlendirme hem de dondurma ihtiyacını gerektirebilir. Bu, temel olarak yardımcı programın bazı dağıtımlarındaki aksaklıklardan kaynaklanmaktadır. SMI MPAracı... Bu nedenle, bir sürümde, bir nedenden dolayı, tanımlama bilgisi güncellenmek istemiyor, diğerinde seriyi kestikten sonra biçimlendirme gerektiriyor, vb. Bazen, flash sürücünüzle tam uyumlu bir dağıtım kiti aramanız yeterlidir ve zaten cesurca sonuna kadar sapıksınız.

Aşağıya, olasılıkların görsel bir karşılaştırmasını yaptığım küçük bir tabak koydum. farklı yöntemler kimlik değişiklikleri. Ondan da görebileceğiniz gibi, evrensel yol hayır ve kombinasyon bireysel elemanlar- kendini öneren çıkış yolu budur.

YÖNTEMLERİN KARŞILAŞTIRMALI ANALİZİ
STANDART YÖNTEM SMI HATA AYIKLAMASI DÜZENLEME DOSYALARI
VID-PID: + + +
Satıcı-Ürün: + + +
Seri numarası: + + +
Revizyon: + +
Milletvekili Tarihi: +
ISP Sürümü: +
Ön Test Sürümü: + +
MP Paket No: + +
Flaş Kümesi: + +
ZORLUK SEVİYESİ: KOLAYCA ORTALAMA ORTALAMANIN ÜZERİNDE

SMI MPTOOL FLAŞÖRÜ İLE

Girişte zaten yazdığım gibi, veri değiştirme sorununu çözmek için dikiş hiç gerekli değildir. Sağ taraftaki ayarların ilk sayfasındaki onay kutularını aktif bırakmanız yeterlidir. Müşteri Kimliği Yaz ve ISS'yi indirin.

Ve dahası için eski model SM3252C, sadece bir kuş bırakabilirsin Müşteri Kimliği Yaz.

Tam yanıp sönme şu şekilde sağlanır: ek katılım seçenekler: ön test ve Biçim (FAT32).

Ayrı ayrı düşünün Seri numarası dan beri en zoru ve ancak o zaman diğer tüm parametreler.

SERİ NUMARASI

İlk tanışmada, manuel düzenleme sayesinde serinin uzunluğunu ayarlayabileceğiniz görünebilir. SMI-aşağıdaki flaş 13 karakterüretim yardımcı programına gömülü SMIMPAracı... Ama bu şekilde alt sınır 13 bayt mevcut parametreye rağmen uygulamada mevcut değil SN Uzunluğu.

İlk önce parametre değerini ayarlıyoruz Seri numarası oluşum yöntemini tanımlama:
13-32 Bayt (standart değer, altından düzenlenmesi gerekir)
rastgele SN (rastgele karakterler)
NO Seri (seri eksik)
NO Seriyi Güncelle (aynı değeri koru)

Belirli bir seri numarasını sabit kodlamak istiyorsanız, sütunda belirtmeniz yeterlidir. seri maske.

Sembol # seri numarasında, isteğe bağlı bir değer anlamına gelir, modlarda seri oluştururken kullanılır rastgele SN ve 13-32 Bayt.

SN Uzunluğu: uzunluk değeri, 13 ila 32 karakter... Seçenek yok Chk SN Len, belirtilen seri numarasının uzunluğunu kesinlikle kontrol eden parametre SN Uzunluğu iştahınızı yalnızca maksimum uzunlukta sınırlar.

seri maske- dizinin oluşturulduğu maske. Sonraki her flash sürücü, değerden başlayarak bir öncekinden farklı bir numaraya sahip olacaktır. Seri Başlaönce Seriyi Bitir işaretin altındaki karakterleri değiştirme kafes (# ).
Seri Başla- ilk flash sürücü için başlangıç ​​değeri.
Seriyi Bitir Nihai değerdir.

Mod örneğini kullanarak bir sayı üretme örneğini düşünün rastgele SN:
Biz sorarız seri maske = AA#USBDEVRU###################
Aşağıdaki seri numarasını alıyoruz: AA Z USBDEVRU 0ORFR1BYNRB7UBY317E

Onlar. semboller AA ve USBDEVRU kaldı, geri kalanı keyfi olarak değiştirildi.

TOPLAM DİNLENME

Değişim prosedürünü açıklayın VID-PID, DEVİR, SATICI-ÜRÜNözel bir anlamı yok, nerede olduğunu kısaca açıklayacağım. elementleri arayacağız SMI MPAracı uygulamada alışılmış olduğu gibi ÇipDahi.

VID ve PID ve bensiz açıkçası, gerekirse değerlerimizi sürdürürüz.

(isim SMI MPAracı) = (v ÇipDahi)

USB Satıcı Str = Cihaz Satıcısı
USB Ürün Str = Cihaz adı

Sorgulama Satıcısı = Üretici firma
Sorgulama Ürün = ürün modeli

bcdCihaz bir revizyon mu ( Revizyon), aynı değer için ayarlanır Cihaz Revizyonu ve Ürün Revizyonu... Diğer yöntemleri kullanırken, bunları ayrı ayrı değiştirebilirsiniz ve bu nedenle tabloya koydum. EKSİ ilgili sütunda.

SMI REFIXINFO İLE

Tamamen hazırlıksız kullanıcılar için ideal olan kompakt, taşınabilir bir araçtır.

Değiştirilmesi gereken bu parametrelerin onay kutularının alt kısmını etkinleştirmeniz ve ardından programın üst kısmında bunları kesmeniz yeterlidir.

Ne yazık ki, yardımcı program eski ve mevcut yongalarla uyumlu değil. Muhtemelen daha eski olmayan modellerle çalışır SMI SM3257AA 2000'li yılların sonundan bu yana gün boyunca ateşle bulamayacağınız.

Ayrıca cihazın seri numarasının değiştirilmesine izin vermemesi oldukça önemli bir dezavantajdır. Aşağıdaki parametreleri değiştirmenizi sağlar: VID, PID, Cihaz Satıcısı, Cihaz adı, Cihaz Revizyonu, Üretici firma ve ürün modeli.

DYNA MPTOOL FLAŞÖRÜ İLE

Bir sürü özelliği ve püf noktası var, yardımcı programları mümkün olduğunca atlamanızı tavsiye ederim.

Bir USB flash sürücüyü bir şekilde mahveden ve gerekli verilerle flash yapmak isteyenler için, ekran görüntülerinde ilgili program ayarları öğelerini göstereceğim.

: OpenCard Yapılandırması:

: Cihaz Yapılandırması:

Bunu göz önünde bulundurarak DYNA- dikişli flash sürücülerle ilgili birçok sorun var, onlar için en iyi çözüm manuel düzenleme aracılığıyla veri.

SMI QCTOOL İLE

Yardımcı programı kullanmak gibi bir seçenek de var SMI QCTool I1027, ama bu hala çok egzotik bir seçenek.

Bu yardımcı programın hangi çip modelleriyle uyumlu olduğunu kesin olarak söyleyemem, ancak kesinlikle hangileri ile çok azı ve hepsi eski. Örneğin, flash sürücümle uyumlu SMI SM3252C.

içinde düşünün bu materyal başvuru sorusu SMIQCAracı yapmayacağız ve onunla iletişime geçmenizi tavsiye etmiyorum. Sadece grafiklerde söyleyeceğim SATICI, Ürün, Etiket yardımcı programın ana penceresinde bulunur, flash sürücünüzün değerlerini kırmızı renkte vermemesi için sürmeniz gerekir: Etiket hatası, SCSI Satıcı hatası ve SCSI Ürün hatası.

Peki, size yardımcı program ayarlarının birkaç ekran görüntüsünü vereceğim ve sonra isterseniz kendi başınıza.

Seri numarasını veya başka herhangi bir parametreyi değiştirmeyle ilgili sorununuzun ayrıntılı bir değerlendirmesi için lütfen - bölümüne gidin.

  • Anormal programlama,
  • Programlama
  • Bu yazıda zaten PID'yi değiştirebilen bir çekirdek modülü oluşturmaya çalışacağız. çalışan süreç Linux işletim sisteminde ve değiştirilmiş bir PID alan işlemlerle denemeler yapın.


    Bir uyarı: PID'yi değiştirmek standart olmayan bir işlemdir ve belirli koşullar altında çekirdek paniğine neden olabilir.

    Bizim test modülü işlemin PID'yi değiştireceği okumada karakter cihazı / dev / testini uygulayacaktır. Makale sayesinde bir karakter cihazının uygulanmasına bir örnek. Kodu tamamla Modül makalenin sonunda verilmiştir. Tabii ki, en doğru kararçekirdeğe bir sistem çağrısı eklemekti, ancak bu, çekirdeğin yeniden derlenmesini gerektirecekti.

    Çevre

    Modülü test etmek için tüm eylemler sanal bir ortamda gerçekleştirildi. Sanal Kutu makinesi 64-bit Linux dağıtımı ve çekirdek sürümü 4.14.4-1 ile. Makine ile iletişim SSH kullanılarak gerçekleştirildi.

    Deneme # 1 basit çözüm

    Mevcut hakkında birkaç kelime: değişken current, çekirdekteki işlemin (PID, UID, GID, cmdline, ad alanları, vb.)

    İlk fikir, current-> pid parametresini çekirdek modülünden istenene değiştirmekti.

    Statik ssize_t device_read (struct file * filp, char * tampon, size_t uzunluk, loff_t * offset) (printk ("PID:% d. \ N", akım-> pid); akım-> pid = 1; printk ("yeni PID:% d. \ N ", akım-> pid);,)
    Modülün işlevselliğini test etmek için C++ ile bir program yazdım:

    #Dahil etmek #Dahil etmek #Dahil etmek int ana () (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; standart :: cout<< "My new PID " << getpid() << std::endl; execl("/bin/bash","/bin/bash",NULL); }
    Modülü insmod ile yükleyin, oluşturun / dev / test edin ve deneyin.

    # ./a.out Ebeveynim PID 293 Benim PID 782'm Yeni PID 782'm
    PID değişmedi. PID'nin listelendiği tek yer burası olmayabilir.

    Deneme # 2 ek PID alanı

    Current-> pid işlem kimliği değilse, nedir? getpid () koduna hızlı bir bakış, Linux sürecini ve çekirdek kaynağındaki pid.c dosyasını tanımlayan task_struct yapısını gösterir. Gerekli işlev __task_pid_nr_ns'dir. İşlev kodu, task-> pids.pid çağrısını içerir, bu parametreyi değiştireceğiz

    Derleme, deneme

    SSH üzerinden test ettiğim için, çekirdek çökmeden önce programın çıktısını alabildim:

    Ebeveynim PID 293 PID'im 1689 Yeni PID'm 1689
    İlk sonuç zaten bir şeydir. Ancak PID hala değişmedi.

    Dışa aktarılmayan 3 çekirdek sembolü denemesi

    pid.c'ye daha yakından bakıldığında, istediğimizi yapan bir fonksiyon çıktı.
    static void __change_pid (struct task_struct * görev, enum pid_type türü,
    struct pid * yeni)
    İşlev, PID'yi, PID türünü ve aslında yeni PID'yi değiştirmenin gerekli olduğu bir görevi kabul eder. Yeni PID, işlev tarafından oluşturulur.
    struct pid * alloc_pid (struct pid_namespace * ns)

    Bu işlev yalnızca yeni PID'nin içinde olacağı ad alanını kabul eder, bu alan task_active_pid_ns kullanılarak elde edilebilir.
    Ancak bir sorun var: bu çekirdek sembolleri, çekirdek tarafından dışa aktarılmaz ve modüllerde kullanılamaz. Bu sorunu çözerken harika biri bana yardımcı oldu. find_sym fonksiyon kodu oradan alınır.

    Statik asmlinkage void (* change_pidR) (struct Task_struct * Task, enum pid_type type, struct pid * pid); statik bağlantı yapısı pid * (* alloc_pidR) (struct pid_namespace * ns); static int __init test_init (void) (printk (KERN_ALERT "TEST sürücüsü yüklendi! \ n"); change_pidR = find_sym ("change_pid"); alloc_pidR = find_sym ("alloc_pid"); ...) static ssize_t device_read (yapı dosyası * filp, char * tampon, size_t uzunluk, loff_t * offset) (printk ("PID:% d. \ n", akım-> pid); struct pid * newpid; newpid = alloc_pidR (task_active_pid_ns (geçerli)); change_pidR (geçerli) , PIDTYPE_PID, newpid); printk ("yeni PID:% d. \ N", mevcut-> pid); ...)
    iltifat, fırlatma

    Ebeveynim PID 299 PID 750'm Yeni PID 751'im
    PID değişti! Çekirdek, programımıza otomatik olarak ücretsiz bir PID tahsis etti. Ancak PID 1 gibi başka bir işlemin devraldığı bir PID kullanmak mümkün müdür? Tahsisten sonra kod ekleyin

    Newpid-> sayılar.nr = 1;
    iltifat, fırlatma

    Ebeveynim PID 314'üm PID 1172 Yeni PID'm 1
    Gerçek PID 1'i alıyoruz!

    Bash, % n komutunu açma görevinin çalışmadığı, ancak diğer tüm işlevlerin iyi çalıştığı bir hata verdi.

    Değişen PID'li süreçlerin ilginç özellikleri

    PID 0: girişten çıkılamaz

    Kodlara geri dönelim ve PID'yi 0 olarak değiştirelim.

    Newpid-> sayılar.nr = 0;
    iltifat, fırlatma

    Ebeveynim PID284 Benim PID'm 1517 Yeni PID'm 0
    Yani PID 0 o kadar özel değil mi? Mutluyuz, çıkış yaz ve ...

    Çekirdek düşüyor! Çekirdek, görevimizi BOŞTA GÖREVİ olarak tanımladı ve tamamlandığını görünce çöktü. Görünüşe göre, sonlandırmadan önce programımız kendisine "normal" PID'yi döndürmelidir.

    Görünmez süreç

    Kodlara geri dönelim ve boş olması garanti edilen PID'yi ayarlayalım.
    newpid-> sayılar.nr = 12345;

    iltifat, fırlatma

    Ebeveynim PID296'm PID 735'im Yeni PID'm 12345
    Bakalım neler var / proc

    1 148 19 224 288 37 79 86 93 konsollar fb kcore kilitleri bölüm takasları sürüm 10 149 2 226 29 4 8 87 acpi cpuinfo dosya sistemleri anahtar kullanıcıları meminfo sched_debug sys vmallocinfo 102 15 20 23 290 5 80 88 asound kripto fs anahtarları misc schedstat-sys tetik vmstat 11 16 208 24 291 6 81 89 buddyinfo cihazları kesintiler kmsg modülleri scsi sysvipc zoneinfo 12 17 21 25 296 7 82 9 veri yolu diskstats iomem kpagecgroup mounts self thread-self 13 176 210 26 3 737 83 90 cgroups dma ioports kpagecount mtrr 139 18 22 27 30 76 84 91 cmdline sürücüsü irq kpageflags net softirqs tty 14 182 222 28 31 78 85 92 config.gz execdomains kallsyms loadavg pagetypeinfo stat çalışma süresi
    Gördüğünüz gibi / proc ücretsiz bir PID ödünç alsak bile sürecimizi tanımlamıyor. Önceki PID de / proc içinde değil, bu çok garip. Farklı bir ad alanında olabiliriz ve bu nedenle ana / proc tarafından görülemeyebiliriz. Yeni / proc'u bağlayalım ve orada ne olduğunu görelim

    1 14 18 210 25 291 738 81 9 veri yolu aygıtları fs anahtar kullanıcıları kilitleri pagetypeinfo softirqs timer_list 10 148 182 22 26 296 741 82 90 grup diskstats kesme anahtarları meminfo bölümleri stat tty 102 149 19 222 27 30 76 83 92 cmdline dma iomem kmsg misc sched_debug takas çalışma süresi 11 15 2 224 28 37 78 84 93 config.gz sürücüsü ioports kpagecgroup modülleri schedstat sys version 12 16 20 226 288 4 79 85 acpi konsolları execdomains irq kpagecount mounts scsi sysrq-trigger vmallocinfo olarak 23 29 6 8 17 208 cpuinfo fb ​​​​kallsyms kpageflags mtrr self sysvipc vmstat 139 176 21 24 290 7 80 87 buddyinfo kripto dosya sistemleri kcore loadavg net slabinfo thread-self zoneinfo
    Daha önce olduğu gibi, işlemimiz orada değil, yani normal bir ad alanındayız. Kontrol etmek

    Not -e | grep bash
    296 puan / 0 00:00:00 bash

    Programı çalıştırdığımız tek bir bash. Ne önceki PID ne de mevcut olan listede yok.



    Bu yazıda, Linux'ta halihazırda çalışan bir işlemin PID'sini değiştirebilecek bir çekirdek modülü oluşturmaya ve ayrıca değiştirilmiş bir PID alan işlemlerle denemeler yapmaya çalışacağız.


    Bir uyarı: PID'yi değiştirmek standart olmayan bir işlemdir ve belirli koşullar altında çekirdek paniğine neden olabilir.

    Test birimimiz, okunduğunda sürecin PID'sini değiştirecek olan karakter cihazı / dev / testi uygulayacaktır. Bu makale sayesinde bir karakter cihazının uygulanmasına bir örnek için. Tam modül kodu makalenin sonunda verilmiştir. Elbette en doğru çözüm, çekirdeğe bir sistem çağrısı eklemekti, ancak bu, çekirdeğin yeniden derlenmesini gerektirecekti.

    Çevre

    Modülü test etmek için tüm eylemler, 64 bit Linux dağıtımı ve çekirdek sürümü 4.14.4-1 olan bir VirtualBox sanal makinesinde gerçekleştirildi. Makine ile iletişim SSH kullanılarak gerçekleştirildi.

    Deneme # 1 basit çözüm

    Mevcut hakkında birkaç kelime: değişken current, çekirdekteki işlemin (PID, UID, GID, cmdline, ad alanları, vb.)

    İlk fikir, current-> pid parametresini çekirdek modülünden istenene değiştirmekti.

    Statik ssize_t device_read (struct file * filp, char * tampon, size_t uzunluk, loff_t * offset) (printk ("PID:% d. \ N", akım-> pid); akım-> pid = 1; printk ("yeni PID:% d. \ N ", akım-> pid);,)
    Modülün işlevselliğini test etmek için C++ ile bir program yazdım:

    #Dahil etmek #Dahil etmek #Dahil etmek int ana () (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; standart :: cout<< "My new PID " << getpid() << std::endl; execl("/bin/bash","/bin/bash",NULL); }
    Modülü insmod ile yükleyin, oluşturun / dev / test edin ve deneyin.

    # ./a.out Ebeveynim PID 293 Benim PID 782'm Yeni PID 782'm
    PID değişmedi. PID'nin listelendiği tek yer burası olmayabilir.

    Deneme # 2 ek PID alanı

    Current-> pid işlem kimliği değilse, nedir? getpid () koduna hızlı bir bakış, Linux sürecini ve çekirdek kaynağındaki pid.c dosyasını tanımlayan task_struct yapısını gösterir. Gerekli işlev __task_pid_nr_ns'dir. İşlev kodu, task-> pids.pid çağrısını içerir, bu parametreyi değiştireceğiz

    Derleme, deneme

    SSH üzerinden test ettiğim için, çekirdek çökmeden önce programın çıktısını alabildim:

    Ebeveynim PID 293 PID'im 1689 Yeni PID'm 1689
    İlk sonuç zaten bir şeydir. Ancak PID hala değişmedi.

    Dışa aktarılmayan 3 çekirdek sembolü denemesi

    pid.c'ye daha yakından bakıldığında, istediğimizi yapan bir fonksiyon çıktı.
    static void __change_pid (struct task_struct * görev, enum pid_type türü,
    struct pid * yeni)
    İşlev, PID'yi, PID türünü ve aslında yeni PID'yi değiştirmenin gerekli olduğu bir görevi kabul eder. Yeni PID, işlev tarafından oluşturulur.
    struct pid * alloc_pid (struct pid_namespace * ns)

    Bu işlev yalnızca yeni PID'nin içinde olacağı ad alanını kabul eder, bu alan task_active_pid_ns kullanılarak elde edilebilir.
    Ancak bir sorun var: bu çekirdek sembolleri, çekirdek tarafından dışa aktarılmaz ve modüllerde kullanılamaz. Bu sorunu çözerken harika biri bana yardımcı oldu. find_sym fonksiyon kodu oradan alınır.

    Statik asmlinkage void (* change_pidR) (struct Task_struct * Task, enum pid_type type, struct pid * pid); statik bağlantı yapısı pid * (* alloc_pidR) (struct pid_namespace * ns); static int __init test_init (void) (printk (KERN_ALERT "TEST sürücüsü yüklendi! \ n"); change_pidR = find_sym ("change_pid"); alloc_pidR = find_sym ("alloc_pid"); ...) static ssize_t device_read (yapı dosyası * filp, char * tampon, size_t uzunluk, loff_t * offset) (printk ("PID:% d. \ n", akım-> pid); struct pid * newpid; newpid = alloc_pidR (task_active_pid_ns (geçerli)); change_pidR (geçerli) , PIDTYPE_PID, newpid); printk ("yeni PID:% d. \ N", mevcut-> pid); ...)
    iltifat, fırlatma

    Ebeveynim PID 299 PID 750'm Yeni PID 751'im
    PID değişti! Çekirdek, programımıza otomatik olarak ücretsiz bir PID tahsis etti. Ancak PID 1 gibi başka bir işlemin devraldığı bir PID kullanmak mümkün müdür? Tahsisten sonra kod ekleyin

    Newpid-> sayılar.nr = 1;
    iltifat, fırlatma

    Ebeveynim PID 314'üm PID 1172 Yeni PID'm 1
    Gerçek PID 1'i alıyoruz!

    Bash, % n komutunu açma görevinin çalışmadığı, ancak diğer tüm işlevlerin iyi çalıştığı bir hata verdi.

    Değişen PID'li süreçlerin ilginç özellikleri

    PID 0: girişten çıkılamaz

    Kodlara geri dönelim ve PID'yi 0 olarak değiştirelim.

    Newpid-> sayılar.nr = 0;
    iltifat, fırlatma

    Ebeveynim PID284 Benim PID'm 1517 Yeni PID'm 0
    Yani PID 0 o kadar özel değil mi? Mutluyuz, çıkış yaz ve ...

    Çekirdek düşüyor! Çekirdek, görevimizi BOŞTA GÖREVİ olarak tanımladı ve tamamlandığını görünce çöktü. Görünüşe göre, sonlandırmadan önce programımız kendisine "normal" PID'yi döndürmelidir.

    Görünmez süreç

    Kodlara geri dönelim ve boş olması garanti edilen PID'yi ayarlayalım.
    newpid-> sayılar.nr = 12345;

    iltifat, fırlatma

    Ebeveynim PID296'm PID 735'im Yeni PID'm 12345
    Bakalım neler var / proc

    1 148 19 224 288 37 79 86 93 konsollar fb kcore kilitleri bölüm takasları sürüm 10 149 2 226 29 4 8 87 acpi cpuinfo dosya sistemleri anahtar kullanıcıları meminfo sched_debug sys vmallocinfo 102 15 20 23 290 5 80 88 asound kripto fs anahtarları misc schedstat-sys tetik vmstat 11 16 208 24 291 6 81 89 buddyinfo cihazları kesintiler kmsg modülleri scsi sysvipc zoneinfo 12 17 21 25 296 7 82 9 veri yolu diskstats iomem kpagecgroup mounts self thread-self 13 176 210 26 3 737 83 90 cgroups dma ioports kpagecount mtrr 139 18 22 27 30 76 84 91 cmdline sürücüsü irq kpageflags net softirqs tty 14 182 222 28 31 78 85 92 config.gz execdomains kallsyms loadavg pagetypeinfo stat çalışma süresi
    Gördüğünüz gibi / proc ücretsiz bir PID ödünç alsak bile sürecimizi tanımlamıyor. Önceki PID de / proc içinde değil, bu çok garip. Farklı bir ad alanında olabiliriz ve bu nedenle ana / proc tarafından görülemeyebiliriz. Yeni / proc'u bağlayalım ve orada ne olduğunu görelim

    1 14 18 210 25 291 738 81 9 veri yolu aygıtları fs anahtar kullanıcıları kilitleri pagetypeinfo softirqs timer_list 10 148 182 22 26 296 741 82 90 grup diskstats kesme anahtarları meminfo bölümleri stat tty 102 149 19 222 27 30 76 83 92 cmdline dma iomem kmsg misc sched_debug takas çalışma süresi 11 15 2 224 28 37 78 84 93 config.gz sürücüsü ioports kpagecgroup modülleri schedstat sys version 12 16 20 226 288 4 79 85 acpi konsolları execdomains irq kpagecount mounts scsi sysrq-trigger vmallocinfo olarak 23 29 6 8 17 208 cpuinfo fb ​​​​kallsyms kpageflags mtrr self sysvipc vmstat 139 176 21 24 290 7 80 87 buddyinfo kripto dosya sistemleri kcore loadavg net slabinfo thread-self zoneinfo
    Daha önce olduğu gibi, işlemimiz orada değil, yani normal bir ad alanındayız. Kontrol etmek

    Not -e | grep bash
    296 puan / 0 00:00:00 bash

    Programı çalıştırdığımız tek bir bash. Ne önceki PID ne de mevcut olan listede yok.