- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
跟着网上的教程使用evilashz师傅的模板,下载模板解压至vs的模板目录:
%UserProfile%\Documents\Visual Studio 2022\Templates\ProjectTemplates
。
创建新项目选择刚刚新增的类型:Beacon Object File.
。
。
生成时报错,我使用的是2022版本的,模板有点老了他这里的是vs2019.
。
根据底下的提示从项目 -> 重定目标解决方案, 接着确定更新即可 。
。
但是一进来模板会报错没有引入库, 干脆就用最小测试代码:将 Source.cpp重名为Source.c并修改为如下:
#include <stdio.h>
#include <Windows.h>
#include "beacon.h"
void go(char* buff, int len) {
BeaconPrintf(CALLBACK_OUTPUT, "Hello BOF");
}
。
在上方的生成中勾选BOF配置, 配置管理器的编译环境也一样的,就可以生成64位版本的.
。
但最好还是使用批生成同时生成32位和64位版本:生成 -> 批生成 在BOF那两项勾选Win32和x64.
。
创建项目时没有勾选将解决方案和项目放在同一目录下,那么生成的.obj文件(编译未链接的目标文件)就在/bin/BOF中.
。
测试如果用cs的话可以使用inline-execute E:\TARGET\timestamp.obj。我这里执行成功但发现有乱码:
。
。
尝试了加上\n换行来终止字符串刷新缓冲区但是不行,找到使用格式化输出宏的办法,将可变参数展开。比如这里的INFO_FORMAT("Hello BOF");会被展开成BeaconPrintf(CALLBACK_OUTPUT, "[*] Hello BOF\n");.
#include <stdio.h>
#include <Windows.h>
#include "beacon.h"
#define INFO_FORMAT(fmt, ...) BeaconPrintf(CALLBACK_OUTPUT, "[*] " fmt "\n", ##__VA_ARGS__)
void go(char* buff, int len) {
INFO_FORMAT("Hello BOF");
}
原先的内存中可能是这样:"Hello BOF" <未知内存内容>,但使用宏之后就是这样的:"[*] Hello BOF\n" <确定的字符串终止>,最后测试也没有乱码了.
。
。
实现一个修改文件时间戳的功能, BOF不能直接调用Windows API, 而是通过cs提供的函数来交互。但我这里并不是为cs编写,所以要使用Windows API函数的话,首先需要进行声明:
要修改文件时间戳, 就要用到SetFileTime。它用于设置文件的创建时间、访问时间和修改时间。文档中原型如下:
BOOL SetFileTime(
[in] HANDLE hFile,
[in, optional] const FILETIME *lpCreationTime,
[in, optional] const FILETIME *lpLastAccessTime,
[in, optional] const FILETIME *lpLastWriteTime
);
。
那么在bof的声明中要注意这个函数是属于哪个dll, 比如这里是kernel32.dll的话那要定义和调用它时就写成KERNEL32$SetFileTime,完整如下:
DECLSPEC_IMPORT BOOL WINAPI KERNEL32$SetFileTime(HANDLE, const FILETIME*, const FILETIME*, const FILETIME*);
cs使用这种前缀可以让BOF直接调用DLL中的原生函数, 就不需要再在导入表中声明了,这样也可以缩小BOF体积。类似的使用CreateFileA来创建或打开文件时, 其原型如下:
HANDLE CreateFileA(
[in] LPCSTR lpFileName, // 文件名
[in] DWORD dwDesiredAccess, // 访问模式
[in] DWORD dwShareMode, // 共享模式
[in, optional] LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 安全描述符
[in] DWORD dwCreationDisposition, // 创建方式
[in] DWORD dwFlagsAndAttributes, // 文件属性
[in, optional] HANDLE hTemplateFile // 模板文件句柄
);
BOF中声明则如下:
DECLSPEC_IMPORT HANDLE WINAPI KERNEL32$CreateFileA(LPCSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE);
以及其他要用到的api可以这样声明:
// 其他必要的API
DECLSPEC_IMPORT BOOL WINAPI KERNEL32$CloseHandle(HANDLE); // 关闭一个内核对象(如文件)的句柄
DECLSPEC_IMPORT VOID WINAPI KERNEL32$GetSystemTime(LPSYSTEMTIME); // 获取当前系统时间(UTC时间)
DECLSPEC_IMPORT BOOL WINAPI KERNEL32$SystemTimeToFileTime(LPSYSTEMTIME, LPFILETIME); // 将SYSTEMTIME结构转换为FILETIME结构。
。
BOF的入口函数就是这里的go, inline-execute执行BOF时先调用这个。其中先定义并初始化一个解析器来解析传入的参数,timestamp这个至少也是要一个参数路径的,先从一个来:
void go(char* buff, int len) {
datap parser;
char* filepath;
// 解析Beacon传入的参数
BeaconDataParse(&parser, buff, len);
filepath = BeaconDataExtract(&parser, NULL);
// 参数验证
if (!filepath) {
BeaconPrintf(CALLBACK_ERROR, "[-] please provide file path");
return;
}
}
那解析多个参数呢, 一样的:
BeaconDataParse(&parser, buff, len);
sourceFile = BeaconDataExtract(&parser, NULL);
targetFile = BeaconDataExtract(&parser, NULL);
if (!sourceFile || !targetFile) {
BeaconPrintf(CALLBACK_ERROR, "[!] Error: Two file paths required\n");
BeaconPrintf(CALLBACK_ERROR, "[-] Usage: inline-execute timestamp.o \"source_file\" \"target_file\"\n");
return;
}
BeaconPrintf(CALLBACK_OUTPUT, "[-] Source: %s\n", sourceFile);
BeaconPrintf(CALLBACK_OUTPUT, "[-] Target: %s\n", targetFile);
。
接着继续,获取系统时间然后修改成我们希望的时间,比如2020年1月1日 00:00:00。然后把他转换为文件时间格式:
SYSTEMTIME st;
FILETIME ft;
KERNEL32$GetSystemTime(&st);
st.wYear = 2020;
st.wMonth = 1;
st.wDay = 1;
st.wHour = 0;
st.wMinute = 0;
st.wSecond = 0;
KERNEL32$SystemTimeToFileTime(&st, &ft);
。
准备好了要修改的时间后就尝试打开文件获取句柄:
HANDLE hFile = KERNEL32$CreateFileA(
filepath, // 文件路径
FILE_WRITE_ATTRIBUTES, // 只需要写属性权限
FILE_SHARE_READ | FILE_SHARE_WRITE, // 允许其他进程读写
NULL, // 默认安全属性
OPEN_EXISTING, // 只打开已存在的文件
FILE_ATTRIBUTE_NORMAL, // 使用标准属性
NULL // 不使用模板
);
if (hFile == INVALID_HANDLE_VALUE) {
BeaconPrintf(CALLBACK_ERROR, "[-] can not open file: %s", filepath);
return;
}
。
最后使用SetFileTime修改三个时间属性:创建时间、访问时间、修改时间。结束后关闭句柄.
if (!KERNEL32$SetFileTime(hFile, &ft, &ft, &ft)) {
BeaconPrintf(CALLBACK_ERROR, "[-] failed to change timestamp");
} else {
BeaconPrintf(CALLBACK_OUTPUT, "[+] success: %s", filepath);
}
KERNEL32$CloseHandle(hFile);
这样就简单完成了修改一个文件时间戳的功能,完整代码如下:
#include <stdio.h>
#include <Windows.h>
#include "beacon.h"
// 声明Windows API函数
DECLSPEC_IMPORT BOOL WINAPI KERNEL32$SetFileTime(HANDLE, const FILETIME*, const FILETIME*, const FILETIME*);
DECLSPEC_IMPORT HANDLE WINAPI KERNEL32$CreateFileA(LPCSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE);
DECLSPEC_IMPORT BOOL WINAPI KERNEL32$CloseHandle(HANDLE);
DECLSPEC_IMPORT VOID WINAPI KERNEL32$GetSystemTime(LPSYSTEMTIME);
DECLSPEC_IMPORT BOOL WINAPI KERNEL32$SystemTimeToFileTime(LPSYSTEMTIME, LPFILETIME);
void go(char* buff, int len) {
datap parser;
char* filepath;
BeaconDataParse(&parser, buff, len);
filepath = BeaconDataExtract(&parser, NULL);
if (!filepath) {
BeaconPrintf(CALLBACK_ERROR, "[-] please provide file path");
return;
}
SYSTEMTIME st;
FILETIME ft;
KERNEL32$GetSystemTime(&st);
st.wYear = 2020;
st.wMonth = 1;
st.wDay = 1;
st.wHour = 0;
st.wMinute = 0;
st.wSecond = 0;
KERNEL32$SystemTimeToFileTime(&st, &ft);
HANDLE hFile = KERNEL32$CreateFileA(
filepath,
FILE_WRITE_ATTRIBUTES,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if (hFile == INVALID_HANDLE_VALUE) {
BeaconPrintf(CALLBACK_ERROR, "[-] can not open file: %s", filepath);
return;
}
if (!KERNEL32$SetFileTime(hFile, &ft, &ft, &ft)) {
BeaconPrintf(CALLBACK_ERROR, "[-] failed to change timestamp");
}
else {
BeaconPrintf(CALLBACK_OUTPUT, "[+] sunccess: %s", filepath);
}
KERNEL32$CloseHandle(hFile);
}
。
编译还是同上使用批生成,我这里测试的可以成功修改:
。
。
为了更好的在苛刻环境下使用,我想继续压缩体积,找到的参数以及解释如下:
64位使用的编译命令如下
x86_64-w64-mingw32-gcc-8.1.0.exe -c .\Source.c -o timestamp.o -Os -fno-asynchronous-unwind-tables -fno-ident -fpack-struct=8 -falign-functions=1 -s -ffunction-sections -fdata-sections -fno-exceptions -fno-stack-protector -mno-stack-arg-probe
针对于编译32位版本的命令( 如果没有就用批生成, 重命名即可)
i686-w64-mingw32-gcc-8.1.0.exe -c .\Source.c -o timestamp.x86.o -Os -fno-asynchronous-unwind-tables -fno-ident -fpack-struct=8 -falign-functions=1 -s -ffunction-sections -fdata-sections -fno-exceptions -fno-stack-protector -mno-stack-arg-probe
注:这里生成的是.o而不是.obj只是自己的需求为了统一一下,obj是Windows平台的默认目标文件扩展名,而.o是Unix/Linux平台的扩展名。它们本质和功能上是一样的,只是命名习惯不同.
。
这里只是简单的示例,要使用最好要有一个锚定文件,以他的时间作为目标来修改。细节不赘述,详细请跳转Github。最终版本的使用测试如下
。
。
最后此篇关于BOF编写-修改时间戳的文章就讲到这里了,如果你想了解更多关于BOF编写-修改时间戳的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我只想从客户端向服务器发送数组 adc_array=[w, x, y, z]。下面是客户端代码,而我的服务器是在只接受 json 的 python 中。编译代码时我没有收到任何错误,但收到 2 条警告
我是 lua 和 Node js 的新手,我正在尝试将我正在开发的移动应用程序连接到服务器。问题是它连接到服务器,但我尝试传递的数据丢失或无法到达服务器。对我正在做的事情有什么问题有什么想法吗? th
我在这个页面上工作 http://www.haskell.org/haskellwiki/99_questions/Solutions/4 我理解每个函数的含义,看到一个函数可以像这样以多种方式定义,
我目前正在尝试将数据写入 excel 以生成报告。我可以将数据写入 csv 文件,但它不会按照我想要的顺序出现在 excel 中。我需要数据在每列的最佳和最差适应性下打印,而不是全部打印在平均值下。这
所以,我正在做一个项目,现在我有一个问题,所以我想得到你的帮助:) 首先,我已经知道如何编写和读取 .txt 文件,但我想要的不仅仅是 x.hasNext()。 我想知道如何像 .ini 那样编写、读
我正在尝试编写一个函数,该函数将返回作为输入给出的任何数字的阶乘。现在,我的代码绝对是一团糟。请帮忙。 function factorialize(num) { for (var i=num, i
这个问题已经有答案了: Check variable equality against a list of values (16 个回答) 已关闭 4 年前。 有没有一种简洁或更好的方法来编写这个条件
我对 VR 完全陌生,正在 AFrame 中为一个类(class)项目开发 VR 太空射击游戏,并且想知道 AFrame 中是否有 TDD 的任何文档/标准。有人能指出我正确的方向吗? 最佳答案 几乎
我正在尝试创建一个 for 循环,它将重现以下功能代码块,但以一种更具吸引力的方式。这是与 Soundcould 小部件 API 实现一起使用的 here on stackoverflow $(doc
我有一个非常令人困惑的问题。我正在尝试更改属性文件中的属性,但它只是没有更改... 这是代码: package config; import java.io.FileNotFoundException
我对 VR 完全陌生,正在 AFrame 中为一个类(class)项目开发 VR 太空射击游戏,并且想知道 AFrame 中是否有 TDD 的任何文档/标准。有人能指出我正确的方向吗? 最佳答案 几乎
我正在开发一个用户模式(Ring3)代码级调试器。它还应支持.NET可执行文件的本机(x86)调试。基本上,我需要执行以下操作: 1).NET在隐身模式下加载某些模块,而没有LOAD_DLL_DEBU
我有一个列表,我知道有些项目是不必要打印的,我正在尝试通过 if 语句来做到这一点...但是它变得非常复杂,所以有没有什么方法可以在 if 语句中包含多个索引而无需打印重写整个声明。 看起来像这样的东
我很好奇以不同方式编写 if 语句是否会影响程序的速度和效率。所以,例如写一个这样的: bool isActive = true; bool isResponding = false; if (isA
我在搜索网站的源代码时找到了一种以另一种方式(我认为)编写 if 语句的方法。 代替: if(a)b; 或: a?b:''; 我读了: !a||b; 第三种方式和前两种方式一样吗?如果是,为什么我们要
我的数据采用以下格式(HashMap的列表) {TeamName=India, Name=Sachin, Score=170} {TeamName=India, Name=Sehwag, Score=
我目前正在完成 More JOIN operations sqlzoo 的教程,遇到了下面的代码作为#12 的答案: SELECT yr,COUNT(title) FROM movie JOIN ca
我正试图找到一种更好的方法来编写这段代码: def down_up(array, player) 7.downto(3).each do |row| 8.times do |col
出于某种原因,我的缓冲区中充满了乱码,我不确定为什么。我什至用十六进制编辑器检查了我的文件,以验证我的字符是否以 2 字节的 unicode 格式保存。我不确定出了什么问题。 [打开文件] fseek
阅读编码恐怖片时,我刚刚又遇到了 FizzBuzz。 原帖在这里:Coding Horror: Why Can't Programmers.. Program? 对于那些不知道的人:FizzBu
我是一名优秀的程序员,十分优秀!