【滴水三期】--公开课

课程思想:学完知识后可以做出相应的产品,学以致用;而不是学了很多乱七八糟的散碎知识然后没什么用。用逆向的思维去学习正向。围绕着项目展开

滴水逆向课程体系:

  1. 第一章  进制、寄存器与汇编指令
  2. 第二章  C语言
  3. 第三章  硬编码
  4. 第四章  C++与MFC
  5. 第五章  Win32 API
  6. 第六章  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系统

分析一个程序:

  1. 程序从哪里开始执行
  2. 代码存放在哪里
  3. 数据存放在哪里

硬编码——汇编——C语言

项目:

  1. 反汇编引擎
  2. PE分析器
  3. 游戏案例逆向分析/加密壳
  4. 商业软件开发模板(登陆界面、进程注入、网络验证、隐藏模块、代码加密)

思考:

程序在内存中是如何存储的?(答:二进制形式的数字)

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为计算结果})

一种加密方法:异或

 用“异或”进行加密解密:

寄存器与内存:

  1. 寄存器与内存没有本质区别,都是用于存储数据的容器
  2. 寄存器位于CPU内部,执行速度快,但是比较贵
  3. 内存速度相对较慢,但是成本低

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}+立即数]

 堆栈:

  1. 堆栈的本质就是内存
  2. 栈用来存储临时变量和函数传递的中间结果

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指令的作用:

  1. 将EIP的值改为函数所在的地址
  2. 将返回地址压栈

RETN的作用:

  1. 将堆栈中的函数返回地址弹出到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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NovFif

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值