用户名:  密码:   
您当前的位置:首页 > 程序设计 >  汇编与密码学 > 

基础篇1_6

上次修改时间: 2017-11-26 17:56:36      来源:网络总结      作者:钢铁长陈
上一页      路径:DSD\Learn\assembly与反assembly\解密系列\      下一页

第1讲
1. 主要的教科书为看雪的加密与解密。
2. 需要的基础知识
 一门编程程语言,
 对api编程和windows工作方式有点了解,可以看windows程序设计这本书
3. 要讲8086汇编,32位汇编指针,保护模式,消息机制做一些了解
4. 调试篇要讲OD,PEID,IDA,CE,W32ASM等
5. 系统篇,主要讲PE的格式,有助于对操作系统的深入理解。 EXE和DLL
6. 逆向篇,对被解密的软件进行逆向分析。对各种接口的数据结构
7. 算法篇,密码学知识,MD5,SHA,CRC,RSA,ELGmal等
8. 加壳与脱壳篇,保护软件。壳的原理, UPX,ASPack,ASProtect, Armadillo,虚拟机保护等
 抓取内存映像,各种寻找OEP(原程序第一条指令),重建输入表的方法和原理
9. 保护技术研究篇
 软件的保护技术和反跟踪技术,
10. 补丁制作篇,文件补丁,内存补丁,
11. 工具制作篇,得心应手的工具要自己做
12. 实战演练篇

第2讲 一些必备的常识
1. 多字节存储顺序
 有正序和逆序,也叫大端和小端存储
 RISC架构的CPU,现在是两种集合体
2. 两种编码区别:
 将12345678H存入以1000H开始的内存中
 从高到低,Big-Endian,低地址是高位,高位字节存代地址,
 Little-Endian 低
3. ASCII和Unicode
 ASCII用7位表示的,有256种变化,美国信息互换标准代码,约定
 Unicode字符编码的编码范围是0-65535,它包含三套编码方式,如UTF-8,UTF-16和UTF-32
 ASCII为Unicode字符编码的一部分
 //32位系统用Unicode
4. 字符串fishc在内存中以Unicode编码Little-Endian形式存放
 66H 00H 69H 00H 73H 00H 68H 00H 63H 00H
 //本来f是66h,以unicode存放就是6600H
5. Win API简介
 就是windows应用程序接口,是针对所以MS windows操作系统家族的系统编程接口
 它被设计为各种语言的程序调用,也是软件与windows系统最直接的交互方式
 应用程序通过api调用win32子系统,系统服务接口,I/O管理器,
6. 动态链接库dll文件,把一些经常用到的共用代码制作dll文件。当可执行文件用到dll文件中函数时,系统就会把dll加载到内存
 dll文件本身的结构是可执行文件PE,当程序要函数时才进行链接,通过动态链接方式,可降低存储器浪费
7. 三个主要的dll,
 Kernel32.dll控制着系统的内存管理,数据输入输出操作和中断处理,win启动后,其就驻留在内存中的定保护区域,
 user32.dll用户
8.  学会查MSDN
9. 句柄(handle),是整个Windows编程的基础,使用的一个唯一的整数值,用于标志应用程序中不同对象和同类对象中的不同实例
 句柄是指针的指针,窗口,按钮,图标,滚动条等都是通过句丙访问

第3讲 一些解密的基本常识
1. windows具体运行机制
 winApi函数与stdcall约定
 匈牙利命名法
 回调函数
 ....
2. NT架构,从内核到KERNEL32, USER32,GDI32都是纯32位实现
 NT架构标准字符集重头开发,统一用Unicode字符集,兼容ASCII字符集
 具体见windows 程序设计这个书,可以下载chm,最好是把这本书当字典,不要整本的读
3. winAPI函数与stdcall约定
4. windows程序大致框架,
 创建一个窗口类,创建窗口,加上参数使类特殊化,创造后返回句柄
 更新它,
 消息机制
 _stdcall由谁清空栈,参数的调用顺序
5. 匈牙利命名法
 TCHAR,右击到定义处,就可看到
 NULL到定义处就是0
 回调就是让操作系统会调用我们设定好的函数
 __stdcall和WINAPI是一样的

第4讲  Windows消息机制
1. windows特点就是图形化界面,多任务管理 ,这些都是建立在消息机制上的。 
2. win有两种消息队列,一种是系统消息队列,一种是应用程序消息队列
 从系统消息队列拷贝到应用程序消息队列
3. win为每个程序维护一个消息队列,发生一个事件后,系统将事件转为一个消息,将消息投放到程序的消息队列,主要看那个程序被激活
 程序通过执行消息循环的代码从消息队列中取出消息
 while(GetMessage(&msg,NULL,0,0))
 {
  TranslateMessage(); 翻译
  DispatchMessage(); 分配
 }
 MSDN可查询GetMessage()
 //接到到WM_QUIT返回为0的值
4. MSG结构
 typedef struct tagMSG{
  HWND hwnd;
  UNIT message;
  ...
 } MSG
 //消息是定义一堆结构和ID,程序运行过程中调用switch和case拦截去完成相应的功能
5. 例子,讲C++的一个窗口例子
 定义一个类,创建一个窗口,参数很多都是宏定义
 MSDN中查CreateWindow这个创建窗口的函数,返回一个句柄
 移动窗口要生重新绘制UpdateWindow
 进入消息循环,
 SULT CALLBACK系统调用的
 用switch判断是什么消息,再根据消息去处理
 case WM_LBUTTONDOWN:
  MessageBox(hwnd, TEXT("Hello fishc.com!"),TEXT("Byte Byte"),MB_OK);
  PostQuitMessage(hwnd, WM_QUIT,0,0);
  return 0;
6. 有的程序也可以没有窗口
 #include <windows.h>
 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
 {
  MessageBox(NULL, TEXT("Hello, welcome to fishc.com!"),
  TEXT("Welcome!"), MB_OKCANCEL | MB_CIONWARNING
  );
  return 0;
 }
  
第5讲 Windows保护模式
1. 实模式,保护模式和虚拟8086方式
2. 程序运行实质是指令的执行。高级语言会先汇编,汇编与机器指令一一对应
3. 80x86通过CS配合IP寄存器来指示CPU的内存的位置
 段地址+偏移地址=20位物理地址 那时有1M的内存要20位才能索引,那时CPU只有16位
4. x86有CS/DS/ES/FS/SS等等用于指示不同用途的数据段在内存中的位置
 x86使用中断来实现系统服务
 8086以前(8bit),8086(16bit),80386(32bit),现在64bit的CPU
 AL-AX-EAX-RAX ,RAX的低32位就是EAX,EAX的低16位为AX,不用的高位用0填充及兼容
5. 保护模式
 无论实模式还是保护模式,根本的问题还是程序如何在其中运行
 保护模式的实质还是CPU执行指令,操作相关数据,改变是寻址方式
 实模式是什么数据看CS,DS,SS
6. 不同任务之间的保护
 把不同的任务放在不同的虚拟地址空间中,以实现不同任务间的隔离,A程序不能修改B程序的代码和数据
 同一任务还有4种保护级别,分别为0,1,2,3按环方式表示
 最面面是内核,其次是操作系统,最外才是应用程序的数据,每个应用程序间也是隔开的
 环0,1, 2,为系统级,坏3为用户级,一般只用环0和环3
7. 如应用程序有0级权限,可访问所有程序和数据,程序的权限级别是第3级,能访问的数据是有限的
 系统的核心是运行在Ring0级,Win32子系统,Kernel32.dll,user32.dll,gdi32.dll运行第3级
 网站日志搜保护模式
8. 虚拟内存,不是真正的内存,它是通过映射(Map)的方法,使可用的虚拟地址VA达到4GB,EIP32位索引的最大就是4GB
 规定每个程序可分配2GB,另2G留给系统用
 虚拟内存并不真正的内存,
9. Windows是一个分时的多任务系统,分成一个个时间片给不同的程序,
 在一个时间片里,和这个程序无关的不会映射到线性地址中,EIP就索引不到,
 可做到每个程序都有自己4GB的寻址空间,互不干扰
10. DLL和EXE不同,实际是同的,只是DLL没有自己的私有空间
11. 虚拟内存的实现方法和过程
 程序启动时,系统创建一个新的进程,并给这个进程分配2GB的虚拟地址,不是内存
 如使用到动态链接库Dll,就讲Dll映射到进程的虚拟地址空间,在需要时才被读入物理内存
 需要时才链接进去,多个程序都就可以用,需要时才映射过去
 其他项目,数据堆栈的空间是从物理内存分配,
 。。。。。这里有些重要,讲的太快。
12. 应用程序不会不会直接访问物理地址,虚拟内存管理器通过虚拟地址访问请求,控制所有的物理地址访问
 每个时间片都是不同的程序,每个程序都有4GB空间
 dll没有私有空间,它总被映射到其它应用程序地址空间,作为其它程序的一部分
13. 虚拟内存的好处是简化了内存的管理 ,弥补物理内存的不足,防止程序间冲突,一切的内存都是由虚拟内存管理器来管理

第6讲 初步认识PE格式
1. PE格式是迈入Win32编程的基石,是高手的必备基本功
 PE,Portable Executable,可移植的执行体,Win环境自所带的执行体文件格式
2. 继承自Unix的Coff文件格式
 跨Win32平台,即Win运行在非Intel的CPU,任何win32平台的PE装载器都能识别和使用该文件格式
 是约定的标准
3. 基本上所有win32执行体,除了VxD和16位的dll都可使用PE文件格式,包括NT内核的模式驱动程序Kernel mode drivers
 真正的病毒技术在PE病毒才会得到真正的体现
4. PE文件使用的是一个平面地址空间,所有代码和数据都合在一起,组成一个很大的结构
 文件的内容被分割为不同的区块,Section,区段,节等,
 每个区块都有自己在内存中的属性,即可读写,只读等
5. 一般的区块
 .text 内容是指令代码
 .rdata 是运行期的只读数据
 .data 是初始化的数据块
 .idata 外来的dll的函数及数据信息,即输入表
 .rsrc 全部资源
6. PE文件非常好的一个地方就是在磁盘上的数据结构与在内存中的结构是一致的
 当系统装载一个可执行文件到内存中,主要就是将一个
 按PE格式存放的文件是PE文件
 加密了,把内存镜像出来
7. 入口点(Entry Point),即OEP,原始的入口点,壳就是把原始的入口点隐藏起来了
 程序在执行时第一行代码,像x86汇编中的start指向的入口地址
8. 文件偏移地址file Offset
 当PE文件存在磁盘上时,各数据的地址称作文件的偏移地址,从PE文件第一个字节开始计算
9. 虚拟地址 Virtual Address, VA
 win运行在保护模式下,程序访问存储所使用的罗逻辑地址称为虚拟地址,不是真正的物理地址,
 也称为内存偏移
 段+偏移地址,段选择子,其数据存储在CS段选择器里边,同一程序不同系统环境,可能不同
10. 基地址 ImageBase
 文件执行时被映射到内存中的初始内存地址称为基地址,由PE文件本身设定
 VC建立的EXE文件基地址是00400000h,基地址可改
11. LoadPE,强大的PE编辑工具,可到论坛下载
 打开后看到的是系统中进程
 可看到基地址等,随便打开一个软件,可看到入口点,基地址,
 区块表,虚拟地址,物理地址