加密与解密 起始
文章目录
背景
今年以来可谓是跌宕起伏,上半年未能按照自己想法换到心仪的工作岗位。下半年又因为一些现实问题搞的自己焦虑万分。回头一看今年没有干什么正事儿,却被各种事情打击的差点丧失信息怀疑自我。拉了一下自己的技能树,觉得自己一直没能在自己擅长的方向继续深耕细琢,反而揪着自己的短处忙个不停,怀疑人生。近来正好事儿少,将《加密解密》重新拾了起来,深感自己以前实用主义太深,很多技能未能找个时间仔细研究,形成积累,反而是用时现查,不久就忘。虽然感觉自己了解很多,懂得很多,但是都是根基不深,浅尝辄止。现在想基于《加密与解密》的知识结构,从基本逆向分析、加解密算法、Windows系统原理、基本的注入以及Hook技术、软件保护以及对抗技术等多个部分入手,重新归本溯源,夯实基础。希望自己能够坚持下去。
基础知识
Win32 API
API全称为“Application Programming Interface”,Win API子系统负责将API调用转换为Windows系统的系统服务调用。这些API则是由一个个的DLL(动态链接库)文件提供的。
Windows的运转核心是动态链接。Windows提供了丰富的系统调用,它们是由动态链接库(DLL)实现。目前常见的DLL文件及其提供的功能有
- kernel32.dll,操作系统核心功能服务,包括对进程以及内存的管理
- user32.dll,用户接口处理,对鼠标键盘的输入、窗口和菜单管理等
- gdi32.dll,图形设备接口,所有图像显示相关
- advapi32.dll,提供了对象安全性以及注册表的操作
- comctl32.dll,通用控件
- comdlg32.dll,通用对话框
- shell32.dll,用户界面外壳
- netapi32.dll,网络
WOW64
WOW64是“Windows-on-Windows 64-bit”的简称,即64位Windows操作系统的子系统,它使大多数32位应用程序在不修改的情况下运行在64位操作系统上。它本质上提供了一个转换成,32位程序在Windows\SysWow64
目录中寻找其需要的32位DLL文件,WOW64子系统将32位DLL中的系统请求重定向到64位系统中,从而满足了32位程序的运行要求。
Windows消息机制
Windows是一个消息驱动式的系统。Windows消息提供在应用程序与应用程序之间、应用程序与Windows系统之间进行通信的手段。应用程序想要实现的功能由消息触发,通过对消息的响应和处理完成。
Windows系统中存在两种消息队列,一个是系统消息队列,另一种是应用程序消息队列。Windows系统监测到一个事件发生后,该消息首先进入到系统消息队列中,然后再将消息复制到对应的应用程序消息队列中。应用程序会在消息循环中检索每一个消息,并将其发送到相应的窗口函数。一般来说,这个过程是非抢占性的,所有消息需要按照队列前后来执行。
常见的API及消息如下:
SendMessage
函数
调用一个窗口的窗口函数,将一条消息发送给目标窗口。除非消息处理完毕,否则不会返回。
LRESULT SendMessage(
HWND hWnd, // 目标窗口的句柄
UINT Msg, // 消息的标识符
WPARAM wParam, // 消息的WPARAM域
LPARAM lParam // 消息的LPARAM域
);
返回值: 由具体的消息决定,如果成功,返回TRUE
。
WM_COMMAND
消息
当用户从菜单或者按钮中选择一条命令或者一个控件时该消息被发送到它的父窗口,或者当一个快捷键被释放时发送。它对应的数值为0x111。
WM_COMMAND:
wNotifyCode = HIWORD(wParam);
wID = LOWORD(wParam);
hwndCtl = (HWND) lParam;
返回值: 如果程序处理,返回值为0。
WM_DESTROY
消息
一个窗口被销毁时发送,0x2,无参数。
返回值: 如果程序处理,返回值为0。
WM_GETTEXT
消息
应用程序发送WM_GETTEXT
消息,将一个对应窗口的文本复制到一个由呼叫程序提供的缓冲区中。0xD。
WM_GETTEXT:
wParam = (WPARAM) cchTextMax; // 需要复制的字符数
lParam = (LPARAM) lpszText; // 接收文本的缓冲区地址
返回值:被复制的字符数。
WM_QUIT
消息
当应用程序调用PostQuitMessage
函数时,生成WM_QUIT
消息。0x12。
WM_QUIT:
nExitCode = (int)wParam; // 退出代码
返回值: 无
WM_LBUTTONDOWN
消息
当光标停到一个窗口的客户区并且按下左键时,该消息发送。0x201。
WM_LBUTTONDOWN:
fwKeys = wParam; // key旗标
xPos = LOWORD(lParam); // 光标的水平位置
yPos = HIWORD(lParam); // 光标的垂直位置
返回值: 如果处理了该消息,返回值为0。
虚拟内存
操作系统为应用进程提供的一个抽象,让进程认为自己占有了全部的内存。其实在过程中实现了一个映射过程,转换时使用的寄存器为CR3。
对于DLL来讲,其没有“私有空间”,它们都是被映射到其他的进程中使用的。
下一部分
根据《加密与解密》内容,下一部分为调试篇,书中内容主要讲解动态调试技术以及静态分析技术,涉及内容主要是常用调试器以及IDA等各类工具的简介与使用。个人打算针对这篇自己的学习路线分为两条:
- 一条是工具使用,主要针对windbg、CE的使用,捎带复习一下OD、x64dbg以及IDA的使用方法,查找更为巧妙的方法论等;
- 第二条是主要针对调试器的实现原理,尤其是Windows平台上面与调试器实现相关的技术;
其实还有一条,就是针对反汇编引擎的学习,对于其原理个人认为在不了解编译原理的时候贸然突入是否合适,不过自己认为至少对于目前常用的capstone三件套应该有所了解,会在实际中使用它。