05 2020 档案
摘要:TCHAR path[255]; //获取当前用户的桌面路径 SHGetSpecialFolderPath(0, path, CSIDL_DESKTOPDIRECTORY, 0);
阅读全文
摘要:| //文件类型过滤 const TCHAR pszFilter[] = _T("EXE File (*.exe)|*.exe|Dynamic-link library (*.dll)|*.dll|Any Files (*.*)|*.*||"); //第一个参数为TRUE是打开文件,为FALSE是文
阅读全文
摘要:CString::GetLength获取的是字符数,不是字节数
阅读全文
摘要:前言: 此文是记录我遇到的问题及解决办法 环境相关: 使用的直接读写方式,这种方式会创建一个MDL,将用户空间的地址重新映射到了内核空间,这样不会发生拷贝也不会造成地址访问错误。MDL被I/O管理器创建好之后,放置在下面这个字段中 irp->MdlAddress//获取缓冲区地址需要使用MDL操作函
阅读全文
摘要:m_Menu.LoadMenu(IDR_MENU1); 上面放在OnInitDialog初始化函数里,m_Menu类型 CMenu,IDR_MENU1为菜单资源ID //右键List列表控件 ,弹出菜单 void CDriverDlg::OnNMRClickList1(NMHDR *pNMHDR,
阅读全文
摘要:/*! * 函 数 名: AddTabWnd * 日 期: 2020/05/21 * 返回类型: void * 参 数: const CString & title 要添加的选项名 * 参 数: CDialogEx * pSubWnd 要添加的选项对应的对话框类 * 参 数: UINT uId 要添
阅读全文
摘要:实现原理: 实现文件监控操作的核心函数是ReadDirecotryChangesW。这个API函数可以设置监控目录、过滤条件,从而获取监控数据。在调用API函数ReadDirecotryChangesW设置监控过滤条件之前,需要先通过CreateFile函数打开监控目录,获取监控目录的句柄。之后才能
阅读全文
摘要:实现原理: 功能主要是对设备的插入和拔出进行监控,所以只需要对WM_DEVICECHANGE消息回调函数的wParam参数进行判断即可。主要判断操作是否为设备已插入操作DBT_DEVICEARRIVAL或设备已移除操作DBT_DEVICEREMOVECOMPLETE。然后再重点分析相应操作对应的lP
阅读全文
摘要:实现原理: 管道是一种在进程间共享数据的机制,其实质是一段共享内存。Windows系统为这段共享的内存设计使用数据流I/O的方式来访问。一个进程读,另一个进程写,这类似于一个管道的两端,因此这种进程间的通信方式称为“管道”。管道分为匿名管道和命名管道。匿名管道只能在父子进程间进行通信,不能在网络间通
阅读全文
摘要:前言: 在用户层上,实现按键记录的方法也很多,常见的有3种方式,具体如下: 利用全局键盘钩子。程序设置全局键盘钩子,从而捕获按键消息,进行记录 利用GetAsyncKeyState函数。该函数可以判断按键状态,根据是否为按下状态来判断用户是否进行了按键操作,从而记录 利用原始输入模型,直接从输入设备
阅读全文
摘要://捕获桌面屏幕 BOOL CFunction::ScreenCapture() { // 获取桌面窗口句柄 HWND hDesktopWnd = ::GetDesktopWindow(); if (hDesktopWnd == NULL) { return FALSE; } // 获取桌面窗口DC
阅读全文
摘要:实现原理: WIN32 API函数CreateToolhelp32Snapshot不仅可以获取系统中所有进程的快照,还能获取系统中所有线程快照、指定进程加载模块快照、指定进程的堆快照等。所谓的快照是指,当第一次调用某个函数枚举进程的时候,它便得到了当前系统的进程信息,而第二次试图得到这个信息的时候,
阅读全文
摘要:前言: 为了实现windows上的数据压缩和解压缩,最方便的方法就是直接调用WIN32 API函数,windows系统的ntdll.dll专门提供了RtlCompressBuffer函数和RtlDecompressBuffer函数来负责数据压缩和解压缩操作,这两个函数并未公开,需要通过ntdll.d
阅读全文
摘要:前言: DLL劫持指的是,病毒通过一些手段来劫持或者替换正常的DLL,欺骗正常程序加载预先准备好的恶意DLL。如下图,LPK.dll是应用程序运行所需加载的DLL,该系统文件默认在C:\Windows\system32路径下,但由于windows优先搜索当前路径,所以当我们把恶意LPK.dll放在应
阅读全文
摘要:实现原理: 以挂起的方式打开目标进程,将ShellCode代码写入目标进程,并修改目标进程的执行流程,使其转而执行ShellCode代码,这样,进程还是目标原本进程,但执行的操作却替换成我们的ShellCode了。 实现过程: (1).调用CreateProcess以挂起的方式(CREATE_SUS
阅读全文
摘要:实现原理: 修改进程环境块中的进程路径以及命令行信息,从而达到进程伪装的效果。所以,实现的关键在于进程环境块的获取。可以通过ntdll.dll中的导出函数NtQueryInformationProcess来获取指定进程的PEB地址。因为该程序进程可能与目标进程并不在同一个进程内。由于进程空间独立性的
阅读全文
摘要:实现原理: windows系统可以设置计划任务来执行一些定时任务。创建一个计划任务,设置任务的触发条件以及执行操作。将触发条件设置为用户登录,执行操作设置为启动目标程序。这样,程序就可以实现开机自启动功能了。 注意:创建计划任务要求程序必须要有管理员权限。 实现过程: (1).初始化操作 1.初始化
阅读全文
摘要:前言: 实现开机自启动的途径和方式有很多种,其中修改注册表方式应用最为广泛。注册表相当是操作系统的数据库,记录着系统中方方面面的数据,其中也不乏直接或间接导致开机自启动的数据。 实现原理: windows提供了专门的开机自启动注册表。在每次开机完成后,它都会在这个注册表键下遍历键值,以获取键值中的程
阅读全文
摘要:前言: 将DLL文件作为资源插入到自己程序中的方法,前面已经说过了。附上链接:MFC —— 资源文件释放(为了程序更简洁) 程序需要动态调用DLL文件,内存加载运行技术可以把这些DLL作为资源插入到自己的程序中。此时直接在内存中加载运行即可,不需要再将DLL释放到本地。 实现原理: 将资源加载到内存
阅读全文
摘要:前言: 在一个进程中创建并启动一个新进程,无论是对于病毒木马程序还是普通的应用程序而言。这都是一个常见的技术,最简单的方法无非是直接通过调用WIN32 API函数创建新进程。用户层上,微软提供了WinExec、ShellExecute和CreateProcess等函数来实现进程创建 实现代码: //
阅读全文
摘要:前言: "APC"是"Asynchronous Procedure Call"(异步过程调用)的缩写,它是一种软中断机制,当一个线程从等待状态中苏醒时(线程调用SignalObjectAndWait 、SleepEx、WaitForSingleObjectEx、WaitForMultipleObje
阅读全文
摘要:前言: 之前提到,由于SESSION 0隔离机制,导致传统远程线程注入系统服务进程失败。经过前人的不断逆向探索,发现直接调用 ZwCreateThreadEx 函数将其第7个参数 CreateSuspended(CreateThreadFlags)的值置为零可以进行远程线程注入,还可以突破 SESS
阅读全文
摘要:前言: windows中大部分的应用程序都是基于消息机制的,它们都有一个消息过程函数,根据不同的消息完成不同的功能。而消息钩子是windows提供的一种消息过滤和预处理机制,可以用来截获和监视系统中的消息。按照钩子作用范围不同,又可以分为局部钩子和全局钩子。局部钩子是针对某个线程的,而全局钩子是作用
阅读全文
摘要:应用场景: 病毒木马会广泛常用资源文件释放技术。程序会将一些DLL文件、文本文件、图片文件或其它的音/视频文件作为资源插入到程序里,等到程序运行后,使用资源文件释放技术将它们释放到本地上,这样编译出来的程序只有一个exe文件,而不需要附带其它文件,因而程序变得简洁,降低了被发现的风险。 资源插入的步
阅读全文
摘要:如图代码块,查了后找到解决办法。 首先F12, 找到选择元素的 选择空白代码块 直接右键delete element
阅读全文
摘要://根据进程名获取PID DWORD CBiaoBai1Dlg::GetProcessIdByProcessName(char* pszProcessName) { //1.创建进程快照 HANDLE hSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROC
阅读全文
摘要:实现原理: 由于遍历进程通常是通过调用WIN32 API函数 EnumProcesses 或是CreateToolhelp32Snapshot 等来实现的。 通过跟踪逆向这些WIN32 API函数可知,它们内部最终是通过调用ZwQuerySystemInformation函数来检索系 统进程信息的,
阅读全文
摘要://m_Path为文件路径 //检测是否为exe LPTSTR pszExtension = PathFindExtension(m_Path); if (lstrcmp(pszExtension, L".exe") != 0) { MessageBox(_T("请先拖拽有效的exe文件")); r
阅读全文
摘要:typedef unsigned int uint; uint POLYNOMIAL = 0xEDB88320; int have_table = 0; uint table[256]; void make_table() { int i, j, crc; have_table = 1; for (
阅读全文
摘要://Md5.htypedef struct { unsigned int count[2]; unsigned int state[4]; unsigned char buffer[64]; }MD5_CTX; #define F(x,y,z) ((x&y)|(~x&z)) #define G(x,
阅读全文