热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

脱壳1

概述脱壳是一项综合技术,结合PE文件格式、汇编指令的分析,调试加密的程序并将其还原的一个过程。壳一般分为两种,加密壳和压缩壳,

概述

脱壳是一项综合技术,结合PE文件格式、汇编指令的分析,调试加密的程序并将其还 原的一个过程。

壳一般分为两种,加密壳和压缩壳,里面所使用的技术有,压缩算法、对代码加密、 对IAT加密、对资源加密。

我们从简单入手­压缩壳

关于压缩算法

  1. 有损压缩 一个像素点:RGB 红绿蓝 一个图片:(3,4,5),(4,5,3),(5,4,3) 压缩后:(4,4,4),3

  2. 无损压缩 一个文件:0,0,0,0,0,0,0 压缩后:0,7

脱壳三步法

  1. 寻找原始OE

  2. dump内存到文件

  3. 修复文件

脱壳三步法­寻址OEP技巧

  1. 堆栈平衡法(ESP定律) 壳代码就像一个函数,进入时会开辟堆栈、保存寄存器环境,退出时会恢复堆 栈、恢复寄存器。所以应该是堆栈平衡的,那我们可以在壳代码操作了堆栈后对 堆栈设置访问或写入断点,然后运行程序,当断点命中的时候,应该就是退出壳 代码的时候。在其附近单步几次,应该就能到达程序的原始OEP。

  2. 特征定位法 在我们熟悉的程序中,我们可以使用特征来定位程序原始OEP。特征有几种: ① 二进制特征 比如release版的VS2013是: E8????????E9 ② API特征 比如release版的VS2013的第一个API调用是: GetSystemTimeAsFileTime 比如vc6.0的第一个API调用是: GetVersion 比如Delphi程序第一个API调用是: GetModuleHandleA

  3. 单步跟踪法 这种方法一般使用在分析自己加壳的程序或者是练习分析壳时。

脱壳­0.aspack.exe

  1. 用010Editor把重定位关闭

  2. 寻址OEP ESP定律

  3. 跑到入口点的位置再dump

  4. dump内存

     

     

  1. 修复文件

 

 

RVA这个测试程序用的是0.

注意:如果程序有随机基址,脱壳后需要把随机基址标志位置0.

壳代码的基本流程

① 保存寄存器环境

② 加载一些必要的API

③ 解密代码和数据

④ 修复重定位

⑤ 填充IAT

⑥ 恢复寄存器环境

分析壳代码­0.aspack.exe

① 壳OEP

 

 

② 加载必要API

 

 

③ 解密解压缩代码

 

 

④ 修复重定位

 

 

修复重定位的公式:

重定位表中存储两个有用字段:

  1. 需要重定位的分页地址

  2. 需要重定位的分页偏移

    重定位分为两步:

  3. 计算出 重定位地址,要重定位的地址=模块基地址+分页地址+分页偏移

  4. 修复要重定位的地址中数据,[要重定位的地址] ­ 默认模块基地址 + 当前模块基 地址

  5. 填充IAT

    原理:

    ① 从导入表中获取dll名称

    ② 从导入表中的INT,获取函数名称或者序号 ③ 通过GetModuleHandleA或者LoadLibraryA获取模块基地址 通过GetProcAddress获取函数地址

    ④ 将函数地址填充到对应IAT数组中

001D726F 03F2 ADD ESI,EDX ; esi=导 入表结构
001D7271 8B46 0C MOV EAX,DWORD PTR DS:[ESI+0xC] ; 获取模 块DLL名称RVA
001D7274 85C0 TEST EAX,EAX
001D7276 0F84 0D010000 JE 00_aspac.001D7389
001D727C 03C2 ADD EAX,EDX ; 加上基 地址,字符串VA
001D727E 8BD8 MOV EBX,EAX
001D7280
50 PUSH EAX
001D7281 FF95 A90F0000 CALL DWORD PTR SS:[EBP+0xFA9] ; 获取模 块基地址
001D7287 85C0 TEST EAX,EAX
001D7289 75 07 JNZ SHORT 00_aspac.001D7292
001D728B
53 PUSH EBX
001D728C FF95 AD0F0000 CALL DWORD PTR SS:[EBP
+0xFAD]
001D7292 8985 A9050000 MOV DWORD PTR SS:[EBP+0x5A9],EAX ; 保存模 块基地址
001D7298 C785 AD050000>MOV DWORD PTR SS:[EBP+0x5AD],0x0
001D72A2 8B95 88040000 MOV EDX,DWORD PTR SS:[EBP+0x488] ; 获取基 地址
001D72A8 8B06 MOV EAX,DWORD PTR DS:[ESI] ; 获取指 向OrignalFirstThunk RVA
001D72AA 85C0 TEST EAX,EAX
001D72AC
75 03 JNZ SHORT 00_aspac.001D72B1
001D72AE 8B46 10 MOV EAX,DWORD PTR DS:[ESI+0x10]
001D72B1 03C2 ADD EAX,EDX ; 计算出 OrignalFirstThunk VA
001D72B3
0385 AD050000 ADD EAX,DWORD PTR SS:[EBP+0x5AD] ; 0
001D72B9 8B18 MOV EBX,DWORD PTR DS:[EAX] ; 获取 INT中的数据,即指向函数名称的 RVA
001D72BB 8B7E
10 MOV EDI,DWORD PTR DS:[ESI+0x10] ; 获取 FirstThunk
001D72BE 03FA ADD EDI,EDX ; 计算得 出 IAT 地址
001D72C0 03BD AD050000 ADD EDI,DWORD PTR SS:[EBP+0x5AD] ; 0
001D72C6 85DB TEST EBX,EBX ; 判断结 束
001D72C8 0F84 A5000000 JE 00_aspac.001D7373
001D72CE F7C3
00000080 TEST EBX,0x80000000 ; 判断是 否是序号
001D72D4 75 04 JNZ SHORT 00_aspac.001D72DA
001D72D6 03DA ADD EBX,EDX ; 指向函 数字符串结构=INT[i]+模块基地址
001D72D8
43 INC EBX ; 减去 2,跳过字符串结构的序号
001D72D9 43 INC EBX
001D72DA 53 PUSH EBX ; 保存寄 存器环境
001D72DB 81E3 FFFFFF7F AND EBX,0x7FFFFFFF
001D72E1 53 PUSH EBX ; 压入字 符串或是序号
001D72E2 FFB5 A9050000 PUSH DWORD PTR SS:[EBP+0x5A9]
001D72E8 FF95 A50F0000 CALL DWORD PTR SS:[EBP+0xFA5] ; 获取函 数地址
001D72EE 85C0 TEST EAX,EAX
001D72F0 5B POP EBX ; 恢复寄 存器环境

 

⑤ 修改属性,跳转原始OEP

 

 

转:https://www.cnblogs.com/ltyandy/p/11269928.html



推荐阅读
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
author-avatar
淑圣承琦9_416
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有