-
-
[原创]Windows10代码还原汇编特征汇总(附NTDLL CreateHeap还原代码)
-
发表于:
2025-2-13 20:55
7750
-
[原创]Windows10代码还原汇编特征汇总(附NTDLL CreateHeap还原代码)
大家好,我是武汉科锐逆向CR49期的一名学员,我写这篇文章的目的是想帮助刚开始或者准备开始研究windows系统的人员,此篇文章仅作为经验分享,是我在逆向还原windows10堆API CreateHeap
和AllocateHeap
以及AllocateHeapInternal
源代码时总结的一些经验,如有错误请各位前辈斧正。我们仅分享其windows10 ntdll中常见的一些汇编特征优化,如若不涉及的优化请各位自行翻阅资料学习。
分析环境: Windows11
工具: Windbg, IDA7.5
分析目标平台: Windows10
分析目标文件: C:\Windows\SysWow64\ntdll.dll(32位)
版本信息:10.0.19041.5007 (WinBuild.160101.0800)
SHA-1:9C3A55D17C022D7B32EE558E8941C4C9938696CA
0x0 常见Release版优化梳理
0x1 临时变量优化
0x2 0值寄存器传递
0x3 函数调用约定优化
0x4 if特征与平坦化优化(if反转)
0x5 push pop寄存器赋值
对于常见的Release版编译的优化此篇文章涉及到的有
CPU流水线优化
真正的CPU流水线优化有许多概念且十分复杂,但是体现在代码中的我们只需要关注一些会影响我们分析的内容,比如乱序执行我们以最经典的三级流水线为例举出例子方便大家简易回顾一下流水线优化。如下三个操作分别由三个不同的CPU组件同步执行
● 取指令
● 译码
● 执行
在CPU中形如如下流程,但是流水线优化只会优化无相关关联的代码譬如:mov eax, imm32 mov ebx, imm32 等,而如果出现一个指令序列其中的前后代码相关联则会破坏该处的流水线优化,对于3级流水线来讲最好情况是3行代码互相无关。
下面我们给出相关图例辅助理解

一旦出现的一组代码(A组)可以组成流水线优化则意味着该组代码A的执行顺序与组内其他代码无关,且改组代码也有可能与其他组代码无关,此时编译器有可能将该组代码提前(延后)到某组代码(B组)后执行且不会影响程序的逻辑,最简单的情况就是__cdecl
后的调用方的平栈代码add esp, imm
在ntdll中如果出现调用函数为__cdecl
就有可能出现这种优化可能会在后面的代码中穿插一条平栈代码,在还原代码时我们只需要跳过即可。
加法优化(比例因子优化)
对于加法通常我们能看到利用lea
指令进行优化,譬如eax + eax + 1
在优化版中会出现形如lea eax, [eax+eax+1]
等优化类型但是在此次还原中出现较少。
在逆向的过程中我们经常能看到如下片段

对于这种情况我们在初次见到时如果发现前面的esi原先为某个变量值但是被赋值覆盖掉了原值,然后中间经过一系列操作运算传入了某个函数或者放入了某个变量,则有可能是编译过程编译器将临时变量优化掉了导致的譬如如下C代码
1
2
3
4
5
|
DWORD add(DWORD a, DWORD b)
{
DWORD dwRet = a + b;
return dwRet;
}
|
[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!
最后于 2025-2-14 16:00
被TeddyBe4r编辑
,原因: 修改介绍