前言
导师要求寒假精读《加密与解密》,他认为这本书对我以后职业发展有帮助。那么借着寒假时间比较多,深入学习一下:)
阅读笔记与原书相比,简化了很多内容,并且加上些许个人理解。因为个人能力有限,有错误的地方还请大佬指出
什么是加密与解密(介绍基本概念)
- 对软件来说,“可执行程序->反编译->源代码”的过程就是逆向工程
批注:在我有限的ctf比赛经验中,可执行程序一般为exe,elf,apk文件,通过ida等工具反编译,但是并不会要求得出源代码
- 逆向工程的内容可以分为如下3类:
- 软件使用限制的去除或者软件功能的添加
比如破解软件
- 软件源代码的再获得
- 硬件的复制和模拟
- 软件使用限制的去除或者软件功能的添加
- 逆向分析技术
- 通过软件使用说明分析软件
没有编程经验,真分析不出来什么。。。。。。
-
静态分析技术:指的是直接分析得到的反汇编语句,宏观地了解软件编程思路
-
动态分析技术:静态分析可以了解各个模块的功能,但是要了解细节,只能通过动态分析。动态分析使用
OllyDbg WinDbg x32Dbg x64Dbg
等等软件
文本字符
计算机存储的信息是二进制数,屏幕上显示的是二进制转化的结果。要处理文本,就要将文本转化为相应的二进制数
-
ASCII
码是7位的编码标准,可以表示128
个代码。不同计算机商家对ASCII
码进行扩充,它们的值在127
上是不统一的,如ANSI Symbol OEM
等字符集。
在线ASCII码表 -
Unicode
是ASCII
字符编码的扩展,在Windows
中,使用2字节对其编码。所有字符都是16位
字节存储顺序
字节序,表示数据在存储器中的存放顺序,区别如下:
- Big-endian 大端法:高位字节存入低地址,低位字节存入高地址。
- Little-endian 小端法:低位字节存入低地址,高位字节存入高地址。
例如:将12345678h写入1000h开始的内存中,两种方法结果如下
注意:78是低位字节 12是高位字节
顺序 | 1000h | 1001h | 1002h | 1003h |
---|---|---|---|---|
大端法 | 12h | 34h | 56h | 78h |
小端法 | 78h | 56h | 34h | 12h |
一般来说,x86系列CPU都是 Little-endian字节序,PowerPC通常是 Big-endian字节序。因为网络协议也都是采用Big-endian方式传输数据的,所以有时也把Big-endian方式称为网络字节序。
顺便附上一段c++代码,判断机器字节序是大端还是小端
#include <iostream>
int main()
{
int i = 1;
if (*(char *)&i == 1)
std::cout << "small";
else
std::cout << "big";
return 0;
}
windows操作系统
作者建议阅读windows操作系统原理的知识
另外:如果要了解UNIX操作系统,可以看看这些网课:
南京大学蒋老师的操作系统课程
mit6.S081 这两个课程都只需要先修c语言,不过对编程能力要求极高
Win32 API函数
API英文全称为Application Programming Interface (应用程序编程接口)。在Windlows程序设计发展的初期,Windows程序员能够使用的编程工具只有API函数。
这些函数提供应用程序运行所需要的窗口管理、图形设备接口、内存管理等服务功能。这些功能以函数库的形式组织在一起,形成了Windows应用程序编程接口,简称“WinAPI"。WinAPI子系统负责将API调用转换成Windows操作系统的系统服务调用。所以,可以认为API函数是整个Windows框架的基石,它的下面是Windows操作系统核心,它的上面则是Windows应用程序。
Windows运转的核心为动态链接,在早期,windows主要功能只需在3个动态链接库(DLL)实现,Kernel
, User
,GDI
Kernel
实现了操作系统的核心服务User
负责处理用户接口GDI
为图形设备接口
关于动态链接的原理以及好处,可以阅读《程序员的自我修养》一书
在Win32API函数字符集中,“A”表示ANSI,“W”表示Widechars(即Unicode)。前者就是通常使用的单字节方式;后者是宽字节方式,以便处理双字节字符
通过bing搜索win32 API,下载对应文件,就可以随时查阅winddows API
wow64
这篇文章详细介绍wow64是什么:https://blogs.msdn.microsoft.com/tianlin/2011/10/26/syswow64/
简单来说:wow64可以让32位程序在64位操作系统上运行
虚拟内存
win32的虚拟内存空间为4GB
, 因为32位指针有00000000h~FFFFFFFFh
的任何值。2GB
内存留给操作系统自用,借助进程
这一抽象概念,每个应用程序都可以得到2GB
内存。
64位Windows操作系统提供了16TB的有效寻址空间,其中的一半可用于用户模式的应用程序。
本文结束
后记
大二上学期真挺忙的,一方面要做好网安俱乐部技术培训,一方面还要兼顾自身技术的学习。目前一边刷cs61A课程,一边学ctf逆向知识。
不过我现在已经不是俱乐部成员了,有更多时间专注于自身技术学习:)
顺便说一下,某人在俱乐部搞一言堂,非蠢即坏