使用C#语言开发一个用于个人使用的APP信息和壳查询工具

2024-05-12 537 0

使用C#编程语言开发一个个人专用的APP信息和壳查询工具,首先展示一个已经完成的作品供大家参考。

使用C#语言开发一个用于个人使用的APP信息和壳查询工具插图

具体功能如下:

  • 查看包名称
  • 查看APK版本
  • 查看Target SDK版本
  • 查看Min SDK版本
  • 查看Version Code
  • 查看MD5信息
  • 查壳信息
  • 快速安装到模拟器中

首先,我们将创建一个WinForm应用程序(对于更有经验的开发者,可以考虑使用WPF来获得更好的视觉效果,但考虑到我的经验水平,我将选择WinForm)。为了提升界面的美观度,我们可以利用NuGet包管理器安装SunnyUI。

使用C#语言开发一个用于个人使用的APP信息和壳查询工具插图1

在此处,可以借助SunnyUI来设计界面。

使用C#语言开发一个用于个人使用的APP信息和壳查询工具插图2

可以设计单一界面,也可以选择设计双界面,而我选择了设计两个界面。
使用C#语言开发一个用于个人使用的APP信息和壳查询工具插图3

分别是

使用C#语言开发一个用于个人使用的APP信息和壳查询工具插图4

使用C#语言开发一个用于个人使用的APP信息和壳查询工具插图5

先选择APK,可以使用第三方的nuget库来解析APK文件的一些信息。可以通过搜索"ApkParse"来找到相关的nuget包。

使用C#语言开发一个用于个人使用的APP信息和壳查询工具插图6

如果是一个界面的话就不需要这个代码了,这个代码只是把用户选择的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对象processstartInfo赋值给它的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(#换成@)

相关文章

苹果试图保护你的隐私,OpenAI可能做不到
Shuffle:一款完全自动化的安全栈增强平台
如何使用CODASM编码Payload并降低熵值
SessionExec:一款针对会话安全的安全命令测试工具
Arkime:一款大规模数据包捕获和索引数据库系统
从蓝队流量角度分析Shiro-550反序列化漏洞

发布评论