我们日常测试中,有时候有些辅助程序文件比如一些配置文件需要放在主程序执行文件同样的位置,便于管理和调用,这时候我们就需要获取执行文件的绝对路径。
C++ 17 中可以使用 std::filesystem::current_path,参见 https://en.cppreference.com/w/cpp/filesystem/current_path
跨平台的网络通信,跟设备的集成控制,牵扯到在各种平台下的文件搜索问题,windows下面的已经有了。
利用环境变量自删除 void DeleteMyself() { TCHAR szFile[MAX_PATH], szCmd[MAX_PATH]; if ((GetModuleFileName(0, szFile, MAX_PATH) != 0) && (GetShortPathName(szFile, szFile, MAX_PATH) != 0)) { lstrcpy(szCmd, TEXT("/c de
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/170225.html原文链接:https://javaforall.cn
http://download.csdn.net/detail/wangyaninglm/8301303
const char* p == char const *p 常量指针,表示指向的内容为常量,指针的指向可以修改,指针指向的内容不能修改。
控制集成系统需要了解系统的各项硬件信息,之前我们设计的时候,习惯使用c函数来搞,后来可能发现程序的移植性收到了一些影响,比如unix内核的一些c函数在linux下面是没有的:
WinInet(Windows Internet)是 Microsoft Windows 操作系统中的一个 API 集,用于提供对 Internet 相关功能的支持。它包括了一系列的函数,使得 Windows 应用程序能够进行网络通信、处理 HTTP 请求、FTP 操作等。WinInet 提供了一套完整的网络通信工具,使得开发者能够轻松地构建支持网络功能的应用程序,涵盖了从简单的 HTTP 请求到复杂的文件传输等多种网络操作。
原本以为这是一个非常简单的 CASE,直接用 GetModuleFileName 不就行了吗?结果还真不如我所想。无论程序运行过程中被改名成什么样子,GetModuleFileName 返回的都是 EXE 开始运行时的名字。然后又尝试了 GetProcessImageFileName,也是如此,直到最后找到了 QueryFullProcessImageName。
处理文件路径信息是经常要用到的字符串处理的手段,应用场景非常的多,不论是 Linux 还是 Windows,在我没接触这一系列函数之前,都是使用一系列字符串处理函数来自己写。而在 Windows 环境下,系统给我们提供了一系列处理路径相关的 API,我们在需要使用的时候直接调用即可,不但可以避免自己使用字符串处理函数处理时可能造成的各种问题,还可以加快我们编程的速度。当然如果你还没有使用字符串处理函数自己处理过路径等信息,我强烈建议你先自己尝试学习一下。轮子可不重复制造,但你必须要清楚轮子的制作工艺,否则在出现故障时就不知道如何处理了。
通常的主机中没有这样的文件和目录;但是,它们存在于特定的虚拟环境和沙箱中。如果存在此类项目,则可以检测到虚拟环境。
2021年4月23日 晴。 结束了这一天的工作,回到酒店准备洗完澡朋友朋友搓两把war3。 洗澡的过程中,蹦出了一个想法:如何优雅简洁地把自身进程变为杀软可信的进程呢? 一直想到洗完澡,突然想到:父进程如果是系统进程比如services.exe csrss.exe之类的不就好了。灵光一闪:即时调试器!如果设置了即时调试器,当程序发生异常后不就会自行启动了!!! 当即我就鸽了朋友开始新建项目。 写好的恶意程序设置为即时调试器时,然后添加自启动。 果然杀软没拦截,而且最顶级的父进程居然是wininit.exe
创建不可删除文件: 创建不可删除文件关键在于在子目录中创建一个\\anti...\\文件,该文件在系统中有特殊用途.
理解了如何通过调试事件输出当前进程中寄存器信息,那么实现加载DLL模块也会变得很容易实现,加载DLL模块主要使用LOAD_DLL_DEBUG_EVENT这个通知事件,该事件可检测进程加载的模块信息,一旦有新模块被加载或装入那么则会触发一个通知事件,利用该方法并配合磁盘路径获取函数则可很容易的实现进程模块加载的监控。
外部输入的参数不能直接作为文件路径,防止被恶意攻击,比如构造一个跨目录限制的文件路径…/…/…/etc/passwd或…/…/boot.ini,或构造一个指向系统关键文件的链接文件symlink(“/etc/shadow”,“tmp/log”)。PS "./“表示当前目录,可以不写,”…/"表示当前目录的上一级目录,即当前目录的父目录。windows可以用PathCanonicalizeA或者PathCanonicalizeW检查文件目录是否标准,但是微软msdn官网不建议使用PathCanonicalize这个函数,如下图所示:
Explore 下窗口是Z序的 , 实际上就是根据 第一个参数 和 第2个参数 来找 第2个参数后的一个窗口:
在处理文件系统路径的时候,我们一般会先开辟一块内存区,用来接收路径、或者拼接好路径传递给系统调用。这是因为路径在各个系统上都有最大长度限制,在 Windows 上这个值是 MAX_PATH,一般不能超过 260;在 Linux 上这个值是 PATH_MAX,一般不能超过 4096 (或者通过 pathconf (_PC_PATH_MAX, ...) 来获取,但是一般也是 4096),就像下面这段典型的代码:
#include <stdio.h> #include <windows.h> #include <tlhelp32.h> #include <string> #include <tchar.h> #include <Psapi.h> #pragma comment (lib,"Psapi.lib") BOOL DosPathToNtPath(LPTSTR pszDosPath, LPTSTR pszNtPath) { TCHAR szDriveStr[500];
注意:如果要打包成.exe发给别,要将debug模式变成release模式即发布模式
最近在重构一个项目的时候需要用到遍历系统账户信息和每个账户的 SID 信息用来对比数据,所以就涉及到如何获取 Windows 的账户信息,以及每个账户所关联的 SID。学习了一些前辈的代码后自己总结了一下记录在博客里,方便以后使用。
-------------------------------------------------------
#include <windows.h> #include <tlhelp32.h> //进程快照函数头文件 #include <stdio.h> bool getProcess(const char *procressName) //此函数进程名不区分大小写 { char pName[MAX_PATH]; //和PROCESSENTRY32结构体中的szExeFile字符数组保持一致,便于比较
枚举注册表启动项: 通过添加注册表启动项,可以很方便地完成自启动,常用的启动位置有CurrentVersion,BootExecute,Active Setup.
上代码: #include <QDebug> #include <windows.h> #pragma comment(lib,"user32.lib") /* 回调函数,用于捕获进程 */ BOOL MyEnumProc(HWND hwnd, LPARAM param) { LPWSTR lpString = (LPWSTR)malloc(sizeof(WCHAR) * MAX_PATH); if (IsWindow(hwnd) && IsWindowEnable
FString a = "NingStudio"; //FString to std::string std::string cstr(TCHAR_TO_UTF8(*a)); //std::string to FString FString a = FString(cstr.c_str()); string转为TCHAR void string2tchar(std::string &src, TCHAR* buf) { #ifdef UNICODE _stprintf_s(buf, MAX
纤程本质上也是线程,是多任务系统的一部分,纤程为一个线程准并行方式调用多个不同函数提供了一种可能,它本身可以作为一种轻量级的线程使用。它与线程在本质上没有区别,它也有上下文环境,纤程的上下文环境也是一组寄存器和调用堆栈。它是比线程更小的调度单位。注意一般我们认为线程是操作系统调用的最小单位,而纤程相比于线程来说更小,但是它是有程序员自己调用,而不由操作系统调用。系统在调度线程的时候会陷入到内核态,线程对象本身也是一种内核对象,而纤程完全是建立在用户层上,它不是内核对象也没有对象的句柄。通过纤程的机制实际就绕开了Windows的随机调度线程执行的行为,调度算法由应用程序自己实现,这对一些并行算法非常有意义。因为纤程和线程本质上的类同性,所以也要按照理解线程为函数调用器的方式来理解纤程。
通过GetModuleFileNameEx来获取. 他是在Psapi头文件中.但是还需要加载lib.
DotNet4应用程序打包工具(把DotNet4安装程序打包进你的应用程序;WINAPI开发,无dotNet环境也可顺利执行)【一】整体思路
遍历每个进程,一次查找进程下的窗口,找到窗口标题为 “” ,窗口类名为 “RunDll” 的窗口。如果找到返回 true ,没找到返回 false。
方法3(推荐) 目前没有发现 Bug,无法读取应用程序拒绝访问的进程路径,其他没有问题。
本程序使用C语言编写,调用的Windows API,所以只能在windows上运行
Zlib是一个开源的数据压缩库,提供了一种通用的数据压缩和解压缩算法。它最初由Jean-Loup Gailly和Mark Adler开发,旨在成为一个高效、轻量级的压缩库,其被广泛应用于许多领域,包括网络通信、文件压缩、数据库系统等。其压缩算法是基于DEFLATE算法,这是一种无损数据压缩算法,通常能够提供相当高的压缩比。
在Qt中获取应用程序全路径非常简单,直接使用`QCoreApplication::applicationDirPath()`这个静态函数就OK了,
在Qt中获取应用程序全路径非常简单,直接使用QCoreApplication::applicationDirPath()这个静态函数就OK了,
Set wshnetwork = CreateObject(“WScript.Network”) ‘获取当前电脑用户信息
注册表是一个数据库,它的结构同逻辑磁盘类似。注册表包含键(Key),它类似磁盘中的目录,注册表还包含键值(Value),它类似磁盘中的文件。一个键可以包含多个子健和键值,其中键值用于存储数据,顶层建称为根键,注册表的根键如下图(Win+R 输入命令 regedit ):
本文主要说明在Windows下操作文件的高级方法,比如直接读写磁盘,文件的异步操作,而文件普通的读写方式在网上可以找到一大堆资料,在这也就不再进行专门的说明。
CString szTemp = “d:\VS project\IniPractice\debug\IniPractice.exe”;
PathFileExists函数参数传入的要包含文件名(含文件格式)。 存在该文件,则返回TRUE, 相反,返回FALSE. 调用函数,传参
在软件开发中,我们如果存在“导入导出”的场景时,难免会用到“文件夹”选择框。之前一直没有太关注过这个的实现过程。最近在工作中遇到了一些问题,我做了一些研究。在此记录下研究的过程。(转载请指明出于breaksoftware的csdn博客)
监视对指定目录的更改,并将有关更改的信息打印到控制台,该功能的实现不仅可以在内核层,在应用层同样可以。程序中使用ReadDirectoryChangesW函数来监视目录中的更改,并使用FILE_NOTIFY_INFORMATION结构来获取有关更改的信息。
// 获取 Temp 目录路径 TCHAR lpTempPathBuffer[MAX_PATH]; GetTempPath(MAX_PATH,lpTempPathBuffer); // 拼接字符窜 std::string inPath = lpTempPathBuffer; inPath.append("\\*"); // 遍历 Temp 目录下的文件 struct _finddata_t fileinfo; long handle = _findfirst(i
本文主要分享钓鱼马的制作思路,也都是尝试,经验不够丰富 。关于邮件投递的问题,后续我们展开来讲。
导言 继上篇《用Qt写软件系列二:QIECookieViewer》之后,有一段时间没有更新博客了。这次要写的是一个简单的系统工具,需求来自一个内部项目。功能其实很简单,就是查看当前当前系统中运行的进程信息以及系统中已安装软件信息。说出来也就这么两句话,然而做起来的时候,问题却层出不穷。另外,一直想研究一下Qt中的样式表(Style Sheet)的使用,就这这个机会实践了一下,也算收获颇多。 这一篇主要讲该工具的底层实现。前面也说过,这个小工具总共有有两个功能:查看进程信息和已安装软件
内存泄露带来的问题我想我就不必多少了,检测内存泄露有很多种方法,比如使用一些智能指针。但本文介绍的方法有些不同,我们将自己维护一个数组列表,记录下 new 内存时代码所在的文件、行号、以及大小、和是否已经被 delete 信息,将这些信息放到我们维护的数组中,当程序要检查内存泄露或者程序退出时,我们遍历整个堆内存,并把每一个堆内存块在我们维护的数组中遍历,如果发现某些内存并没有被标记为 delete 状态,那么则判定为泄露。
在使用VC++进行开发时,如果按F5进行Debug时,当前相对资源是相对工程的vcxproj的文件夹目录,而直接双击运行exe时,资源是相对exe的文件夹目录。为了兼容这二者,最好使用绝对路径,这样无法是Debug还是直接双击运行exe时都不会遇到无法加载资源的问题。
领取专属 10元无门槛券
手把手带您无忧上云