使用C#编程语言开发一个个人专用的APP信息和壳查询工具,首先展示一个已经完成的作品供大家参考。
具体功能如下:
- 查看包名称
- 查看APK版本
- 查看Target SDK版本
- 查看Min SDK版本
- 查看Version Code
- 查看MD5信息
- 查壳信息
- 快速安装到模拟器中
首先,我们将创建一个WinForm应用程序(对于更有经验的开发者,可以考虑使用WPF来获得更好的视觉效果,但考虑到我的经验水平,我将选择WinForm)。为了提升界面的美观度,我们可以利用NuGet包管理器安装SunnyUI。
在此处,可以借助SunnyUI来设计界面。
可以设计单一界面,也可以选择设计双界面,而我选择了设计两个界面。
分别是
先选择APK,可以使用第三方的nuget库来解析APK文件的一些信息。可以通过搜索"ApkParse"来找到相关的nuget包。
如果是一个界面的话就不需要这个代码了,这个代码只是把用户选择的apk路径传给第二个页面
OpenFileDialog dlg = new OpenFileDialog();
dlg.Filter = "Apk文件(*.apk)|*.apk|所有文件(*.*)|*.*";
if (dlg.ShowDialog(this) == DialogResult.OK)
{
Form form2 = new Form2(dlg.FileName);
this.Hide();
form2.Show();
}
第二个页面再拿到apk的值之后可以对apk进行解析并且渲染到窗体页面中,这里解析apk的一些基本信息的,主要是调用第三方的dll文件,这里可以自己去写但是非常麻烦,所以没有必要重复造轮子
ApkInfo apkinf = ApkParser.ApkParser.Parse(filename);
var a = apkinf.Icons;
//List<apkinf.Icons> parts = new List<apkinf.Icons>();
//List icons = apkinf.Icons;
Console.WriteLine(a);
string icon = apkinf.Icons.First().ToString();
// uiAvatar1.Image. = apkinf.Icons.First().ToString;
pictureBox1.ImageLocation = icon;
uiTextBox1.Text = apkinf.PackageName;
uiTextBox2.Text = apkinf.VersionName;
uiTextBox3.Text = apkinf.TargetSdkVersion.ToString();
uiTextBox4.Text = apkinf.MinSdkVersion.ToString();
uiTextBox5.Text = apkinf.VersionCode.ToString();
uiTextBox6.Text = getMD5ByMD5CryptoService(filename);
uiTextBox7.Text = filename;
uiTextBox8.Text = CheckApk(filename); ;
//uiAvatar1. = icon;
//Console.WriteLine(icon);
IList<string> icons = apkinf.Permissions;
这里查壳的核心代码,它使用ZipArchive类打开APK文件,并将APK文件中的所有文件名存储在一个列表中。然后,它遍历这个列表,对于每个文件名,它会尝试与字典中的键进行匹配。如果文件名包含某个特征字符串,则返回对应的加固厂商名称;否则,继续检查下一个文件名。如果所有文件名都没有匹配到任何特征字符串,则返回"该APK未加固或采用未知加固厂商\n"。
private Dictionary<string, string> features = new Dictionary<string, string>
{
{"libchaosvmp.so","娜迦"},
{"libddog.so","娜迦"},
{"libfdog.so","娜迦"},
{"libedog.so","娜迦企业版"},
{"libexec.so","爱加密"},
{"libexecmain.so","爱加密"},
{"ijiami.dat","爱加密"},
{"ijiami.ajm","爱加密企业版"},
{"libsecexe.so","梆梆免费版"},
{"libsecmain.so","梆梆免费版"},
{"libSecShell.so","梆梆免费版"},
{"libDexHelper.so","梆梆企业版"},
{"libDexHelper-x86.so","梆梆企业版"},
{"libprotectClass.so","360"},
{"libjiagu.so","360"},
{"libjiagu_art.so","360"},
{"libjiagu_x86.so","360"},
{"libegis.so","通付盾"},
{"libNSaferOnly.so","通付盾"},
{"libnqshield.so","网秦"},
{"libbaiduprotect.so","百度"},
{"aliprotect.dat","阿里聚安全"},
{"libsgmain.so","阿里聚安全"},
{"libsgsecuritybody.so","阿里聚安全"},
{"libmobisec.so","阿里聚安全"},
{"libtup.so","腾讯"},
{"libshell.so","腾讯"},
{"mix.dex","腾讯"},
{"lib/armeabi/mix.dex","腾讯"},
{"lib/armeabi/mixz.dex","腾讯"},
{"libtosprotection.armeabi.so","腾讯御安全"},
{"libtosprotection.armeabi-v7a.so","腾讯御安全"},
{"libtosprotection.x86.so","腾讯御安全"},
{"libnesec.so","网易易盾"},
{"libAPKProtect.so","APKProtect"},
{"libkwscmm.so","几维安全"},
{"libkwscr.so","几维安全"},
{"libkwslinker.so","几维安全"},
{"libx3g.so","顶像科技"},
{"libapssec.so","盛大"},
{"librsprotect.so","瑞星"}
};//定义字典以方便后续代码匹配
public string CheckApk(string apkPath)
{
using (ZipArchive zipFile = ZipFile.OpenRead(apkPath))
{
List<string> nameList = new List<string>(zipFile.Entries.Select(entry => entry.FullName));
foreach (string filename in nameList)
{
try
{
foreach (string shell in features.Keys)
{
if (filename.Contains(shell))
{
string shellType = features[shell];
return $"《 {shellType} 》加固";
}
}
}
catch
{
return "unknown";
}
}
}
return "该APK未加固或采用未知加固厂商\n";
}
以及查询MD5值的方法这里我将不做过度的展开,但是我把注释写到后面
public static string getMD5ByMD5CryptoService(string path)
{
if (!File.Exists(path)) return ""; // 检查文件是否存在,如果不存在则返回空字符串
FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read); // 创建一个文件流对象,以只读方式打开指定路径的文件
MD5CryptoServiceProvider md5Provider = new MD5CryptoServiceProvider(); // 创建一个MD5加密服务提供者对象
byte[] buffer = md5Provider.ComputeHash(fs); // 使用MD5加密服务提供者对象计算文件的哈希值,并将结果存储在字节数组中
string resule = BitConverter.ToString(buffer); // 将字节数组转换为十六进制字符串表示形式
md5Provider.Clear(); // 清除MD5加密服务提供者对象的内部状态
fs.Close(); // 关闭文件流
return resule; // 返回计算得到的MD5哈希值的十六进制字符串表示形式
}
安装到主流的模拟器中,需要将adb的路径写到代码中,这个函数接受一个字符串参数command
用来执行的ADB命令。在方法内部,首先定义了一个字符串变量adbPath
,主要是为了指定ADB可执行文件的路径。这里需要将该路径替换为你自己的ADB路径(也可以直接放个adb到程序的相对路径中直接调用)。接下来,创建了一个ProcessStartInfo
对象startInfo
,用于设置启动进程时的配置信息。通过设置startInfo
的属性,可以指定要执行的命令、参数以及一些其他选项。然后,创建一个Process
对象process
,startInfo
赋值给它的StartInfo
属性。这样process
对象就包含了要执行的命令和配置信息。我们调用process.Start()
方法来启动进程,并执行指定的ADB命令。为了能够获取到命令的输出结果,使用process.StandardOutput.ReadToEnd()
方法读取进程的标准输出流,并将其存储在字符串变量output
中。
最后,调用process.WaitForExit()
方法等待进程执行完成,并将返回结果。
public string ExecuteAdbCommand(string command)
{
string adbPath = "./Extensions/adb/adb.exe"; // 替换为你的adb路径
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = adbPath;
startInfo.Arguments = command;
startInfo.RedirectStandardOutput = true;
startInfo.UseShellExecute = false;
startInfo.CreateNoWindow = true;
Process process = new Process();
process.StartInfo = startInfo;
process.Start();
string output = process.StandardOutput.ReadToEnd();
process.WaitForExit();
return output;
}
然后将主流的模拟器端口写入,这里也可以先查询端口在进行连接,(这段代码非常简单就是使用adb去连接常见的模拟器端口可以不使用CW直接用ExecuteAdbCommand函数进行连接即可)
```c#
Console.WriteLine(ExecuteAdbCommand("connect 127.0.0.1:7555"));
Console.WriteLine(ExecuteAdbCommand("connect 127.0.0.1:62001"));
Console.WriteLine(ExecuteAdbCommand("connect 127.0.0.1:21503"));
Console.WriteLine(ExecuteAdbCommand("connect 127.0.0.1:6555"));
Console.WriteLine(ExecuteAdbCommand("connect 127.0.0.1:26744"));
Console.WriteLine(ExecuteAdbCommand("devices -l"));
ExecuteAdbCommands("devices -l", comboBox1);
差不多就是这些功能了,可能思路有点简单,调包然后再将信息渲染到页面,希望大佬们不要喷!!!
4A评测 - 免责申明
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!
程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。
侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)