freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

使用C#语言开发一个用于个人使用的APP信息和壳查询工具
2024-04-26 11:40:18

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

image

具体功能如下:

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

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

image

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

image

可以设计单一界面,也可以选择设计双界面,而我选择了设计两个界面。
image

分别是

image

image

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

image

如果是一个界面的话就不需要这个代码了,这个代码只是把用户选择的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);

差不多就是这些功能了,可能思路有点简单,调包然后再将信息渲染到页面,希望大佬们不要喷!!!

# android安全工具 # 开源安全工具 # app安全 # APP # APP加固
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者