您的位置  > 互联网

看雪学院阎文斌:写保护壳的原理与流行趋势

在2016年XPwn未来安全探索活动上,黑客团队攻击了国内20家银行向消费者提供的20款基于的手机银行应用程序,发现了17家银行的应用程序存在漏洞。 一旦被黑,无论转账给“张三”还是“李四”,只要输入正确的账号和密码,钱最终都会转给“王五”。

只要你敢拿出自己的App,北京纳迦信息技术发展有限公司CTO、国内著名安全论坛“看学学院”版主严文斌就敢给它一个机会。尝试捕捉你看似严格的安全措施。 一座严密的“堡垒”。

严文斌非常了解App的薄弱环节。 正是因为他对攻击手段了如指掌,所以他才想研究一下如何给App披甲,去明里暗里攻击的战场。

本期雷锋网摘客频道邀请颜文斌上一堂线上硬创公开课,讲原生保护壳的原理和实现、流行趋势等。

嘉宾介绍

颜文斌现任北京纳迦信息技术发展有限公司CTO,是国内著名安全论坛“看学学院”版主。 具有深厚的安全领域背景,长期研究计算机病毒和软件防护技术,并深度涉足密码学领域研究。 。 曾负责国家信息技术安全研究中心多项网络安全相关项目,参与多个政府网站的风险评估工作。 此外,颜文斌连续多年在XCon会议上发表安全演讲。

以下为公开课总结实录+视频。 在不妨碍原意表达的情况下,雷锋网编辑对文字稿稍作整理和修改:

我是北京纳迦信息的严文斌。 由于编写保护壳是一个完整的过程,因此首先要熟悉目标文件格式。 本次公开课时长只有90分钟。 我会把大部分精力放在ELF文件结构的普及上。 。 其实,只要了解了文件格式,编写保护壳就是水到渠成的过程。 在课程中,我们将讨论一些文件结构特性在保护中的使用。 课程中会结合Naga产品的代码进行讲解。

本课有四个部分。 首先介绍一下目前流行的原生程序保护技术。 其次,我们来详细谈谈ELF文件。 ELF文件与保护壳的实现相关。 第三,系统是Linux如何加载so的过程。 这部分直接放置原代码。 四、如何写软件保护壳,以我们的产品为例。

目前我们流行的原生保护技术有三种:第一个是直接加密SO,第二个是用自定义加载器加载,第三个是使用软件保护壳技术。

首先是直接加密文件的基本原理。 很简单,很粗暴,没有什么技术含量。 因为so文件是dex文件通过load等函数加载的,所以直接对so文件进行加密,写入一些解密代码和密钥到dex中。

在这个地方解密SO,或者在其他地方解密SO,没有限制,只要在SO加载之前解密即可。 其实方法有很多,最粗暴的就是直接写到代理里,这样最省事。 却是最无耻的事。 如果你稍微良心一点,还可以hook函数的类型,即加载so类型的函数,并在里面做一些解密操作。 这是一种更加认真的做法。

直接加密so文件,dex代理启动后解密so文件。 这是一种粗暴且具有欺骗性的保护形式。 这种类型实现起来太容易了,没有什么技术含量,但是现在很多厂家都在使用。

无论是自己模拟加载器,加载SO,还是制作SO保护壳,这两种方法都有技术成本,需要调试,非常麻烦。 不过,上述无良操作虽然很简单,但却有一个好处——可以通过测试。 目前的测试机构在测试程序时,特殊的任务之一就是对其进行测试。 如此测试,其实很难区分是否有包装。 只有一些严格的标准需要匹配。

例如,一个ELF文件加壳后,实际上仍然是一个ELF文件。 可以直接单独调用。 但是,文件直接加密后就不再是ELF文件了。 有些自动保护系统和检测系统会发现你有一个ELF文件,它会报告它可以被反汇编,所以我认为这是欺骗性的。

二是定制装载机的技术原理。 这是几个好的防护加工厂家常用的方法。 实现起来比脱壳难度要小一些。 这项技术可以达到一定程度的防护。 原理 是一种模拟ELF文件格式的加载方式。 这个受保护的so程序可以用它自己的程序识别的文件格式替换。 所以组成的ELF的符号表、重定位表等自分段代码都可以提取出来定义成自己的格式,只留下它的代码片段保存为文件,文件也可以加密。 然后hook出dlsym、dlsym等函数,因为需要对这两个函数做一些hook或者劫持。 无论钩子操作在哪一层执行,JNI函数也是如此。 当dex调动反向JNI函数时,就会调用java。 C语言中的load是直接调用的,然后再做一遍,所以在这个hook操作中,你会实现自己的加载操作,加载自己的格式。

另外,hook dlsym是因为dex获取进程的时候,或者有的程序员直接使用dlsym自己,自己的so,有一些这样的实现,所以必须hook到dlsym,因为它已经不是ELF文件了。 ,所以你需要自己实现一套查找符号的流程。 这是基本原则。 这个原理实现起来很简单,因为它是开源的,你可以直接拉出它的链接,修改它,修改成任何东西,然后包含在你自己的程序中。

第三种技术是软件保护壳技术。 这是一种比较正统的软件保护技术,已经存在很长时间了。 其原理是:外壳代码像病毒一样附加到文件上,对文件代码进行加密,修改入口点,然后到达保护壳时,先启动保护壳代码。 程序启动后,首先跳转到保护壳程序中,在这里可以进行任何操作,比如加密解密操作,包括一些逆向操作等。最后,shell继续解密目标代码,跳转到目标代码。 它的基本原理是这样的。 如果只是进行加密解密操作,这个shell的防护强度还是很低的。 在防护时代,有很多威力非常大的炮弹,其中使用了很多科技。 它们不仅对外壳本身进行加密和解密操作,因为外壳的引导部分仅起到引导作用,但其真正的保护代码和目标代码是混合在一起的。

什么是 .elf 文件?

当我们编写程序时,有两部分,一是dex文件,二是so文件。 dex文件本身是用java编写的,就是将java代码编译成虚拟机的代码。 这个承载虚拟机本身的东西是一种文件格式,是自己实现的,叫做dex。 这部分ELF文件是用C编写的,并编译成so文件。 这部分遵循一个开放协议标准,这个标准就是ELF。 它是一个行业标准,基本上在所有poxis标准中得到执行。 只要操作系统覆盖了这个标准,ELF就被用作API文件的接口。 这就是ELF的介绍。 如果你想写一个软件保护壳,就必须对其结构有充分的了解。

接下来我们来谈谈ELF文件格式。 共有六章,第一,简单介绍ELF,第二,整体结构介绍,第三,讲一下表头,第四,节表的作用,第五,段表,第六,动态段。

我想使用这三个工具来提供帮助。 它的功能是解析ELF文件格式,因为它是一个格式浏览器。 反汇编目标并观察目标二进制代码。

ELF的基本介绍摘自百度百科:在计算机科学中,它是一种用于二进制文件、可执行文件、目标代码、共享库和核心转储的格式文件。 它是由 UNIX 系统实验室 (USL) 作为应用程序二进制接口 (ABI) 开发和发布的,是 Linux 的主要可执行文件格式。

那我们现在就来做一些实验(雷锋网(公众号:雷锋网)编者注:涉及到视频演示,以下部分不再整理,请读者自行结合PPT观看视频)。

现场视频

原生保护壳原理及实现 | 艰苦创新公开课_腾讯视频