逆向工程核心原理 Chapter20 | “内嵌补丁”练习

2024-08-31 13:52

本文主要是介绍逆向工程核心原理 Chapter20 | “内嵌补丁”练习,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

自己学《逆向工程核心原理》一书的记录,只记录自己觉得重要/有用的一些点。

知识点学习

很实用的一个逆向技术。
原理:
在这里插入图片描述

“壳”的逻辑也是这样的。EP处先解密OEP代码,再跳转到洞穴代码,恢复IAT之类的,然后跳回OEP执行源程序代码。

代码补丁与内嵌补丁的区别:

在这里插入图片描述

PatchMe练习

记得上次寒假学过一次,现在再练/学一次。

IDA看可以很清晰的看到解密逻辑。

流程:

0x4010F5~0x401249:xor 0x44

0x401007~0x401086:xor 0x7

0x4010F5~0x401249:xor 0x11

这三个完了后,会call loc_401039

动调看看loc_401039

可以看到一个大循环:

在这里插入图片描述

而且ebx++,再累加[ebx],猜测是在计算checksum。

中间填充了很多垃圾代码,各种奇奇怪怪的跳转。。

会跳到这里来:

在这里插入图片描述

用x32来看会好一点。

跟到刚刚那个call,确实是在算CRC

在这里插入图片描述

算的是0x4010F5~0x401249的

注意到这里还有一个call,

在这里插入图片描述

跟进去看看。

发现又有一层xor 0x17

在这里插入图片描述

所以这里是对:

0x40124A~0x401280作了xor 0x17

ret后就跳转到OEP了:

在这里插入图片描述

在这里插入图片描述

所以整个流程:

0x4010F5~0x401249:xor 0x44

0x401007~0x401086:xor 0x7

0x4010F5~0x401249:xor 0x11

0x40124A~0x401280:xor 0x17

JMP OEP

在OEP的代码貌似有反调试?(INT 3)

但是可以看到字符串在这里插入图片描述

看下这字符串在哪个区域。

0x4010F5~0x401249

按照教程的流程图:

在这里插入图片描述

那就是[B]区的数据。

由于[B]区有checksum,所以不大可能直接修改,所以要洞穴代码修改。

思路:

在这里插入图片描述

补丁代码设置地方:

在这里插入图片描述

对应的就是设置在这个部分:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

但这里手写汇编还是有一点点难。。。

教程用的简洁的REP MOVSB指令

REP MOVSB 是一个在 x86 汇编语言中使用的字符串操作指令。这个指令组合用于在内存中从一个位置复制字节数据到另一个位置。具体来说:

  • REP: 代表 “Repeat”(重复),它会重复执行后面的指令,直到寄存器 ECXRCX 中的计数值减为零。
  • MOVSB: 代表 “Move String Byte”(移动字符串字节),它将源操作数所在位置的一个字节(通常由 DS:SIRSI 指向)复制到目的地位置(通常由 ES:DIRDI 指向)。

是一个很简洁高效的将ESI复制到EDI的指令。用之前需要设置好ECX(记得+1,'\x00'结尾),ESIEDI

对于我们这个patch,两个字符串的位置:

004011230040110A

MOV ECX,0xC
MOV ESI,0x4012A9
MOV EDI,0x401123
REP MOVSB
MOV ECX,0x9
MOV ESI,0x4012B9
MOV EDI,0x40110A
REP MOVSB

然后JMP到OEP

JMP 0x40121E

后面对应填修改后的字符串

在这里插入图片描述

把这段洞穴补丁写在00401280开始。(空格即可编辑汇编)

在这里插入图片描述

保存补丁很简单,x32有"补丁"选项,点击后“修补文件”即可。

在这里插入图片描述

洞穴补丁打好后,还要在前面找一处跳转到洞穴补丁处的代码。

前面分析过这里,CRC校验完后跳转到OEP,

在这里插入图片描述

那我们把这个JMP patch为JMP 0x401280即可。

但这里要注意,这个区域属于[A]区域,需要xor 0x7,所以我们把指令xor 0x7后保存。

E9 F8 01 => EE FF 06

Ctrl+P打补丁后保存,尝试运行:

在这里插入图片描述

在这里插入图片描述

成功。

总结

这种技术提供了一个很不错的思路:对于加密,CRC校验防范的资源,我们可以等它解密后,写内嵌补丁来patch。

这篇关于逆向工程核心原理 Chapter20 | “内嵌补丁”练习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1124092

相关文章

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

Python进阶之列表推导式的10个核心技巧

《Python进阶之列表推导式的10个核心技巧》在Python编程中,列表推导式(ListComprehension)是提升代码效率的瑞士军刀,本文将通过真实场景案例,揭示列表推导式的进阶用法,希望对... 目录一、基础语法重构:理解推导式的底层逻辑二、嵌套循环:破解多维数据处理难题三、条件表达式:实现分支

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

深度解析Python yfinance的核心功能和高级用法

《深度解析Pythonyfinance的核心功能和高级用法》yfinance是一个功能强大且易于使用的Python库,用于从YahooFinance获取金融数据,本教程将深入探讨yfinance的核... 目录yfinance 深度解析教程 (python)1. 简介与安装1.1 什么是 yfinance?

MyBatis-Plus 与 Spring Boot 集成原理实战示例

《MyBatis-Plus与SpringBoot集成原理实战示例》MyBatis-Plus通过自动配置与核心组件集成SpringBoot实现零配置,提供分页、逻辑删除等插件化功能,增强MyBa... 目录 一、MyBATis-Plus 简介 二、集成方式(Spring Boot)1. 引入依赖 三、核心机制

redis和redission分布式锁原理及区别说明

《redis和redission分布式锁原理及区别说明》文章对比了synchronized、乐观锁、Redis分布式锁及Redission锁的原理与区别,指出在集群环境下synchronized失效,... 目录Redis和redission分布式锁原理及区别1、有的同伴想到了synchronized关键字

Linux中的HTTPS协议原理分析

《Linux中的HTTPS协议原理分析》文章解释了HTTPS的必要性:HTTP明文传输易被篡改和劫持,HTTPS通过非对称加密协商对称密钥、CA证书认证和混合加密机制,有效防范中间人攻击,保障通信安全... 目录一、什么是加密和解密?二、为什么需要加密?三、常见的加密方式3.1 对称加密3.2非对称加密四、