逆向工程核心原理 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

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Redis中Hash从使用过程到原理说明

《Redis中Hash从使用过程到原理说明》RedisHash结构用于存储字段-值对,适合对象数据,支持HSET、HGET等命令,采用ziplist或hashtable编码,通过渐进式rehash优化... 目录一、开篇:Hash就像超市的货架二、Hash的基本使用1. 常用命令示例2. Java操作示例三

Redis中Set结构使用过程与原理说明

《Redis中Set结构使用过程与原理说明》本文解析了RedisSet数据结构,涵盖其基本操作(如添加、查找)、集合运算(交并差)、底层实现(intset与hashtable自动切换机制)、典型应用场... 目录开篇:从购物车到Redis Set一、Redis Set的基本操作1.1 编程常用命令1.2 集

Redis中的有序集合zset从使用到原理分析

《Redis中的有序集合zset从使用到原理分析》Redis有序集合(zset)是字符串与分值的有序映射,通过跳跃表和哈希表结合实现高效有序性管理,适用于排行榜、延迟队列等场景,其时间复杂度低,内存占... 目录开篇:排行榜背后的秘密一、zset的基本使用1.1 常用命令1.2 Java客户端示例二、zse

Redis中的AOF原理及分析

《Redis中的AOF原理及分析》Redis的AOF通过记录所有写操作命令实现持久化,支持always/everysec/no三种同步策略,重写机制优化文件体积,与RDB结合可平衡数据安全与恢复效率... 目录开篇:从日记本到AOF一、AOF的基本执行流程1. 命令执行与记录2. AOF重写机制二、AOF的

java程序远程debug原理与配置全过程

《java程序远程debug原理与配置全过程》文章介绍了Java远程调试的JPDA体系,包含JVMTI监控JVM、JDWP传输调试命令、JDI提供调试接口,通过-Xdebug、-Xrunjdwp参数配... 目录背景组成模块间联系IBM对三个模块的详细介绍编程使用总结背景日常工作中,每个程序员都会遇到bu

Python中isinstance()函数原理解释及详细用法示例

《Python中isinstance()函数原理解释及详细用法示例》isinstance()是Python内置的一个非常有用的函数,用于检查一个对象是否属于指定的类型或类型元组中的某一个类型,它是Py... 目录python中isinstance()函数原理解释及详细用法指南一、isinstance()函数

Python异常处理之避免try-except滥用的3个核心原则

《Python异常处理之避免try-except滥用的3个核心原则》在Python开发中,异常处理是保证程序健壮性的关键机制,本文结合真实案例与Python核心机制,提炼出避免异常滥用的三大原则,有需... 目录一、精准打击:只捕获可预见的异常类型1.1 通用异常捕获的陷阱1.2 精准捕获的实践方案1.3