前期未整理笔记:
高级语言有两种形式:
1.被编译成机器语言在CPU中执行 反汇编:机器语言->汇编语言
2.一边解释一边执行 反编译:编译后程序可以被还原成高级语言的原始结构
Windows程序并不是从winmain开始,而是从开始启动函数相关代码开始
启动函数负责对C/C++运行库进行初始化,检查指向新进程的环境变量指针,全局变量初始化,内存堆栈初始化等
程序简介调用函数:通过寄存器传递函数地址或动态计算函数地址
函数传递参数有3中形式:堆栈、寄存器、以及通过全局变量进行隐含参数的传递
堆栈:后进先出,栈顶指针ESP指向堆栈中第一个可用的数据项
平衡堆栈:使堆栈恢复原样
常见的加解密配对指令有:xor/or,add/sub,inc/doc,rol/ror
DOS字符串:以“$”作为终止字符
编译器优化时,用dex eax代替cmp,这样指令更轻,执行速度更快
单向函数散列算法---HASH
Eg:MD5,SHA(1/256/384/512),RIPE-MD,HAVAL,N-HASH
对称分组加密算法有:DES,IDEA,AES,BlonFish
CRC32 循环冗余校验码
Base64:将二进制数据编码为可显示的字母和数字,可用于图形、声音等非文本数据,MIME电子邮件格式
只要在不同的平台上提供虚拟机,把字节码翻译为对于的CPU指令集,也就实现了所谓的跨平台特性
.Net:独立于操作系统上的平台,可以视作虚拟机,只要.Net框架便可运行.Net程序
.Net是一系列运行与Ring3层的dll文件
{扩展了编程语言,C#,C++或VB最终都编译为.Net中间语言IL
扩展了PE文件的格式,执行文件中不再保存机器码,而是IL指令和元数据
}
由.Net框架进行管理,框架中的JIT引擎负责在运行时将IL即时编译为本地汇编代码再执行
IL最大特点是以堆栈为基础进行操作,必须保证堆栈平衡
流按存储结构的不同分为堆(heap)和表(table)
Strings:UTF8格式的字符串堆
Blob:二进制数据堆,存储程序中的非字符串信息
GUID:存储所有的全局唯一标识
US:以Unicode格式存放的IL中的User-string
#~:元数据表流
#—:#~的未压缩(未优化)的存储,不常见
自然编译和伪编译
伪代码的运行完全依赖于堆栈
虚拟机的跳转地址表示法,把执行流直接引导到相应的解释单元
eax保存了下一条指令的操作码,每一个跳转地址是一个dword(eax+*4+基地址来索引下一条指令的解释单元)