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

相关文章

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代

Golang HashMap实现原理解析

《GolangHashMap实现原理解析》HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持高效的插入、查找和删除操作,:本文主要介绍GolangH... 目录HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持

SpringBoot内嵌Tomcat临时目录问题及解决

《SpringBoot内嵌Tomcat临时目录问题及解决》:本文主要介绍SpringBoot内嵌Tomcat临时目录问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录SprinjavascriptgBoot内嵌Tomcat临时目录问题1.背景2.方案3.代码中配置t

Python列表去重的4种核心方法与实战指南详解

《Python列表去重的4种核心方法与实战指南详解》在Python开发中,处理列表数据时经常需要去除重复元素,本文将详细介绍4种最实用的列表去重方法,有需要的小伙伴可以根据自己的需要进行选择... 目录方法1:集合(set)去重法(最快速)方法2:顺序遍历法(保持顺序)方法3:副本删除法(原地修改)方法4:

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程

SpringQuartz定时任务核心组件JobDetail与Trigger配置

《SpringQuartz定时任务核心组件JobDetail与Trigger配置》Spring框架与Quartz调度器的集成提供了强大而灵活的定时任务解决方案,本文主要介绍了SpringQuartz定... 目录引言一、Spring Quartz基础架构1.1 核心组件概述1.2 Spring集成优势二、J

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

鸿蒙中@State的原理使用详解(HarmonyOS 5)

《鸿蒙中@State的原理使用详解(HarmonyOS5)》@State是HarmonyOSArkTS框架中用于管理组件状态的核心装饰器,其核心作用是实现数据驱动UI的响应式编程模式,本文给大家介绍... 目录一、@State在鸿蒙中是做什么的?二、@Spythontate的基本原理1. 依赖关系的收集2.