【加密与解密(第四版)】第四章笔记

第四章 逆向分析技术

4.1 32位软件逆向技术

启动函数

CRT相关介绍:https://www.bookstack.cn/read/reverse-engineering-for-beginners-zh/spilt.14.spilt.35.book.md

__XcptFilter 是一个在Windows平台上的C/C++运行时库中的函数,通常与异常处理相关。这个函数在尝试进行除零或其他异常操作时,由异常筛选器表达式调用。

__XcptFilter函数的原型大致如下:

int __cdecl _XcptFilter(unsigned long xcptnum, PEXCEPTION_POINTERS pxcptinfoptrs);

其中:

xcptnum:是异常的标识符,它是一个无符号长整数,用于标识具体的异常类型。这些异常编号通常在winnt.h头文件中定义。

pxcptinfoptrs:是一个指向EXCEPTION_POINTERS结构的指针,该结构包含了关于异常的详细信息,如发生异常的地址、堆栈跟踪等。

_XcptFilter函数返回一个整数,该整数指示要执行的操作,这通常基于异常处理的结果。这个函数会参考_XcptActTab[]表来标识异常并确定适当的操作。_XcptActTab[]是一个包含常数和定义的数组。

需要注意的是,__XcptFilter是一个底层的、通常不直接由应用程序开发者调用的函数。它更多地被用于实现运行时库和操作系统的异常处理机制。在大多数情况下,开发者会使用更高级别的异常处理机制,如C++的异常处理(try/catch块)或Windows的结构化异常处理(SEH, Structured Exception Handling)。

函数的参数传递方式

利用栈

利用寄存器、通过全局变量进行隐含参数传递

名称修饰约定

函数的返回值
通过寄存器:小于等于4个字节时放在eax中,大于时其高位放到edx中

通过引用方式(地址)

函数调用的堆栈变化图

虚函数

控制语句

转移指令机器码=转移类别机器码+(目的地址 - 起始地址 - 跳转指令本身的长度)

指令优化:“逻辑分支”转换成“算术操作”

循环语句(一般来说往上跳可初步判断为循环,但还要具体分析)

编译器对加减乘除的优化

加法:优化为lea指令

乘法:mul、imul——>shl

除法:div、idiv——>shr、sar;除法变为乘法

各种类型的字符串、字符寻址指令:MOV、LEA

4.2 64位软件逆向技术

x64系统通用寄存器的名称,第1个字母从“E”改为“R”(例如“RAX”),大小扩展到 64 位,数量增加了8个(R8~R15),扩充了8个128位XMM寄存器(在64位程序中,XMM寄存器经常被用来优化代码)。64位寄存器与x86下的32位寄存器兼容,例如RAX(64位)EAX(低32)、AX(低16位)、AL(低8位)和AH(8~15位)。x64新扩展的寄存器高低位访问,使用WORD、BYTE、DWORD后级,例如R8(64位)R8D(低32位)、R8W(低16位)和R8B(低8位)。

x86 应用程序的函数调用有 stdcall、cdecl、Fastcall 等方式,但x64应用程序只有1种寄存器快速调用约定。前4个参数使用寄存器传递,如果参数超过4个,多余的参数就放在栈里,人栈顺序为从右到左,由函数调用方平衡栈空间。前4个参数存放的寄存器是固定的,分别是第1个参数RCX、第2个参数RDX、第3个参数R8、第4个参数R9,其他参数从右往左依次人栈。任何大于8字节或者不是1字节、2字节、4字节、8字节的参数必须由引用来传递(地址传递)。所有浮点参数的传递都是使用 XMM寄存器完成的,它们在XMM0、XMMI、XMM2和XMM3中传递。

64位的除法优化:原书超级详细

单重继承虚表、多重继承虚表、菱形继承虚表、抽象类虚表

  • 14
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NovFif

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值