课程思想:学完知识后可以做出相应的产品,学以致用;而不是学了很多乱七八糟的散碎知识然后没什么用。用逆向的思维去学习正向。围绕着项目展开
滴水逆向课程体系:
- 第一章 进制、寄存器与汇编指令
- 第二章 C语言
- 第三章 硬编码
- 第四章 C++与MFC
- 第五章 Win32 API
- 第六章 PE
十六进制:由16个符号组成,分别是0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F 逢十六进一
十六进制是二进制的简写,一个十六进制数对应四个二进制数
1Byte=8bit
1Word=2Byte
1DWord=4Byte
八进制中:2-3=?(考察知识点:负数在计算机中是如何存储的)

PE文件结构仅限于Windows系统
分析一个程序:
- 程序从哪里开始执行
- 代码存放在哪里
- 数据存放在哪里
硬编码——汇编——C语言
项目:
- 反汇编引擎
- PE分析器
- 游戏案例逆向分析/加密壳
- 商业软件开发模板(登陆界面、进程注入、网络验证、隐藏模块、代码加密)
思考:
程序在内存中是如何存储的?(答:二进制形式的数字)
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10/A | 11/B | 12/C | 13/D | 14/E | 15/F |
| 0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 |
逻辑运算:
与(and &)
或(or |)
非(not !)
异或(xor)
计算机如何计算2+3:
x、y:x、y”异或”等于R、x、y”与”等于S、S”左移”一位等于T(if(T==0){结束,R为计算结果})

一种加密方法:异或
用“异或”进行加密解密:

寄存器与内存:
- 寄存器与内存没有本质区别,都是用于存储数据的容器
- 寄存器位于CPU内部,执行速度快,但是比较贵
- 内存速度相对较慢,但是成本低
32位通用寄存器的指定用途:
EAX:累加器
ECX:计数
EDX:I/O指针
EBX:DS段的数据指针
ESP:堆栈指针
EBP:SS段的数据指针
ESI:字符串操作的源指针;SS段的数据指针
EDI:字符串操作的目标指针;ES段的数据指针
内存的读写:
读取内存中的值:MOV EAX,DWORD PTR DS:[0X12345678]
向内存中写入数据:MOV DWORD PTR DS:[0X12345678],ECX
获取内存编号:LEA EAX, DWORD PTR DS:[0X12345678]
LEA EAX, DWORD PTR DS:[ESP+8]
寻址公式:[立即数]、[reg]、[立即数+reg]、[reg+reg*{1,2,4,8}]、[reg+reg*{1,2,4,8}+立即数]
堆栈:
- 堆栈的本质就是内存
- 栈用来存储临时变量和函数传递的中间结果
push eax相当于:
lea esp,dword ptr ss:[esp-4]
mov dword ptr ss:[esp],eax
pop eax相当于:
mov eax,dword ptr ss:[esp]
lea esp,dword ptr ss:[esp+4]
分析函数调用过程:
#include<stdio.h>
int sum(int a,int b){
int c=5;
return a+b+c;
}
int main(){
printf("%d\n",sum(2,3));
return 0;
}



CALL指令的作用:
- 将EIP的值改为函数所在的地址
- 将返回地址压栈
RETN的作用:
- 将堆栈中的函数返回地址弹出到EIP
缓冲区溢出:(根据环境而定、大同小异)
例1:
#include <stdio.h>
void attack() {
printf("attack()函数执行了");
}
int main() {
int a[5] = {0};
a[10] = (int) attack;
}


例2:
#include <stdio.h>
void hello() {
int i=0;
int a[]={1,2,3,4,5,6,7,8,9,10};
for(i=0;i<=10;i++){
a[i]=0;
printf("HelloWorld!%d\n",i);
if(i==10){
a[11]=0;
}
}
}
int main() {
hello();
return 0;
}


例3:
代码在数据区
#include "stdafx.h"
unsigned char loc[]={
0x55,0x8B,0xEC,0x83,0xEC,0x40,0x53,0x56,0x57,0x8D,0x7D,0xC0,0xB9,0x10,0x00,0x00,
0x00,0xB8,0xCC,0xCC,0xCC,0xCC,0xF3,0xAB,0x8B,0x45,0x08,0x03,0x45,0x0C,0x5F,0x5E,
0x5B,0x8B,0xE5,0x5D,0xC3
};
typedef int (*fun)(int x,int y);
int main(int argc, char* argv[])
{
fun f=(fun)&loc;
printf("%x",f(4,5));
getchar();
return 0;
}




被折叠的 条评论
为什么被折叠?



