此笔记来自看书《从机器码到框架的系统观》:
原书加粗:
1. 在了解原则的情况下,还需要多多练习,多多怀疑,让猜测和实证将知识深深植入到思想
和灵魂中,成为“活生生”的一部分。程序是手艺,而手艺是熟练和思想的交点。(说得对吗?)
2. 在“猜测,实证”这种方法中,猜测必须到细节,细节决定成败!
介绍 __stdcall : ret + add esp,n ==> ret n
介绍 __fastcall: 用寄存器 edx,ecx 传前两个参数.
函数调用: 1.寄存器or栈传参; 2.压栈顺序; 3.栈清理方. 组合为调用惯例(calling convention).
数组访问问题(已知); 结构寻址,对齐问题(已知);
switch 机制1: 跳转表 jmp [edx*4 + off_table].
机制2: 两级跳转表; 机制3: 直接 cmp 多个值;
方法: 找到一个支撑点, 从该点用倒推的方法, 常常就能找到突破口.
这种"我来做, 怎么做" 的朴素想法往往是分析和思维深入的基础.
加载器的一般性知识. 加载基址 image base.
重定位问题: 重定位表(relocation table). 参考 Windows PE 格式. 一般 DLL 会重定位.
重定位导致 DLL 指令被修改, 内存共享代码可能并不成立.
DLL 库加载的相关函数: Load/FreeLibrary, GetProcAddress.
Windows 7 下引入了加载随机基址(ASLR).
汇编指令需要一个速查表. 可参考 C/C++ Runtime Library 的实现.
该书提供的一些参考书目:
<<深入理解计算机系统----程序员的观点>> <<卓越编程之道>> <<黑客反汇编解密>>
<<软件调试>> <<加密和解密>> <<黑客调试技术揭秘>>
关于链接: <<Link & Loader>> 等.
第二章
为你提供的能力: ; 分析底层问题的方法和技巧; 猜测-实证-构建方法;
多次强调动手实证.
(但)真正的秘密隐藏在这些(从搜索引擎找到的)廉价的泡沫和耀眼后, 我们必须用自己的努力去挖出来.
钩子技术(hook): 通过直接修改执行代码, 改变程序流程的技术. (相关微软开源工程: Detours)
异常处理: fs:[0] 得到第一个 exception handler (有空再研究).
组织代码的一条简单的原则: 分割函数, 甚至用函数来代替注释. (来自极限编程)
另一个经验原则: 当一段代码复用3次时, 就将其变成函数.