
مكتبة سويفت لأمان منصة iOS ومكافحة العبث
اطلع على دورتنا العملية والكامله عبر الإنترنت على: https://courses.securing.pl/courses/iase


🌏 iOS Security Suite هي مكتبة أمان منصة متقدمة وسهلة الاستخدام لمكافحة التلاعب، مكتوبة بلغة Swift النقية! إذا كنت تطور لتطبيقات iOS وتريد حماية تطبيقك وفقًا لمعيار OWASP MASVS، الفصل v8، فإن هذه المكتبة قد توفر لك الكثير من الوقت. 🚀
ما يكشفه ISS:
هناك 4 طرق يمكنك بها البدء في استخدام IOSSecuritySuite
أضف ملفات IOSSecuritySuite/*.swift إلى مشروعك
pod 'IOSSecuritySuite'
github "securing/IOSSecuritySuite"
.package(url: "https://github.com/securing/IOSSecuritySuite.git", from: "1.5.0")
بعد إضافة ISS إلى مشروعك، ستحتاج أيضًا إلى تحديث ملف Info.plist الرئيسي. يوجد فحص في وحدة كشف كسر الحماية يستخدم طريقة canOpenURL(_:) ويتطلب تحديد عناوين URL التي سيتم الاستعلام عنها.
<key>LSApplicationQueriesSchemes</key>
<array>
<string>undecimus</string>
<string>sileo</string>
<string>zbra</string>
<string>filza</string>
</array>
تحقق من ترخيص EULA الخاص بنا للحصول على التفاصيل.
TLDR: إذا كانت شركتك توظف:
إذا كنت ترغب في بيع وحدة تستخدم iOS Security Suite (لا تُستخدم مباشرة في تطبيقك) - 10000 يورو/السنة
iOS Security Suite مخصص للاستخدام على iOS/iPadOS. لا ينبغي استخدامه على أجهزة Mac بمعالجات Apple Silicon.
if IOSSecuritySuite.amIJailbroken() {
print("هذا الجهاز مكسور الحماية")
} else {
print("هذا الجهاز ليس مكسور الحماية")
}
let jailbreakStatus = IOSSecuritySuite.amIJailbrokenWithFailMessage()
if jailbreakStatus.jailbroken {
print("هذا الجهاز مكسور الحماية")
print("لأن: \(jailbreakStatus.failMessage)")
} else {
print("هذا الجهاز ليس مكسور الحماية")
}
failMessage هو نص يحتوي على مؤشرات مفصولة بفواصل كما هو موضح في المثال أدناه:
sileo:// تم اكتشاف مخطط URL، ملف مشبوه موجود: /Library/MobileSubstrate/MobileSubstrate.dylib، تمكن Fork من إنشاء عملية جديدة
let jailbreakStatus = IOSSecuritySuite.amIJailbrokenWithFailedChecks()
if jailbreakStatus.jailbroken {
if (jailbreakStatus.failedChecks.contains { $0.check == .existenceOfSuspiciousFiles }) && (jailbreakStatus.failedChecks.contains { $0.check == .suspiciousFilesCanBeOpened }) {
print("هذا جهاز مكسور الحماية حقيقي")
}
}
let amIDebugged: Bool = IOSSecuritySuite.amIDebugged()
IOSSecuritySuite.denyDebugger()
let runInEmulator: Bool = IOSSecuritySuite.amIRunInEmulator()
if IOSSecuritySuite.amIReverseEngineered() {
print("هذا الجهاز يحتوي على دليل على الهندسة العكسية")
} else {
print("هذا الجهاز لا يحتوي على دليل على الهندسة العكسية")
}
let reverseStatus = IOSSecuritySuite.amIReverseEngineeredWithFailedChecks()
if reverseStatus.reverseEngineered {
// تحقق من reverseStatus.failedChecks لمزيد من التفاصيل
}
يمكنك الآن أيضًا اكتشاف ما إذا كان التطبيق متصلاً بشبكة VPN
let amIProxied: Bool = IOSSecuritySuite.amIProxied(considerVPNConnectionAsProxy: true)
let amIInLockdownMode: Bool = IOSSecuritySuite.amIInLockdownMode()
let amIRuntimeHooked: Bool = amIRuntimeHook(dyldWhiteList: dylds, detectionClass: SomeClass.self, selector: #selector(SomeClass.someFunction), isClassMethod: false)
// إذا أردنا منع خطاف رمز لدالة Swift، يجب تمرير الاسم المُشَوَّه (mangled name) لتلك الدالة
denySymbolHook("$s10Foundation5NSLogyySS_s7CVarArg_pdtF") // منع خطاف الدالة NSLog
NSLog("Hello Symbol Hook")
denySymbolHook("abort")
abort()
// تعريف الدالة
func someFunction(takes: Int) -> Bool {
return false
}
// تعريف FunctionType : @convention(thin) يشير إلى مرجع دالة "رفيع" يستخدم اصطلاح استدعاء Swift بدون معاملات "self" أو "context" خاصة.
typealias FunctionType = @convention(thin) (Int) -> (Bool)
// الحصول على عنوان المؤشر للدالة التي نريد التحقق منها
func getSwiftFunctionAddr(_ function: @escaping FunctionType) -> UnsafeMutableRawPointer {
return unsafeBitCast(function, to: UnsafeMutableRawPointer.self)
}
let funcAddr = getSwiftFunctionAddr(someFunction)
let amIMSHooked = IOSSecuritySuite.amIMSHooked(funcAddr)
// تعريف الدالة
func denyDebugger(value: Int) {
}
// تعريف FunctionType : @convention(thin) يشير إلى مرجع دالة "رفيع"
typealias FunctionType = @convention(thin) (Int)->()
// الحصول على عنوان الدالة الأصلية
let funcDenyDebugger: FunctionType = denyDebugger
let funcAddr = unsafeBitCast(funcDenyDebugger, to: UnsafeMutableRawPointer.self)
if let originalDenyDebugger = denyMSHook(funcAddr) {
// استدعاء الدالة الأصلية مع 1337 كمعامل Int
unsafeBitCast(originalDenyDebugger, to: FunctionType.self)(1337)
} else {
denyDebugger()
}
// تحديد ما إذا كان التطبيق قد تم التلاعب به
if IOSSecuritySuite.amITampered([.bundleID("biz.securing.FrameworkClientApp"),
.mobileProvision("2976c70b56e9ae1e2c8e8b231bf6b0cff12bbbd0a593f21846d9a004dd181be3"),
.machO("IOSSecuritySuite", "6d8d460b9a4ee6c0f378e30f137cebaf2ce12bf31a2eef3729c36889158aa7fc")]).result {
print("لقد تم التلاعب بي.")
}
else {
print("لم يتم التلاعب بي.")
}
// التحقق يدويًا من قيمة تجزئة SHA256 لمكتبة dylib محملة
if let hashValue = IOSSecuritySuite.getMachOFileHashValue(.custom("IOSSecuritySuite")), hashValue == "6d8d460b9a4ee6c0f378e30f137cebaf2ce12bf31a2eef3729c36889158aa7fc" {
print("لم يتم التلاعب بي.")
}
else {
print("لقد تم التلاعب بي.")
}
// التحقق من قيمة تجزئة SHA256 للملف التنفيذي الرئيسي
// تلميح: يمكن لتطبيقك استرداد هذه القيمة من الخادم
if let hashValue = IOSSecuritySuite.getMachOFileHashValue(.default), hashValue == "your-application-executable-hash-value" {
print("لم يتم التلاعب بي.")
}
else {
print("لقد تم التلاعب بي.")
}
func denyDebugger() {
// ضع نقطة توقف هنا
}
typealias FunctionType = @convention(thin) ()->()
let func_denyDebugger: FunctionType = denyDebugger // `: FunctionType` ضروري
let func_addr = unsafeBitCast(func_denyDebugger, to: UnsafeMutableRawPointer.self)
let hasBreakpoint = IOSSecuritySuite.hasBreakpointAt(func_addr, functionSize: nil)
if hasBreakpoint {
print("تم العثور على نقطة توقف في الدالة المحددة")
} else {
print("لم يتم العثور على نقطة توقف في الدالة المحددة")
}
// ضع نقطة توقف في الدالة testWatchpoint
func testWatchpoint() -> Bool{
// lldb: watchpoint set expression ptr
var ptr = malloc(9)
// lldb: watchpoint set variable count
var count = 3
return IOSSecuritySuite.hasWatchpoint()
}
قبل استخدام هذه الأداة وغيرها من أدوات التحقق من أمان المنصة، يجب أن تفهم ما يلي:
نعم، من فضلك! إذا كانت لديك فكرة أفضل أو ترغب فقط في تحسين هذا المشروع، يرجى مراسلتي على Twitter أو LinkedIn. طلبات السحب (Pull requests) مرحب بها أكثر من أي وقت مضى!
canOpenURL(_:)amIJailbrokenWithFailedChecks()amIReverseEngineeredWithFailedChecks()راجع ملف LICENSE.
أثناء إنشاء هذه الأداة استخدمت: