脱壳之简单加密壳

article/2025/9/17 6:32:11

一、简单分析与解密

  脱壳最重要的三步:找原始OEP,转存文件,修复文件
  压缩壳按照这三步就可以完成脱壳,而加密壳因为对PE文件的信息进行了加密处理,找到OEP只是刚开始,还需要将加密之后的代码、数据进行还原才能够完成脱壳
  注:遇到未知壳最通用的办法还是单步跟踪,将程序载入OD,到达OEP
1.找OEP
  先看代码段,查看IAT调用的opcode, 是FF15还是FF25, FF15就是VS程序,FF25就是宝蓝公司的程序。
在这里插入图片描述
再看链接器版本,6.0,可以确定是VC6.0
在这里插入图片描述
所以调试程序,设置api断点GetVersion和GetSystemTimeAsFileTime,等断到主模块调用时栈回溯,找到OEP
在这里插入图片描述
在这里插入图片描述
往上找一下就能找到OEP
在这里插入图片描述
2.进入CALL简单分析一下,一堆花指令,简单NOP大法一下
在这里插入图片描述
在这里插入图片描述
由于JMP都是往下跳,没有跳到其他地方,这部分的代码都是向下运行,故将JMP都NOP掉,化简代码部分
在这里插入图片描述
最终化简代码

032B000A    B8 5B00E260     MOV EAX,0x60E2005B    ;加密的值
032B0012    35 15151515     XOR EAX,0x15151515     ;还原IAT函数
032B001A    50              PUSH EAX              ;将函数压入堆栈
032B001F    C3              RETN                  ;返回真正的IAT函数

3.因为此处的IAT都已经加密了,所以我们需要进行解密
选中地址并在数据窗口中跟随
在这里插入图片描述
因为此处IAT是动态的获取一个地址再填充进去的,所以我们下一个硬件写入断点
在这里插入图片描述
程序断下,我们发现有一个eax赋值给[edi]的操作,查看一下eax和edi
在这里插入图片描述
在这里插入图片描述
分析上段代码,发现并没有对EAX的操作,都是对EAX指向内容的操作,所以EAX应该来源于VirtualAlloc的返回值
在这里插入图片描述
再向上分析,找到了GetProcAddress
在这里插入图片描述
5.解密IAT
①NOP很多代码,保留未知操作部分与填充IAT部分即可
在这里插入图片描述

004385B9    FF15 CC924300   CALL DWORD PTR DS:[0x4392CC]
004385BF    90              NOP
004385C0    90              NOP
004385C1    90              NOP
004385C2    90              NOP
004385C3    90              NOP
004385C4    90              NOP
004385C5    90              NOP
004385C6    90              NOP
004385C7    90              NOP
004385C8    90              NOP
004385C9    90              NOP
004385CA    90              NOP
004385CB    90              NOP
004385CC    90              NOP
004385CD    90              NOP
004385CE    90              NOP
004385CF    90              NOP
004385D0    90              NOP
004385D1    90              NOP
004385D2    90              NOP
004385D3    90              NOP
004385D4    90              NOP
004385D5    90              NOP
004385D6    90              NOP
004385D7    90              NOP
004385D8    90              NOP                                      ; 拷贝16字节到xmm0
004385D9    90              NOP
004385DA    90              NOP
004385DB    90              NOP
004385DC    90              NOP
004385DD    8B55 CC         MOV EDX,DWORD PTR SS:[EBP-0x34]
004385E0    90              NOP                                      ; 填充16个字节到[eax]
004385E1    90              NOP
004385E2    90              NOP
004385E3    90              NOP
004385E4    90              NOP                                      ; 拷贝16字节到xmm0
004385E5    90              NOP
004385E6    90              NOP
004385E7    90              NOP
004385E8    90              NOP
004385E9    90              NOP                                      ; 填充16个字节到[eax+0x10]
004385EA    90              NOP
004385EB    90              NOP
004385EC    90              NOP
004385ED    90              NOP
004385EE    8907            MOV DWORD PTR DS:[EDI],EAX               ; 填充IAT

②NOP异或部分,直接填充IAT
在这里插入图片描述

修改
004385C8      8907        MOV DWORD PTR DS:[EDI],EAX
004385CA      90          NOP
004385CB      90          NOP
004385CC      90          NOP
修改
004385EE      90          NOP                                      ; 填充IAT
004385EF      90          NOP

③手工填充IAT
在获取IAT和填充IAT的位置分别下断点
在这里插入图片描述
程序运行之后,手工将未加密的IAT复制到加密填充的位置
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
成功手工修复一个地址
在这里插入图片描述
④使用通用脚本修复IAT,原理与③相同
在这里插入图片描述

// 1.定义变量
MOV dwOEP,00409486
MOV dwGetAPI,004385BF
MOV dwWriteIAT,004385F0 // 2. 清除环境
BC    // 清除所有软件断点
BPHWC // 清除所有硬件断点
BPMC  // 清除内存断点// 3. 设置断点
BPHWS dwOEP, "x" //当执行到此地址时产生中断.
BPHWS dwGetAPI, "x" //当执行到此地址时产生中断.
BPHWS dwWriteIAT, "x" //当执行到此地址时产生中断.// 4. 循环
LOOP0:RUN // F9  CMP dwGetAPI,eip  JNZ CASE1  MOV dwTMP,eaxJMP LOOP0
CASE1:CMP dwWriteIAT,eip    JNZ CASE2MOV [edi],dwTMPJMP LOOP0
CASE2:CMP dwOEP,eip  JNZ LOOP0  MSG "已到达OEP"

脚本运行完成后务必ESC一下!!

⑤使用特定脚本修复IAT,原理与②相同
在这里插入图片描述

// 1.定义变量
MOV dwOEP,00409486
MOV dwPatch1,004385C8 
MOV dwPatch2,004385EE // 2. 清除环境
BC    // 清除所有软件断点
BPHWC // 清除所有硬件断点
BPMC  // 清除内存断点// 3. 设置断点
BPHWS dwOEP, "x" //当执行到此地址时产生中断.
BPHWS dwPatch1, "x" //当执行到此地址时产生中断.// 4. 循环
LOOP0:RUN // F9  CMP dwPatch1,eip  JNZ CASE1  FILL dwPatch1,5,90           //NOP 5个字节    ASM dwPatch1,"MOV DWORD PTR DS:[EDI],EAX" //将当前指令修改为 MOV DWORD PTR DS:[EDI],EAXFILL dwPatch2,2,90    BPHWC dwPatch1JMP LOOP0
CASE1:CMP dwOEP,eip  JNZ LOOP0  MSG "OEP已到达"

6.DUMP完成脱壳
在这里插入图片描述

二.单步跟踪分析

  先回到程序入口点,看第一个CALL,00438456处调用了004383A0,观察发现并没有入栈操作,故没有参数,而调用完后,返回值EAX没有被使用,可知这个CALL没有参数也没有返回值,所以这个CALL在C语言中的函数原型应为void fun(void),进入这个CALL,大致查看其功能,发现有对FS寄存器的操作代码
在这里插入图片描述
在这里插入图片描述
  访问FS寄存器一般是访问线程TEB以及PEB结构体,再加上获取kernel32基址的话需要访问PEB结构体中的模块链表。继续向下分析,发现有函数名称的字符串注释,包括LoadLibraryA、GetModuleHandleA、VirtualProyect等函数名,再查看调用call和全局变量的值,发现均为0,所以当执行到访问全局变量和调用时已经初始化了。
在这里插入图片描述
  所以可以推测出此函数就是初始化函数地址的函数
  单步步过483A0这个CALL,查看CALL内的全局变量,观察初始化后的值,可以看到初始化了一些函数地址
在这里插入图片描述
在438040地址内存中存放的是400000,即映像基址
在这里插入图片描述
在438044地址内存中存放的是1000,即代码RVA
在这里插入图片描述
继续向下分析,发现两处VirtualProtect的调用,观察两处调用的参数
在这里插入图片描述
第一处VirtualProtect修改的地址是401000,即代码段基址,修改的属性为可读可写可执行,故猜测下面会有写入代码的操作,而第二次VirtualProtect调用之前,只有CALL 438290 ,猜测其中有修改代码段的代码
在这里插入图片描述
先查看一下代码段代码
在这里插入图片描述
单步步过这个CALL,发现代码段被修改了,恢复为正常代码
在这里插入图片描述
故猜测这个CALL内部应该是执行了解密代码段的操作,回车进去简单分析一下
可以很明显的发现与0x15的异或操作,故此处CALL的功能就是解密代码段
在这里插入图片描述
继续分析第二处VirtualProtect,修改的属性为可读可执行,故此处是恢复代码段的内存属性
在这里插入图片描述
再向下分析,是信息框的弹出以及对信息框返回值的判断,发现CALL 4384E0再信息框确定之后才会执行源程序代码
在这里插入图片描述
在MessageBoxA下面的代码,除了条件判断就是一个CALL一个JMP,还是退出进程的函数,而且本程序的映像基址是400000,不需要重定位,剩下的只有修复IAT了
而CALL后面的JMP多半就是跳转到原始OEP的,看一下JMP的地址,为409486,查看409486,一看就知道是VC6.0或者易语言的程序入口
在这里插入图片描述
在这里插入图片描述
再查看一下这个地址所在的区段,是第一个区段,基本上就能确定是原始OEP
在这里插入图片描述
加密IAT的大致逻辑:
  1.在局部变量中保存了一段shellcode代码
  2.使用GetProcAddress获取函数地址,加密处理,保存到局部变量中
  3.申请内存,将局部变量准备好的代码拷贝到申请的内存中
  4.将申请内存的首地址填充到IAT
而破解加密IAT的方法就是将未加密的函数地址填充到IAT即可


http://chatgpt.dhexx.cn/article/oGGqTJjL.shtml

相关文章

iOS完美脱壳

iOS端IPA脱壳 背景:在软件安全领域中,我们与黑产做对抗时,不是被动防守,自己也可以做攻击方,来验证我方软件是否安全。 关于iOS端逆向分析如:虚拟定位、虚拟设备、修改内存等,始终离不开脱壳。…

脱壳工具:Youpk的使用详解

一. Youpk概述 Youpk基于ART的主动调用的脱壳机,主要针对dex整体加固和各式各样的dex抽取加固。 目前 Youpk 只支持 pixel 1代。所以必须需要 pixel 1代手机,而且需要刷入对应的系统。 Youpk可以处理大部分的加固,一些企业版的加固也能处理…

使用upx脱壳工具脱壳

使用upx脱壳工具脱壳(攻防世界新手第七题为例simple-unpack) 查壳工具链接:https://www.52pojie.cn/thread-437586-1-1.html 脱壳工具链接:https://github.com/upx/upx/releases 先查壳 一般做到逆向的部分题的时候&#xff0c…

脱壳工具:反射大师的使用详解

一. 反射大师概述 一个脱壳插件工具,需要在 Xposed 环境中使用,支持市面上大多数加密壳。 反射大师简单容易使用,能脱掉大多数壳,很值得使用 二. 下载Xposed和反射大师 Xposed ,一款可以在不修改 Android APK 的情…

逆向工具之脱壳神器反射大师(附脱壳环境搭建、脱壳实战)

相信点击进入这篇博客的小伙伴都知道并且搞过App逆向,不过有时候会遇到各种加壳的App,不让你反编译。但是道高一尺,魔高一丈,有正向加密,就有逆向解密。此篇博客博主带大家搭建脱壳环境,并且手动脱一个加了…

手动脱壳教程

一、什么是壳? 壳是指在一个程序的外面再包裹上另一段代码,保护里面的代码不被非法修改或反编译的的程序。它们一般先于程序运行,拿到控制权,然后完成它们保护软件的任务。 二、壳的加载过程 1、保存程序入口参数 …

简单脱壳教程笔记

文章目录 1、手脱UPX壳简介:脱壳:笔记:方法1:单步跟踪(需要有耐心)一、使用ODE插件二、tools按钮选择LordPE进行脱壳(提前在SETUP PATHS里添加好) 方法2:ESP定律法方法3&…

常用编程语言开发工具

编程语言开发工具可分为文本开发工具 和 集成开发工具。 文本开发工具的特点是 体积小,功能也不弱。 集成开发工具的特点是 体积大,功能强大。 1.文本编辑器 widows 下的 notepad(记事本) Unix下的 vim ,这两个工具系…

开发工具:2022个人开发工具清单

目录 ​编辑 1、谷歌浏览器 2、腾讯文档 3、Notepad 4、IntelliJ IDEA 5、VisualStudio 6、VSCode 7、微信开发者工具 8、Navicat 9、PDManer 10、Git/Tortoise Git 11、Axure 12、NxShell 13、ApiPost 14、Xmind 15、Everything 16、WizTree 17、猿如意 …

开发工具推荐

1.前言 俗话说:“工欲善其事,必先利其器”。 为了助力大家的学习和进阶,本小节介绍几个对 Java 学习非常有帮助的 IDEA 插件,代码反编译和反汇编工具,以及非常不错的网站等。 2. IDEA 插件 首先不必多说&#xff0c…

【高效开发工具系列】开发工具

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

Linux--开发工具

前言: 是不是看见10月24日有种莫名的亲戚,在信息技术行业,由于2101024,所以1GB 1024MB,1MB 1024KB,1KB 1024B。于是1024是程序员们最为敏感的数字,那么今天祝所有铁子们节日快乐!…

开发工具入门

配置SublimeText的编译 工具->编译系统->新建编译系统 修改如下代码到新建文件内,CtrlS保存内容到 “SublimeText安装目录下的\Data\Packages\User” # 配置文档 { "cmd": ["软件名如:php", "$file"], &qu…

开发工具的使用

git git管理你的项目 进入项目----》右键----》git bash here--->输入git init---->该文件夹和子文件夹都会被git管理 写项目.,...... 头部完成 头部完成想形成一个版本号(形成一个版本号目的是后期可以切换回来), 有以下几个步骤 git add . git commit -m …

【开发工具系列】猿创征文|有了这8个开发工具,程序员可以早点下班了

📣📣📣📣📣📣📣 🎍大家好,我是慕枫 🎍前阿里巴巴高级工程师,InfoQ签约作者、阿里云专家博主,一直致力于用大白话讲解技术知识 &#x…

开发工具使用

一、markdown 1、MarkDown语法 Markdown 语法手册 (完整整理版)【Markdown语法】字体颜色大小及文字底色设置 二、IDEA工具 1.1 IDEA相关插件 idea插件下载地址:https://plugins.jetbrains.com/ 开发必装插件: (1…

程序员常用开发工具盘点

优秀的程序员优秀的原因不一定是他敲代码比别人快,但他解决事情的效率一定比别人都要高,往往都会利用工具提升自己的效率,下面给大家分享几个程序员常用的开发工具。 1.浏览器插件FeHelper FeHelper插件支持Chrome、Firefox、MS-Edge浏览器…

15个程序员实用的开发工具,你有用过几个呢?

分享一些日常工作中比较实用的软件和网站,这些网站你平时工作中大概率是会用到的,感觉不错的话可以点赞收藏 1. GitHub Desktop 对于新手来说,要记住那么多git命令可能有点困难,建议新手使用git可视化工具,会方便很多…

13个程序员常用开发工具用途推荐整理

作为一名刚入门的程序员,选择合适的开发工具可以提高工作效率,加快学习进度。在本文中,我将向您推荐10个常用的开发工具,并通过简单的例子和代码来介绍它们的主要用途。 1. Visual Studio Code Visual Studio Code(V…

我常用的15 款开发工具!

上一篇:从零开始搭建公司后台技术栈,这套架构绝了... 作者:爱马仕_人员链接:https://www.jianshu.com/p/4d1a4606ef61 从人工到自动化,从重复到创新,技术演进的历程中,伴随着开发者工具类产品的…