学习逆向工程知识的一些随笔(一)

此笔记来自看书《从机器码到框架的系统观》:

原书加粗:

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次时, 就将其变成函数. 

你可能感兴趣的:(学习逆向工程知识的一些随笔(一))