Doğrudan eval() VM Obfuscation İşlemini Devre Dışı Bırakır
Bir fonksiyonun gövdesinin herhangi bir yerinde (iç içe fonksiyonlar dahil) doğrudan bir eval(code) çağrısı varsa, o fonksiyon VM obfuscation tarafından atlanır ve obfuscator bir VMDynamicCodeSkipped uyarısı bildirir (fonksiyonun bir adı varsa onu belirtir). Root modunda (varsayılan) fonksiyonun tamamı ve iç içe tüm fonksiyonları atlanır; comment modunda ayrıca işaretlediğiniz iç içe bir fonksiyon, eval'i kendisi içermediği sürece yine sanallaştırılır. Statik olmayan bir argümanla yapılan doğrudan eval ayrıca bir DynamicCodeRenameRisk uyarısı üretir. Bunun nedeni, doğrudan eval'in çevreleyen fonksiyonun yerel değişkenlerine erişebilmesidir; fonksiyon VM bayt koduna derlendiğinde bu değişkenler kullanılamaz.
IIFE ile sarmalanmış kod için önemli. En üst düzeydeki bir IIFE derinlerinde herhangi bir doğrudan eval içeriyorsa, IIFE'nin tamamı (tüm kodunuz dahil) VM ile obfuscate edilmez.
IIFE'yi açmanın bir bedeli vardır: fonksiyonlarınız en üst düzeye taşındığında yalnızca sorunlu fonksiyon atlanır, ancak geriye kalan fonksiyonlar artık kök düzeyindedir ve VM obfuscation bunların adlarını korur. Bu adları çıktının dışında tutmanın yolu için Fonksiyon Adlarını LLM Analizinden Gizleme sayfasına bakın.
(0, eval)(code) ve window.eval(code) gibi dolaylı biçimler VM obfuscation işlemini engellemez. eval?.(code) bir istisnadır: JavaScript bunu dolaylı eval olarak çalıştırır, ancak obfuscator onu ihtiyatlı biçimde doğrudan eval olarak ele alır ve fonksiyonu atlar.
Gövde argümanı dinamik olduğunda Function yapıcısı (new Function(body) / Function(body)) da aynı şekilde ele alınır. Dinamik bir new Function(...) çağrısı içeren bir fonksiyon da bir VMDynamicCodeSkipped uyarısıyla atlanır. Dinamik bir doğrudan eval'de olduğu gibi, çalışma zamanında oluşturulan gövde yeniden adlandırılmış tanımlayıcılara başvurabileceği için obfuscator bir DynamicCodeRenameRisk uyarısı da ekler. new Function('a', 'b', 'return a + b') gibi tamamen statik çağrılar atlanmaz.
Dolaylı eval ve Function yapıcısı global kapsamda çalışır. Çağıranın yerel değişkenlerini okuyamazlar, ancak yeniden adlandırılmış veya kaldırılmış global değişkenlere başvururlarsa yine de hata verebilirler. new Function('a', 'b', 'return a + b') gibi yalnızca kendi parametrelerini kullanan statik bir gövde bu bağımlılıktan kaçınır. Uyarıları inceleyin ve son paketi test edin; yalnızca eval söz dizimini değiştirmek, rastgele dinamik kodu güvenli hale getirmez.
Kaçış yolu (v6.14.0+): çevreleyen fonksiyonu yine de bayt koduna çevirmek ve VMDynamicCodeSkipped uyarısını bastırmak için vmForceCompileDynamicCode: true ayarlayın (veya VM bölümündeki Geçersiz Kılmalar grubunun altında Force Compile Dynamic Code anahtarını açın). Bu, kapsamı onaramaz: zorla derlenen bir fonksiyonun içinde doğrudan eval, kod bir string literal olsa bile fonksiyonun yerel değişkenlerini, parametrelerini veya sanallaştırılmış bir çevreleyen fonksiyonun değişkenlerini okuyamaz ve bunlara yazamaz. Bu seçeneği yalnızca değerlendirilen kod global değişkenler dışında hiçbir şeye başvurmadığında kullanın. Bu seçenek açıkken de DynamicCodeRenameRisk uyarısı üretilmeye devam eder, çünkü tarif ettiği yeniden adlandırma riski VM atlamasından bağımsızdır.
Eksiksiz matris, uyarı biçimleri ve geçici çözümler için eval ve new Function ile VM Obfuscation sayfasına bakın.
