A React Native module for identifying jail-broken, rooted, or mock locations on iOS and Android
npm install react-native-pvt-jail-monkeyjavascript
import JailMonkey from 'react-native-pvt-jail-monkey'//debug - if true will skips all validations
//checkEmulator - check for simulator and emulator
//keyStoreSignature - [Android only] check signing signature of the install apk (SHA1 format)
let params = {debug:false,checkEmulator:false,keyStoreSignature:"5E:8F:16:206:2E:A3:CD:2C:4A:0D:54:78:76:BA:A6:F3:8C:AB:F6:25"}
//custom method with all security checking
JailMonkey.isSafe(params).then(()=>{
// is not rooted/jailbreak/emulator/simulator
},()=>{
// is rooted/jailbreak/emulator/simulator)
})
JailMonkey.externalCheck({
"magisk": true, //android only
'isRunningOnMac': true, //ios only
'isJb': true, //ios only
'isInjectedWithDynamicLibrary': true, //ios only
'isSecurityCheckPassed': true, //ios only
'isDebugged':true, //ios only
'isFromAppStore':true //ios only
}).then((ok) => {
console.log("safe device")
}, ({ code, message }) => {
// {"code":"error","message":"magisk"}
console.log("error", JSON.stringify(message))
})
`
keystore signature check command
use SHA1 format
`bash
keytool -list -v -keystore
`
IOS Setup
prerequisite content hide when minimize
`
//in appDelegate.m#import
- (void)applicationWillResignActive:(UIApplication *)application{
[JailMonkey showSecureScreen:[self window]];
}
- (void)applicationDidBecomeActive:(UIApplication *)application{
[JailMonkey hideSecureScreen:[self window]];
}
`API
Method | Returns | Description
---|---|---
isJailBroken | boolean | is this device jail-broken/rooted.
canMockLocation | boolean | Can this device fake its GPS location.
trustFall | boolean | Checks if the device violates either isJailBroken or canMockLocation.
isDebuggedMode | Promise | Is the application is running in debug mode. Note that this method returns a Promise.
isSafe | Promise | [Custom methood] custom method with all security checking
secureScreen | void | [Custom methood] enable minimize content hiding (note: android will also disallow screenshot in this mode)
unSecureScreen | void | [Custom methood] disable minimize content hiding Android Only APIs
Method | Returns | Description
---|---|---
hookDetected | boolean | Detects if there is any suspicious installed applications.
isOnExternalStorage | boolean | Is the application running on external storage (ie. SD Card)
AdbEnabled | boolean | Is Android Debug Bridge enabled.
isDevelopmentSettingsMode | Promise | Whether user has enabled development settings on their device. Note that this method returns a Promise.On iOS all of the Android only methods will return
false or Promise where appropriate.$3
Install
`bash
npm i jail-monkey --save
react-native link # Not required as of React Native 0.60.0
cd ios/
pod install #ios will need pod install to link
`If you use
rnpm, you may have trouble as rnpm does not link Android properly after 0.29.0!Note: On Android you should include
location.isFromMockProvider() from your location provider to compliment JailMonkey.canMockLocation()`. Most react-native location libraries already have this check built inSpecial thanks to this fantastic blog article: http://blog.geomoby.com/2015/01/25/how-to-avoid-getting-your-location-based-app-spoofed/