file-type

使用Visual Basic实现文件搜索查找程序

版权申诉

RAR文件

7KB | 更新于2025-08-07 | 105 浏览量 | 0 下载量 举报 收藏
download 限时特惠:#14.90
从给定的文件信息中可以提取出以下知识点: 1. Visual Basic 编程语言:Visual Basic(简称 VB)是一种历史悠久的编程语言,由微软公司开发,主要用于快速应用程序开发(RAD)与事件驱动编程。它允许开发者通过较为简洁的语法快速地创建Windows应用程序和其他类型的软件。VB是基于BASIC语言的,其特别适合初学者学习编程,也适合快速开发小型应用程序。 2. 文件搜索程序设计:文件搜索是编程中的一项基本功能,允许用户在指定的目录或多个目录中查找符合特定条件的文件。在Visual Basic中实现文件搜索功能,通常会涉及到使用文件系统对象(FileSystemObject)以及Dir函数。 3. SearchDirs函数:尽管没有给出SearchDirs函数的具体实现,从描述中可以推测这是一个自定义或第三方提供的函数,用来执行实际的文件搜索操作。它可能需要处理用户输入的搜索路径和文件名,然后在指定目录及其子目录中递归地查找匹配的文件。 4. 文件夹路径选取:在实现文件搜索程序时,需要允许用户选取或指定要搜索的文件夹路径。这可以通过文件对话框(FolderBrowserDialog)来实现,这是.NET框架中用于选择文件夹的标准控件。 5. 文件名搜索范围设定:用户应能指定搜索的范围,包括是否包括子目录。这可能需要提供一个选项让用户选择搜索深度,或者直接搜索当前目录(不包括子目录)。 6. 递归搜索算法:如果SearchDirs函数支持在子目录中递归搜索文件,那么它可能会使用一种递归算法。递归是计算机科学中的一种方法,通过将问题分解成更小的子问题来解决复杂问题。在文件搜索中,递归地遍历每一个子目录直到达到指定深度或找到文件。 7. 使用VB实现文件搜索的示例代码:在VB中实现文件搜索功能,大致需要以下步骤: - 创建一个用户界面,允许用户输入文件名、选择目录路径,并提供一个按钮用于触发搜索。 - 创建一个搜索函数(如SearchDirs),根据用户输入的参数进行操作。 - 在SearchDirs函数内部,使用循环遍历指定路径下的文件和文件夹。 - 利用Dir函数或FileSystemObject的相关方法检查每个文件是否符合搜索条件。 - 将找到的文件名返回给用户界面显示或存储。 8. 文件系统对象:在Visual Basic .NET中,可以使用FileSystemObject对象来访问计算机上的文件和文件夹。这个对象提供了许多用于操作文件系统的功能,比如列出文件夹内容、获取文件属性等。 9. Dir函数:Dir函数是Visual Basic中的一个内置函数,用于返回一个符合特定模式的文件或文件夹的名称。它可以用于简单地搜索文件,或者与FileSystemObject一起使用来实现更复杂的文件操作。 10. 文件搜索程序的用户界面:在用户界面方面,使用VB进行编程时,开发者可能需要设计一个简洁直观的界面,以便用户可以方便地输入搜索条件并查看搜索结果。这个界面可能包括文本框、按钮和列表框等控件。 通过上述知识点的详细说明,我们可以看出该文件信息描述了一个利用Visual Basic语言开发的文件搜索程序实例。该程序可以让用户在指定的文件夹路径下,通过输入文件名来查找文件,并且具备搜索子目录的能力。程序的核心在于SearchDirs函数的实现,该函数会调用Visual Basic中相关的文件系统操作方法,最终向用户提供搜索结果。

相关推荐

filetype

#include "stdafx.h" #include <windows.h> BOOL SetBreakPoint(PVOID pFuncAddr); BOOL ClearBreakPoint(PVOID pFuncAddr); BOOL InstallVEHHook(PVECTORED_EXCEPTION_HANDLER Handler); VOID UnInstallVEHHook(); typedef int (WINAPI* PFN_MessageBox)( HWND hWnd, // handle of owner window LPCTSTR lpText, // address of text in message box LPCTSTR lpCaption, // address of title of message box UINT uType // style of message box ); int WINAPI My_MessageBox( HWND hWnd, // handle of owner window LPCTSTR lpText, // address of text in message box LPCTSTR lpCaption, // address of title of message box UINT uType // style of message box ); LONG WINAPI VectoredHandler1(struct _EXCEPTION_POINTERS* ExceptionInfo); LONG WINAPI VectoredHandler2(struct _EXCEPTION_POINTERS* ExceptionInfo); LONG WINAPI VectoredHandler3(struct _EXCEPTION_POINTERS* ExceptionInfo); VOID ShowMsgBox(LPCTSTR lpMsg); ULONG_PTR InitTrampolineFun(); PFN_MessageBox g_OriginalMessageBoxA; PVOID g_AddrofMessageBoxA = 0; PVOID g_hVector; BYTE g_OldCode[16] = { 0 }; int main(int argc, char* argv[]) { HMODULE hUser32 = LoadLibrary("user32.dll"); g_AddrofMessageBoxA = (PVOID)GetProcAddress(hUser32, "MessageBoxA"); printf("Address of MessageBoxA = 0x%p\n", g_AddrofMessageBoxA); g_OriginalMessageBoxA = (PFN_MessageBox)InitTrampolineFun(); //跳过开头的Hook printf("Addr of VectoredHandler1 = 0x%p\n", VectoredHandler1); printf("Addr of VectoredHandler2 = 0x%p\n", VectoredHandler2); printf("Addr of VectoredHandler3 = 0x%p\n", VectoredHandler3); //选择安装一个进行测试 InstallVEHHook(VectoredHandler1); //设置断点 SetBreakPoint(g_AddrofMessageBoxA); //call ShowMsgBox("VEH Hook Test."); printf("All Finished!\n"); ClearBreakPoint(g_AddrofMessageBoxA); UnInstallVEHHook(); ShowMsgBox("Hook Cleared"); return 0; } VOID ShowMsgBox(LPCTSTR lpMsg) { MessageBoxA(NULL, lpMsg, "Test", MB_OK); } ULONG_PTR InitTrampolineFun() { ULONG_PTR uResult = 0; PBYTE pFun = NULL; #ifdef _WIN64 //x64需要申请shellcode /* USER32!MessageBoxA: 00000000`779412b8 4883ec38 sub rsp,38h 00000000`779412bc 4533db xor r11d,r11d 00000000`779412bf 44391d760e0200 cmp dword ptr [USER32!gapfnScSendMessage+0x927c (00000000`7796213c)],r11d */ pFun = (PBYTE)VirtualAlloc(NULL, 128, MEM_COMMIT, PAGE_EXECUTE_READWRITE); uResult = (ULONG_PTR)pFun; memset(pFun, 0, 128); memcpy(pFun, (PVOID)g_AddrofMessageBoxA, 4); //拷贝第一条指令,4字节,推荐使用反汇编引擎来实际计算 pFun += 4; //下一条指令构造为jmp [xxxxxx] pFun[0] = 0xFF; pFun[1] = 0x25; *(ULONG_PTR*)(pFun + 6) = (ULONG_PTR)g_AddrofMessageBoxA + 4; //跳回到原函数加4的地方 #else //x86,第一条指令是mov edi,edi,直接跳过即可 uResult = (ULONG_PTR)g_AddrofMessageBoxA + 2; #endif return uResult; } //处理方式,修改参数并返回原函数继续执行 LONG WINAPI VectoredHandler1( struct _EXCEPTION_POINTERS* ExceptionInfo ) { char* szNewMsg = "[VectoredHandler1] Hacked by pediy.com"; LONG lResult = EXCEPTION_CONTINUE_SEARCH; PEXCEPTION_RECORD pExceptionRecord; PCONTEXT pContextRecord; int ret = 0; pExceptionRecord = ExceptionInfo->ExceptionRecord; pContextRecord = ExceptionInfo->ContextRecord; ULONG_PTR* uESP = 0; printf("Exception Address = %p\n", pExceptionRecord->ExceptionAddress); if (pExceptionRecord->ExceptionCode == EXCEPTION_BREAKPOINT && pExceptionRecord->ExceptionAddress == g_AddrofMessageBoxA) { #ifdef _WIN64 //x64上前四个参数依次为RCX,RDX,R8,R9 //修改第二个参数,即LpMsg printf("lpText = 0x%p %s\n", pContextRecord->Rdx, (char*)pContextRecord->Rdx); pContextRecord->Rdx = (ULONG_PTR)szNewMsg; pContextRecord->Rip = (ULONG_PTR)g_OriginalMessageBoxA; //跳到Trampoline继续执行 #else /* 0012FF70 0040105A /CALL 到 MessageBoxA 来自 VEHHook.00401054 0012FF74 00000000 |hOwner = NULL 0012FF78 00407030 |Text = "VEH Hook" 0012FF7C 0040703C |Title = "Test" 0012FF80 00000000 \Style = MB_OK|MB_APPLMODAL 0012FF84 00401225 返回到 VEHHook.<ModuleEntryPoint>+0B4 来自 VEHHook.00401000 */ printf("ESP = 0x%p\n", pContextRecord->Esp); uESP = (ULONG_PTR*)pContextRecord->Esp; //取中断时的ESP uESP[2] = (ULONG_PTR)szNewMsg; //修改栈中的参数 pContextRecord->Eip = (ULONG_PTR)g_OriginalMessageBoxA; //跳过函数开头 #endif lResult = EXCEPTION_CONTINUE_EXECUTION; } return lResult; } //处理方式:直接调用原函数并替原函数返回 LONG WINAPI VectoredHandler2( struct _EXCEPTION_POINTERS* ExceptionInfo ) { char* szNewMsg = "[VectoredHandler2] Hacked by pediy.com"; LONG lResult = EXCEPTION_CONTINUE_SEARCH; PEXCEPTION_RECORD pExceptionRecord; PCONTEXT pContextRecord; int ret = 0; pExceptionRecord = ExceptionInfo->ExceptionRecord; pContextRecord = ExceptionInfo->ContextRecord; ULONG_PTR* uESP = 0; if (pExceptionRecord->ExceptionCode == EXCEPTION_BREAKPOINT && pExceptionRecord->ExceptionAddress == g_AddrofMessageBoxA) { #ifdef _WIN64 //x64上前四个参数依次为RCX,RDX,R8,R9 printf("RSP = 0x%p\n", pContextRecord->Rsp); uESP = (ULONG_PTR*)pContextRecord->Rsp; printf("Return Address = 0x%p\n", uESP[0]); ret = g_OriginalMessageBoxA((HWND)pContextRecord->Rcx, szNewMsg, (LPCTSTR)pContextRecord->R8, (int)pContextRecord->R9); printf("ret = %d\n", ret); //修正RSP pContextRecord->Rsp += sizeof(ULONG_PTR);//参数在寄存器中,栈中无参数,仅需跳过返回地址 //直接返回到调用者处 pContextRecord->Rip = uESP[0];//设置EIP为返回地址 #else /* 0012FF70 0040105A /CALL 到 MessageBoxA 来自 VEHHook.00401054 0012FF74 00000000 |hOwner = NULL 0012FF78 00407030 |Text = "VEH Hook" 0012FF7C 0040703C |Title = "Test" 0012FF80 00000000 \Style = MB_OK|MB_APPLMODAL 0012FF84 00401225 返回到 VEHHook.<ModuleEntryPoint>+0B4 来自 VEHHook.00401000 */ printf("ESP = 0x%p\n", pContextRecord->Esp); uESP = (ULONG_PTR*)pContextRecord->Esp; ret = g_OriginalMessageBoxA((HWND)uESP[1], szNewMsg, (LPCTSTR)uESP[3], (int)uESP[4]); printf("ret = %d\n", ret); //直接返回到调用者处 pContextRecord->Eip = uESP[0];//设置EIP为返回地址 pContextRecord->Esp += (4 + 1) * sizeof(ULONG_PTR); //4为参数个数,1为返回地址 #endif lResult = EXCEPTION_CONTINUE_EXECUTION; } return lResult; } //处理方式:直接返回,相当于过滤掉 LONG WINAPI VectoredHandler3( struct _EXCEPTION_POINTERS* ExceptionInfo ) { LONG lResult = EXCEPTION_CONTINUE_SEARCH; PEXCEPTION_RECORD pExceptionRecord = ExceptionInfo->ExceptionRecord; PCONTEXT pContextRecord = ExceptionInfo->ContextRecord; ULONG_PTR* uESP = 0; if (pExceptionRecord->ExceptionCode == EXCEPTION_BREAKPOINT && pExceptionRecord->ExceptionAddress == g_AddrofMessageBoxA) { /* 0012FF70 0040105A /CALL 到 MessageBoxA 来自 VEHHook.00401054 0012FF74 00000000 |hOwner = NULL 0012FF78 00407030 |Text = "VEH Hook" 0012FF7C 0040703C |Title = "Test" 0012FF80 00000000 \Style = MB_OK|MB_APPLMODAL 0012FF84 00401225 返回到 VEHHook.<ModuleEntryPoint>+0B4 来自 VEHHook.00401000 */ //直接返回到调用者处 #ifdef _WIN64 printf("RSP = 0x%p\n", pContextRecord->Rsp); uESP = (ULONG_PTR*)pContextRecord->Rsp; pContextRecord->Rip = uESP[0];//设置EIP为返回地址 pContextRecord->Rsp += sizeof(ULONG_PTR); //将压入栈内的参数和返回地址清理掉,4为参数个数,1为返回地址 #else printf("ESP = 0x%X\n", pContextRecord->Esp); uESP = (ULONG_PTR*)pContextRecord->Esp; pContextRecord->Eip = uESP[0];//设置EIP为返回地址 pContextRecord->Esp += (4 + 1) * sizeof(ULONG_PTR); //将压入栈内的参数和返回地址清理掉,4为参数个数,1为返回地址 #endif lResult = EXCEPTION_CONTINUE_EXECUTION; } return lResult; } BOOL InstallVEHHook(PVECTORED_EXCEPTION_HANDLER Handler) { printf("Current Handler Address = 0x%p\n", Handler); g_hVector = AddVectoredExceptionHandler(1, Handler); return g_hVector != NULL; } VOID UnInstallVEHHook() { RemoveVectoredExceptionHandler(g_hVector); } /* 0:000> u user32!messageboxA USER32!MessageBoxA: 77d507ea 8bff mov edi,edi 77d507ec 55 push ebp 77d507ed 8bec mov ebp,esp */ BOOL SetBreakPoint(PVOID pFuncAddr) { DWORD dwCnt = 0; BYTE* pTarget = (BYTE*)pFuncAddr; g_OldCode[0] = *pTarget; printf("Original Fun Head Code = 0x%02X\n", g_OldCode[0]); //修改内存页的属性 DWORD dwOLD; MEMORY_BASIC_INFORMATION mbi; VirtualQuery(pTarget, &mbi, sizeof(mbi)); VirtualProtect(mbi.BaseAddress, mbi.RegionSize, PAGE_EXECUTE_READWRITE, &dwOLD); //写入int3 *pTarget = 0xCC; //恢复内存页的属性 VirtualProtect(mbi.BaseAddress, mbi.RegionSize, dwOLD, 0); return TRUE; } BOOL ClearBreakPoint(PVOID pFuncAddr) { BYTE* pTarget = (BYTE*)pFuncAddr; //修改内存页的属性 DWORD dwOLD; MEMORY_BASIC_INFORMATION mbi; VirtualQuery(pTarget, &mbi, sizeof(mbi)); VirtualProtect(mbi.BaseAddress, mbi.RegionSize, PAGE_EXECUTE_READWRITE, &dwOLD); *pTarget = g_OldCode[0]; //恢复内存页的属性 VirtualProtect(mbi.BaseAddress, mbi.RegionSize, dwOLD, 0); return TRUE; } int WINAPI My_MessageBox( HWND hWnd, // handle of owner window LPCTSTR lpText, // address of text in message box LPCTSTR lpCaption, // address of title of message box UINT uType // style of message box ) { char newMsg[400]; char newCation[] = "标题被我改了!"; int result; if (lpText) { ZeroMemory(newMsg, 400); lstrcpy(newMsg, lpText); lstrcat(newMsg, "\n\tMessage Box hacked by pediy.com"); } printf("有人调用MessageBox...\n"); result = g_OriginalMessageBoxA(hWnd, newMsg, newCation, uType); return result; }严重性 代码 说明 项目 文件 行 禁止显示状态 详细信息 错误(活动) E0020 未定义标识符 "printf" veh hook C:\Users\17116\source\repos\veh hook\veh hook\源.cpp 41 错误(活动) E0020 未定义标识符 "printf" veh hook C:\Users\17116\source\repos\veh hook\veh hook\源.cpp 116 错误(活动) E0020 未定义标识符 "printf" veh hook C:\Users\17116\source\repos\veh hook\veh hook\源.cpp 166 错误(活动) E0020 未定义标识符 "printf" veh hook C:\Users\17116\source\repos\veh hook\veh hook\源.cpp 225 错误(活动) E0020 未定义标识符 "printf" veh hook C:\Users\17116\source\repos\veh hook\veh hook\源.cpp 243 错误(活动) E0020 未定义标识符 "printf" veh hook C:\Users\17116\source\repos\veh hook\veh hook\源.cpp 267 错误(活动) E0020 未定义标识符 "printf" veh hook C:\Users\17116\source\repos\veh hook\veh hook\源.cpp 314 错误 C1083 无法打开包括文件: “stdafx.h”: No such file or directory veh hook C:\Users\17116\source\repos\veh hook\veh hook\源.cpp 3 错误(活动) E1696 无法打开 源 文件 "stdafx.h" veh hook C:\Users\17116\source\repos\veh hook\veh hook\源.cpp 3 错误(活动) E0167 "LPCTSTR" (aka "const WCHAR *") 类型的实参与 "LPCSTR" (aka "const CHAR *") 类型的形参不兼容 veh hook C:\Users\17116\source\repos\veh hook\veh hook\源.cpp 68 错误(活动) E0167 "const char *" 类型的实参与 "LPCWSTR" (aka "const WCHAR *") 类型的形参不兼容 veh hook C:\Users\17116\source\repos\veh hook\veh hook\源.cpp 39 错误(活动) E0167 "const char *" 类型的实参与 "LPCWSTR" (aka "const WCHAR *") 类型的形参不兼容 veh hook C:\Users\17116\source\repos\veh hook\veh hook\源.cpp 312 错误(活动) E0167 "const char *" 类型的实参与 "LPCTSTR" (aka "const WCHAR *") 类型的形参不兼容 veh hook C:\Users\17116\source\repos\veh hook\veh hook\源.cpp 55 错误(活动) E0167 "const char *" 类型的实参与 "LPCTSTR" (aka "const WCHAR *") 类型的形参不兼容 veh hook C:\Users\17116\source\repos\veh hook\veh hook\源.cpp 62 错误(活动) E0144 "const char *" 类型的值不能用于初始化 "char *" 类型的实体 veh hook C:\Users\17116\source\repos\veh hook\veh hook\源.cpp 108 错误(活动) E0144 "const char *" 类型的值不能用于初始化 "char *" 类型的实体 veh hook C:\Users\17116\source\repos\veh hook\veh hook\源.cpp 152 错误(活动) E0167 "char *" 类型的实参与 "LPWSTR" (aka "wchar_t *") 类型的形参不兼容 veh hook C:\Users\17116\source\repos\veh hook\veh hook\源.cpp 311 错误(活动) E0167 "char *" 类型的实参与 "LPWSTR" (aka "wchar_t *") 类型的形参不兼容 veh hook C:\Users\17116\source\repos\veh hook\veh hook\源.cpp 312 错误(活动) E0167 "char *" 类型的实参与 "LPCTSTR" (aka "const WCHAR *") 类型的形参不兼容 veh hook C:\Users\17116\source\repos\veh hook\veh hook\源.cpp 169 错误(活动) E0167 "char *" 类型的实参与 "LPCTSTR" (aka "const WCHAR *") 类型的形参不兼容 veh hook C:\Users\17116\source\repos\veh hook\veh hook\源.cpp 315 错误(活动) E0167 "char *" 类型的实参与 "LPCTSTR" (aka "const WCHAR *") 类型的形参不兼容 veh hook C:\Users\17116\source\repos\veh hook\veh hook\源.cpp 315