windows逆向初级公开课

1:进制
程序在计算机中是以二进制的方式存储的。

16进制:0(0000),1(0001),2(0010),3(0011),4(0100),5(0101),6(0110),7(0111),8(1000),9(1001),A(1010),B(1011),C(1100),D(1101),E(1110),F(1111)   (牢记,虽然计算机只能处理二进制数据,但是工具来表示二进制数据的话,人看起来不方便,一般使用十六进制表示)


2:字节,字,双字
字节:1个字节有8位(bit)
内存中存储的数据以字节为单位

字(word):1个字有2个字节,也就是16位

双字(dword):1个双字由2个字组成,也就是4个字节,就是32位

3:从整体上把握一个PE文件
第1:程序是从哪里开始执行的?
第2:代码(code)存储在哪里?
第3:数据(data)存储在哪里?

PE文件结构:(查找AddressOfEntryPoint和BaseOfCode,BaseOfData)

工具:LoadPE的使用

软件加壳(打乱pe结构)与软件调试。


硬编码:
比如:55      表示   PUSH EBP
          8BEC  表示  MOV EBP, ESP


特征码:也就是那些硬编码,每个软件如果不升级的话,都有一些特定的编码的特征。类似于指纹。


反汇编引擎:硬编码到汇编代码的过程。


用一句话总结逆向:
从二进制程序入手,通过反汇编引擎得到汇编代码,汇编代码再到C程序。



逻辑运算:与,或,非,异或



4:加法的运算
A+B
1:计算A xor B  等于R
2:计算A and B 假设等于L,L左移1位,如果结果等于0,则R就作为A+B的结果,如果结果不是0,就继续往下运算。
3:R赋值给A,L左移1位后的结果复制给B,A xor B,重复上面的过程。。。。。



5:加密与解密
xx



6:cpu和内存
数据可以存储到cpu集成的寄存器和内存中。

32位通用寄存器的制定用途:
eax  累加器
ecx   计数
edx   I/O指针
ebx   DS段的数据指针
esp
ebp
esi
edi


byte
word
dword


mov指令
add指令
sub指令



7:内存
内存的特点:
一个字节一个单位,也就是一个字节有一个内存编号(内存地址)
32位表示的是内存编号最长有32bit,所以32位的地址长度可以寻址4GB的内存




8:内存的读写
对内存的读写

读取内存的值:
mov eax, dword ptr ds:[0x13FF04]   (取0x13FF04,0x13FF05,0x13FF06,0x13FF07位置的内存内容,也就是4个字节)      ds的内容和这段内存的属性有关
mov eax, dword ptr ds:[0x13FF08]

将值写入内存:
mov dword ptr ds:[0x13FF04], ebx

寻址的其他方式:




9:堆栈
一块内存空间

esp 寄存器
ebp 寄存器
这2个寄存器用来标识称之为堆栈的内存空间的范围

push指令
pop  指令


10:变形的艺术

push eax
相当于如下2条汇编指令
lea esp,dword ptr ss:[esp-4]
mov dword ptr ss:[esp], eax 

或者
mov  dword ptr ss:[esp-4], eax
lea esp,dword ptr ss:[esp-4]

lea esp,dword ptr ss:[esp-4]  相当于  mov esp, esp-4     sub esp,4




问题:push esp和pop esp可以该写成哪种形式??
push esp
相当于
mov eax, esp
sub esp, 4
mov dword ptr ss:[esp],  eax



pop esp
相当于
mov eax, dword ptr ss:[esp]
add esp, 4
mov esp, eax








评论

此博客中的热门博文

OAuth 2教程

rootfs,linux目录结构,(第3天)