(P.S.学习笔记自己写的,很多内容都从书上记录的,不知道算不算原创。如果不算,欢迎告知...)
第1章 基础知识
- 逆向工程内容:
- 软件使用限制的去除或者软件功能的添加
- 软件源代码的再获得
- 硬件的复制和模拟
- 逆向分析技术(一般途径和策略)
- 通过软件使用说明和操作格式分析软件(设计思想、编程思路等)
- 静态分析技术:根据反汇编得到的程序清单进行分析(常用方法:从提示信息入手进行分析)->了解各个模块的功能以及编程思路->工具:IDA
- 动态分析技术:动态跟踪->工具:OllyDbg、WinDbg ->原因:
- 模块之间的关联(存在中间结果)、分支和转移
- 不依赖系统重定位的初始化程序
- 加密变换需要进行解密
- 文本字符
- ASCII:单字节
- Unicode:ASCII的扩展,双字节
- Intel将一个字存入存储器要占用相继的两个字节->Little-endian(小端序)
- Windows运转的核心->动态链接->DLL
- 3个主要DLL:
- Kernel(KERNEL32.DLL):操作系统核心服务,包括进程与线程管理、内存管理、文件访问等
- User(USER32.DLL):负责处理用户接口,包括键盘和鼠标输入、窗口和菜单管理等
- GDI(GDI32.DLL)图形设备接口,允许程序在屏幕和打印机上显示文本和图形
- 其他DLL:
- ADVAPI32.DLL:对象安全、注册表操作
- COMCTL32.DLL:通用控件
- COMDLG32.DLL:公共对话框
- SHELL32.DLL:用户界面外壳
- NETAPI32.DLL:网络
- NT(用Unicode重新开发的、完全用Unicode函数工作)架构下,Win API能接受Unicode和ASCII,但其内核只接受Unicode(会进行转换->占用系统资源)
- Win API中,‘A’表示ANSI,‘W’表示Widechars(Unicode)->如:MessageBoxA()和MessageBoxW()
- Windows消息机制:
- Windows->消息驱动式系统(应用和应用之间、应用和系统之间的通信手段)
- 应用要实现的功能->消息触发->消息的响应和处理->完成
- 两种消息队列:系统消息队列、应用程序消息队列
- Windows监控输入设备->事件发生->输入的消息放入系统消息队列->复制到应用程序消息队列->循环在(应用程序自身的)消息队列中->检索每一个消息->发送给相应窗口函数
- 消息:非抢占->一些外部实时事件不能及时处理
- 常用消息函数(P9)
- SendMessage
- WM_COMMAND
- WM_DESTROY
- WM_GETTEXT
- WM_QIUT
- WM_LBUTTONDOWN
- 虚拟内存:
- 32位进程->地址空间4GB->00000000h~FFFFFFFFh
- 虚拟内存->通过映射(Map)可用虚拟地址4GB
- Windows->分时的多任务操作系统->CPU时间分成时间片->分配给不同程序->一个时间片内没每个程序相对独立(自己的4GB寻址空间)
- 虚拟内存实现方法和过程:
- 应用程序启动,操作系统穿件一个进程,并分配2GB虚拟地址
- 虚拟内存管理器将应用程序的代码映射到应用程序的虚拟地址某个位置,并将当前需要的代码读入物理地址(虚拟地址与应用程序代码在物理内存中的位置无关)
- 如果使用DLL,DLL也会被映射到进程的虚拟地址空间中,在需要时才会被读入物理内存
- 其他项目(数据、堆栈等)的空间是从物理内存分配的,并被映射到虚拟地址空间
- 应用程序通过使用其虚拟地址空间的地址开始执行,虚拟内存管理器把每次内存访问映射到物理位置
- P.S.虚拟内存注意:
- 应用程序不会直接访问物理地址
- 虚拟内存管理器通过虚拟地址发访问请求来控制控制所有的物理地址访问
- 每个应用程序都有独立的4GB寻址空间,不同应用程序的地址空间是彼此隔离的
- DLL程序没有“私有”空间,它们总是被映射到其他应用程序的地址空间中,作为其他应用程序的一部分运行 <- 如果DLL不与其他程序处于同一地址空间,应用程序将无法调用它
- 虚拟内存的好处:简化了内存管理,弥补了物理内存不足,防止多任务环境下应用程序之间冲突
- 64位最大寻址空间16TB,Win7支持8GB~192GB,Win10支持128GB~2TB