PE文件解析 基础篇
前言 - 之前学习了PE格式,为了更好的理解,决定写一个类似LoadPE的小工具。
- 编译器是VS2015,采用MFC框架。
- 此系列文章采用边介绍知识点,边写代码的形式,以免变的无聊丧失兴趣。
- PE知识请参照《加密与解密》第10章。
PE文件格式1. PE文件基本概念 - PE文件是windows系统中遵循PE结构的文件,比如以.exe .dll为后缀名的文件以及系统驱动文件。(PE结构框架看下图)
前言 - 之前学习了PE格式,为了更好的理解,决定写一个类似LoadPE的小工具。
PE文件格式1. PE文件基本概念 - PE文件是windows系统中遵循PE结构的文件,比如以.exe .dll为后缀名的文件以及系统驱动文件。(PE结构框架看下图)
如何获取?http://xingyue.artizen.me
| |
starts_with 和 ends_withC++ 标准模板库的 std::string 很好很强大,但是并没有提供判断一个字符串是否以另一个字符串开始/结束的接口。这里为 std::basic_string<charT> 提供这两个接口。
Linux下有三个命令:ls、grep、wc。通过这三个命令的组合可以统计目录下文件及文件夹的个数。
转载自 https://onebox.site/archives/250.html
说到如何在Linux命令行下下载Google网盘(云端硬盘)的文件,第一个想到的应该是gdrive(prasmussen/gdrive),这个脚本可以下载、上传、同步等功能,当然需要事先命令gdrive about关联网盘,显然适合自己使用。
| |
| |
/home/minio/.minio/certs

GDI: Graphics Device Interface,图形设备接口,这是Windows提供的一组用于绘制图像的API
GUI: Graphical User Interface,图形用户界面,是指用户操作软件的界面方式,以区别于字符方式

WindowProc()线程消息队列 处理

消息机制

创建窗口的几个步骤
demo : https://github.com/luodaoyi/cpp_code/tree/master/MemoryInjectTool/CreateWindows
//1 创建窗口类型模板
WNDCLASS wndclass = { 0 };
wndclass.lpszClassName = className; //名字
wndclass.hbrBackground = (HBRUSH)COLOR_BACKGROUND; //背景画笔句柄
wndclass.hInstance = hInstance; //窗口过程的实例句柄
wndclass.lpfnWndProc = WndProc; //窗口过程函数
//2 注册窗口
RegisterClass(&wndclass);
//3 创建窗口
HWND hwindows = CreateWindow(className, TEXT("MYWINDOWS"), WS_OVERLAPPEDWINDOW, 500, 300, 300, 250, NULL, NULL, hInstance,NULL);
//创建窗口
HWND hsitc1 = CreateWindow(L"STATIC", TEXT("账号:"), WS_CHILD | WS_VISIBLE, 10, 30, 50, 20, hwindows, HMENU(IDC_STATIC1), hInstance, NULL);
HWND hstic2 = CreateWindow(L"STATIC", TEXT("密码"), WS_CHILD | WS_VISIBLE, 10, 80, 50, 20, hwindows, HMENU(IDC_STATIC2), hInstance, NULL);
HWND hedit1 = CreateWindow(L"EDIT", NULL, WS_CHILD | WS_VISIBLE, 80, 30, 100, 20, hwindows, HMENU(IDC_EDIT1), hInstance, NULL);
HWND hedit2 = CreateWindow(L"EDIT", NULL, WS_CHILD | WS_VISIBLE, 80, 80, 100, 20, hwindows, HMENU(IDC_EDIT2), hInstance, NULL);
HWND hbutt1 = CreateWindow(L"BUTTON", TEXT("登录"), WS_CHILD | WS_VISIBLE, 50, 120, 50, 25, hwindows, HMENU(IDC_BUTTM1), hInstance, NULL);
HWND hbutt2 = CreateWindow(L"BUTTON", TEXT("取消"), WS_CHILD | WS_VISIBLE, 110, 120, 50, 25, hwindows, HMENU(IDC_BUTTM2), hInstance, NULL);
//4 显示窗口
ShowWindow(hwindows,SW_SHOW);
//5 构建消息循环
MSG msg = { NULL };
while (GetMessage(&msg,NULL,NULL,NULL))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
在http://msdn.itellyou.cn/网站上下载的是office2016是零售版的,转换为vol,将下列文本另存为bat文件,运行即可
@ECHO OFF&PUSHD %~DP0
setlocal EnableDelayedExpansion&color 3e & cd /d "%~dp0"
title office2016 retail转换vol版
%1 %2
mshta vbscript:createobject("shell.application").shellexecute("%~s0","goto :runas","","runas",1)(window.close)&goto :eof
:runas
if exist "%ProgramFiles%\Microsoft Office\Office16\ospp.vbs" cd /d "%ProgramFiles%\Microsoft Office\Office16"
if exist "%ProgramFiles(x86)%\Microsoft Office\Office16\ospp.vbs" cd /d "%ProgramFiles(x86)%\Microsoft Office\Office16"
:WH
cls
echo.
echo 选择需要转化的office版本序号
echo.
echo --------------------------------------------------------------------------------
echo 1. 零售版 Office Pro Plus 2016 转化为VOL版
echo.
echo 2. 零售版 Office Visio Pro 2016 转化为VOL版
echo.
echo 3. 零售版 Office Project Pro 2016 转化为VOL版
echo.
echo. --------------------------------------------------------------------------------
set /p tsk="请输入需要转化的office版本序号【回车】确认(1-3): "
if not defined tsk goto:err
if %tsk%==1 goto:1
if %tsk%==2 goto:2
if %tsk%==3 goto:3
:err
goto:WH
:1
cls
echo 正在重置Office2016零售激活...
cscript ospp.vbs /rearm
echo 正在安装 KMS 许可证...
for /f %%x in ("dir /b ..\root\Licenses16\proplusvl_kms*.xrm-ms") do cscript ospp.vbs /inslic:"..\root\Licenses16\%%x" >nul
echo 正在安装 MAK 许可证...
for /f %%x in ("dir /b ..\root\Licenses16\proplusvl_mak*.xrm-ms") do cscript ospp.vbs /inslic:"..\root\Licenses16\%%x" >nul
echo 正在安装 KMS 密钥...
cscript ospp.vbs /inpkey:XQNVK-8JYDB-WJ9W3-YJ8YR-WFG99
goto :e
:2
cls
echo 正在重置Visio2016零售激活...
cscript ospp.vbs /rearm
echo 正在安装 KMS 许可证...
for /f %%x in ("dir /b ..\root\Licenses16\visio???vl_kms*.xrm-ms") do cscript ospp.vbs /inslic:"..\root\Licenses16\%%x" >nul
echo 正在安装 MAK 许可证...
for /f %%x in ("dir /b ..\root\Licenses16\visio???vl_mak*.xrm-ms") do cscript ospp.vbs /inslic:"..\root\Licenses16\%%x" >nul
echo 正在安装 KMS 密钥...
cscript ospp.vbs /inpkey:PD3PC-RHNGV-FXJ29-8JK7D-RJRJK
goto :e
:3
cls
echo 正在重置Project2016零售激活...
cscript ospp.vbs /rearm
echo 正在安装 KMS 许可证...
for /f %%x in ("dir /b ..\root\Licenses16\project???vl_kms*.xrm-ms") do cscript ospp.vbs /inslic:"..\root\Licenses16\%%x" >nul
echo 正在安装 MAK 许可证...
for /f %%x in ("dir /b ..\root\Licenses16\project???vl_mak*.xrm-ms") do cscript ospp.vbs /inslic:"..\root\Licenses16\%%x" >nul
echo 正在安装 KMS 密钥...
cscript ospp.vbs /inpkey:YG9NW-3K39V-2T3HJ-93F3Q-G83KT
goto :e
:e
echo.
echo 转化完成,按任意键退出!
pause >nul
exit
HANDLE WINAPI CreateToolhelp32Snapshot(
DWORD dwFlags,
DWORD th32ProcessID
)
//dwFlags:
TH32CS_SNAPMODULE 遍历模块
(Process Environment Block 进程环境块)
存放进程信息,每个进程都有自己的PEB信息
文件系统是操作系统用于管理磁盘上文件的方法和数据结构,简单说就是在磁盘上如何组织文件的方法,是软件层面的东西

如果说进程是个大房子,那么线程是进程中干活的人
线程是进程的灵魂使用进程提供的数据 执行进程提供的代码
临时数据存储在计算机的寄存器中
利用之前学习过的内存知识,例如映射类型的内存块
将这些公共代码放在文件中没在进程运行的时候在加载该文件
并且在内存中只需要加载一边,不同进程使用同一份公共代码时,只需要将之前加载过的这个文件映射到自己内存中即可

项目编译生成后会产生一个 .lib文件
磁盘中文件系统的具体文件为后备存储的页交换文件(文件映射)页交换文件("虚拟内存")为后备存储器的页交换文件(共享内存)通过CreateFileMapping api 创建文件映射内核对象,在内存中申请空间(物理内存和虚拟内存)
通过MapViewOfFile 在响应的进程虚拟内存空间中预定对应空间,并且把上一步的内存映射到进程虚拟空间中。
这样就实现了共享内存

私有类型:
使用VitualAlloc申请分配/调拨内存后,申请的内存只能被当前进程使用。其他进程无法访问。这就是所谓的私有内存
进程容器中4GB空间的内容分布

在所谓的4GB空间内,系统内核占据了高2GB的空间,普通进程看不见摸不着,而且高2GB的空间是全局共享。全局就那么一份,各个进程间共享
//创建一个时间对象
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes, // SD 安全属性
BOOL bManualReset, // reset type 0自动复位(互斥)、1手动复位(通知模式)
BOOL bInitialState, // initial state 初始创建时时间是否具备信号
LPCTSTR lpName // object name 对象的名称
);
//将目标事件对象设置为有信号的(同时通知其他线程)
BOOL SetEvent(
HANDLE hEvent // handle to event //目标事件的句柄
);
//将目标事件对象设置为无信号的
BOOL ResetEvent(
HANDLE hEvent // handle to event 目标事件的句柄
);
回顾互斥模式
cd /etc/sudoers.d
sudo touch nopasswd4sudo
sudo vi nopasswd4sudo
//输入
ubuntu ALL=(ALL) NOPASSWD : ALL
ESC :wq!