Я написал простое приложение для обнаружения корней с использованием платформы Xamarin в Visual Studio 2019. Теперь я хочу перепроектировать выходной apk для академических целей, чтобы обойти механизм обнаружения корней. для этого я конвертировал файл classes.dex в jar и использовал jd-gui для чтения кода. но я не могу найти код, который я написал для обнаружения корня где-нибудь в файлах. Есть ли что-то еще, что я должен был сделать для достижения этой цели ?! чего мне не хватает ?! Вот код mainactivity.cs:
using Android.App;
using Android.OS;
using Android.Support.V7.App;
using Android.Runtime;
using Android.Widget;
namespace RootDetection
{
[Activity(Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher = true)]
public class MainActivity : AppCompatActivity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.activity_main);
Button button = FindViewById<Button>(Resource.Id.button1);
bool root = RootCheck.IsRoot();
button.Click += delegate
{
if (root)
Toast.MakeText(Application.Context, "The Device is Rooted!", ToastLength.Long).Show();
else
Toast.MakeText(Application.Context, "The Device is not Rooted.", ToastLength.Long).Show();
};
}
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
}
, а вот код класса RootCheck:
using System;
using Java.Lang;
using Process = Java.Lang.Process;
using System.Collections.Generic;
namespace RootDetection
{
public static class RootCheck
{
public static bool IsRoot()
{
bool retval = false;
Process suProcess;
try
{
suProcess = Runtime.GetRuntime().Exec("su");
var os = new Java.IO.BufferedWriter(new Java.IO.OutputStreamWriter(suProcess.OutputStream));
var osRes = new Java.IO.BufferedReader(new Java.IO.InputStreamReader(suProcess.InputStream));
if (null != os && null != osRes)
{
os.Write("id\n");
os.Flush();
string currUid = osRes.ReadLine();
bool exitSu = false;
if (null == currUid)
{
retval = false;
exitSu = false;
Console.WriteLine("Can't get root access or denied by user");
}
else if (true == currUid.Contains("uid=0"))
{
retval = true;
exitSu = true;
Console.WriteLine("Root access granted");
}
else
{
retval = false;
exitSu = true;
Console.WriteLine("Root access rejected: " + currUid);
}
if (exitSu)
{
os.Write("exit\n");
os.Flush();
}
}
}
catch (Java.Lang.Exception e)
{
retval = false;
Console.WriteLine("Root access rejected [" + e.Class.Name + "] : " + e.Message);
}
return retval;
}
}
}
Большое спасибо.