شناسه:
RWX_MEMORY_REGIONSدسته: هوکها و یکپارچگی فرایند وضعیت در RKNHardering 2.10.0: بررسی فعال نقش در حکم نهایی: پایین
این صفحه پیادهسازی واقعی RKNHardering 2.10.0 را توضیح میدهد. در آن مشخص شده است چه اقدامهایی بدون روت ممکناند، چه چیزهایی به روت نیاز دارند و کدام راهکار فقط یک سیگنال را کاهش میدهد، بیآنکه VPN را بهطور کامل پنهان کند.
کد C++ هنگام خواندن /proc/self/maps نگاشتهایی را میشمارد که همزمان مجوز rwx دارند و اندازهٔ آنها دستکم ۲۵۶ کیبیبایت است. اگر حداقل یک مورد وجود داشته باشد، شمارندهٔ rwx_large را گزارش میکند؛ Kotlin آن را بهصورت دادهٔ اطلاعرسان با اطمینان پایین نمایش میدهد.
یک یا چند ناحیه با اندازهٔ دستکم ۲۵۶ کیبیبایت همزمان قابل نوشتن و اجرا باشند.
این وضعیت میتواند ناشی از کامپایل JIT، وصلهکردن زمان اجرا یا ابزارگذاری باشد، اما اثبات هیچکدام نیست. در نسخهٔ فعلی، این خط یافتهٔ بازبینی ایجاد نمیکند و مقدار detected را تغییر نمیدهد.
تأثیر این خط بر گزارش: این خط اطلاعاتی یا تشخیصی است. برای مقایسهٔ اجراها مفید است، اما بهتنهایی وجود VPN یا دستکاری را ثابت نمیکند.
ART/JIT، بازیها، WebView، شبیهسازها و موتورهای مشروع ممکن است از نگاشتهای RWX یا نگاشتهای گذرا استفاده کنند. بررسی طول عمر آنها را ثبت نمیکند و از محتوایشان هش نمیگیرد.
این خط باید همراه با سیگنالهای مجاور ارزیابی شود. پاکبودن نتیجهٔ یک API بهتنهایی Java Binder، libc، netlink خام/فراخوانی مستقیم سامانه، procfs/sysfs، سوکتهای محلی و نشانههای سمت سرور را همزمان پوشش نمیدهد.
بدون روت، بهترین گزینه استفاده از APK پاک و دریافتشده از منبع مورداعتماد است؛ بدون بستهبندی مجدد، LSPatch، Frida Gadget، مجازیسازی یا Xposed بدون روت. انتقال برنامه به «فضای دوم» فرایند آن را خودکار پاک نمیکند: کانتینر ممکن است کتابخانههای خودش را تزریق کند و ناسازگاریهای بیشتری باقی بگذارد. اگر سیگنال با APK پاک ظاهر شد، آزمون را پس از راهاندازی سرد و بدون بازکردن WebView یا صفحهای سنگین تکرار کنید؛ ممکن است فعالیت عادی JIT باشد.
با دسترسی روت، برنامهٔ هدف را در دامنهٔ Xposed/Vector قرار ندهید و ماژول Zygisk را بیدلیل داخل آن بار نکنید. برای پنهانسازی VPN، معماریای را ترجیح دهید که پالایش Java در system_server و پالایش بومی در هسته انجام شود. DenyList/App Profile، NoHello، Zygisk Next، SUSFS و ابزارهای مشابه ممکن است برخی ردها را کاهش دهند، اما هیچکدام حفاظت همزمان در برابر بررسیهای maps، linker، mount و syscall خام را تضمین نمیکنند. فقط برای حذف یک خط، JIT را با propertyهای سیستم غیرفعال نکنید؛ این کار عملکرد را کاهش میدهد و سایر نشانههای هوک را از بین نمیبرد.
# فقط برای build قابل اشکالزدایی:
adb shell run-as com.notcvnt.rknhardering cat /proc/self/maps | grep -E '^[0-9a-f]+-[0-9a-f]+ rwx'
بازهٔ نشانی و اندازه را مقایسه کنید. در build انتشار، به خط داخلی برنامه تکیه کنید.
پس از هر تغییر، RKNHardering و سرویسگیرندهٔ VPN را بهاجبار متوقف کنید، هر دو را دوباره اجرا کنید و اسکن کامل را تکرار کنید. Zygisk، Xposed و ماژولهای هسته معمولاً به راهاندازی مجدد دستگاه نیاز دارند. فقط همین خط را مقایسه نکنید؛ سیگنالهای مجاور را نیز بررسی کنید، زیرا یک هوک ناقص اغلب میان APIها ناسازگاری ایجاد میکند.
خود پروب با مجوزهای معمول برنامه اجرا میشود و روت درخواست نمیکند. دستورهای ADB زیر فقط برای جهتیابی تشخیصیاند: adb shell با UID دیگری اجرا میشود و ممکن است نسبت به فرایند برنامه اطلاعات بیشتر یا کمتری ببیند. آزمون تعیینکننده، اجرای دوبارهٔ بررسی درون برنامه پس از توقف اجباری است.
تلاش برای تغییر مجوزهای حافظه با ماژول شخص ثالث ممکن است باعث crash شود و اصل W^X را نقض کند. فهرست کامل maps را بدون حذف اطلاعات حساس منتشر نکنید.
آخرین تغییر را برگردانید: ماژول یا قاعدهٔ افزودهشده را با مدیر معمول خودش غیرفعال کنید، دستگاه را دوباره راهاندازی کنید و اسکن خط مبنا را تکرار کنید. روی وضعیتی ناشناخته هوک دیگری لایه نکنید.
پایین. آستانهٔ ۲۵۶ کیبیبایتی در nativeReadSelfMapsSummary() راستیآزمایی شده است؛ بررسیکننده عمداً این خط را صرفاً اطلاعرسان میداند.
وضعیت یک راهکار شخص ثالث خودبهخود به این دستگاه تعمیم پیدا نمیکند. ادعای سازندهٔ ماژول فقط فرضیهٔ آغازین است؛ تأیید واقعی به نتیجهای تکرارپذیر از RKNHardering روی همان نسخهٔ Android، میانافزار و هسته نیاز دارد.
native_signs_probe.cpp — پیادهسازی پروب بومی.NativeSignsChecker.kt — منطق اصلی حکم بومی/قدیمی.NativeSignalId.kt — رجیستری کامل شناسهها.NativeSignalCatalog.kt — نگاشت دسته، slug و خط خروجی.سیگنالهای مرتبط: hook-markers, library-integrity.