逆向工程核心原理 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编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

Linux find 命令完全指南及核心用法

《Linuxfind命令完全指南及核心用法》find是Linux系统最强大的文件搜索工具,支持嵌套遍历、条件筛选、执行动作,下面给大家介绍Linuxfind命令完全指南,感兴趣的朋友一起看看吧... 目录一、基础搜索模式1. 按文件名搜索(精确/模糊匹配)2. 排除指定目录/文件二、根据文件类型筛选三、时间

JAVA封装多线程实现的方式及原理

《JAVA封装多线程实现的方式及原理》:本文主要介绍Java中封装多线程的原理和常见方式,通过封装可以简化多线程的使用,提高安全性,并增强代码的可维护性和可扩展性,需要的朋友可以参考下... 目录前言一、封装的目标二、常见的封装方式及原理总结前言在 Java 中,封装多线程的原理主要围绕着将多线程相关的操

kotlin中的模块化结构组件及工作原理

《kotlin中的模块化结构组件及工作原理》本文介绍了Kotlin中模块化结构组件,包括ViewModel、LiveData、Room和Navigation的工作原理和基础使用,本文通过实例代码给大家... 目录ViewModel 工作原理LiveData 工作原理Room 工作原理Navigation 工

Java的volatile和sychronized底层实现原理解析

《Java的volatile和sychronized底层实现原理解析》文章详细介绍了Java中的synchronized和volatile关键字的底层实现原理,包括字节码层面、JVM层面的实现细节,以... 目录1. 概览2. Synchronized2.1 字节码层面2.2 JVM层面2.2.1 ente

MySQL的隐式锁(Implicit Lock)原理实现

《MySQL的隐式锁(ImplicitLock)原理实现》MySQL的InnoDB存储引擎中隐式锁是一种自动管理的锁,用于保证事务在行级别操作时的数据一致性和安全性,本文主要介绍了MySQL的隐式锁... 目录1. 背景:什么是隐式锁?2. 隐式锁的工作原理3. 隐式锁的类型4. 隐式锁的实现与源代码分析4

MySQL中Next-Key Lock底层原理实现

《MySQL中Next-KeyLock底层原理实现》Next-KeyLock是MySQLInnoDB存储引擎中的一种锁机制,结合记录锁和间隙锁,用于高效并发控制并避免幻读,本文主要介绍了MySQL中... 目录一、Next-Key Lock 的定义与作用二、底层原理三、源代码解析四、总结Next-Key L

Spring Cloud Hystrix原理与注意事项小结

《SpringCloudHystrix原理与注意事项小结》本文介绍了Hystrix的基本概念、工作原理以及其在实际开发中的应用方式,通过对Hystrix的深入学习,开发者可以在分布式系统中实现精细... 目录一、Spring Cloud Hystrix概述和设计目标(一)Spring Cloud Hystr