Tag: winapi

如何检查stdout是否已被重定向到Windows上的NUL(在Linux上也称为/ dev / null)?

如何检查我的程序的stdout是否已重定向到NUL ? 这样我就可以避免输出数据,因为它毫无意义。 我主要需要这个用于Windows,但如果你有一个Linux解决方案,它可能对将来的其他人有所帮助,所以也可以随意发布。

新创建的暂停进程的EIP仅在Windows XP上失败 – 在kernal32.dll映像下的EIP?

我的程序在Windows Vista Ultimate和Windows 7上运行完美,但在Windows XP上运行失败。 首先,我的应用程序创建一个系统文件的进程,它调用GetThreadContext(remote_thread)并将LPVOID值设置为值context-> Eip,然后检查从VirtualQueryEx设置的结构MEMORY_BASIC_INFORMATION中的值。 以下是VirtualQueryEx在调用时返回的值: Windows XP 0 – 分配基础 0 – 分配保护 2088828928 – 基地址 1 – 保护 983040 – 地区大小 65536 – 状态 0 – 类型 Windows 7的 2003959808 – 分配基础 128 – 分配保护 2004025344 – 基地址 32 – 保护 876544 – 区域大小 4096 – 国家 16777216 – 类型 Windows […]

对win32 GUI的拖放支持

我使用win32 API创建了非MFC GUI,带有简单的Edit控件和按钮。 现在我需要将浏览器URL拖放到我的GUI应用程序的编辑控件之一,我该怎么做? 是Win32 Api支持这个function吗?

C将参数作为void-pointer-list传递给LoadLibrary()中的导入函数

我遇到的问题是我想创建一个通用命令行应用程序,可用于加载库DLL,然后调用库DLL中的函数。 函数名称在命令行中指定,参数也在实用程序命令行中提供。 我可以使用LoadLibrary()函数从动态加载的DLL访问外部函数。 加载库后,我可以使用GetProcAddress()获取指向函数的指针。我想用命令行中指定的参数调用函数。 我可以将void-pointer-list传递给我从LoadLibrary()函数返回的函数指针,类似于下面的示例? 为了简化示例代码,我删除了错误检查。 有没有办法让这样的工作: //在另一个dll的某个地方 int DoStuff(int a,int b) { 返回a + b; } int main(int argc,char ** argv) { void * retval; void * list = argv [3]; HMODULE dll; void *(* generic_function)(void *); dll = LoadLibraryA(argv [1]); // argv [2] =“DoStuff” generic_function = GetProcAddress(dll,argv [2]); // argv [3] = 4,argv […]

读取进程的起始地址和长度(虚拟内存映射)

从这里开始 我需要知道如何读取进程的起始地址和长度(虚拟内存映射)。 我想映射进程内存。 我想读取进程内存的值并将值写入它们。 我很好奇Cheat-O’matic(cheat-o-matic.softonic.com.br)这样的程序是如何工作的。 我想的第一件事是该进程将被加载到一个连续的内存位置。 但这似乎不对。

无法在Windows 8上使用SetSystemTime设置时钟

我的应用程序使用SetSystemTime()从GPS源设置PC时钟。 这在Windows 7中正常工作,禁用了用户帐户控制,但在Windows 8中,即使禁用了UAC,也会失败。 我得到的错误是ERROR_PRIVILEGE_NOT_HELD 。 登录计算机的用户位于Administrators组中。 如果我从资源管理器中的文件上下文菜单中以“以管理员身份运行”运行应用程序,我只能使其工作 – 但登录用户是管理员。 那么……在Windows 8上我需要做些什么才能使SetSysytemTime()工作? 我是否需要比当前用户的管理员权限更高的权限? 如果是这样,什么比管理员更高的特权? 或者我是否需要以不同方式设置用户帐户以允许这些类型的呼叫在Windows 8上运行? 编辑:如评论中所述,手动尝试启用SE_SYSTEMTIME_NAME权限不起作用。 也没有尝试使用建议的LsaAddAccountRights MSDN方法添加权限。

x86代码从x64进程注入x86进程

我意识到标题有点令人费解,所以让我解释一下我要做的事情: 我刚刚编写了一个简单的DLL注入器,用于我正在尝试编写的概念certificate。 该程序获取当前进程的快照,枚举进程树,并将DLL注入其直接父进程。 现在,在理想条件下,工作正常:32位版本的注入器可以注入到32位父进程中,64位版本的注入器可以注入到64位父进程中。 不过,我现在要做的是从x64注入器向32位父进程注入32位DLL。 一旦注入了DLL,我就希望再注入一个由注入的DLL导出的函数。 不过,我不确定是否真的可以做到。 (我已经汇总了一些代码来确定父进程是32位进程还是64位进程,所以这不是问题) 现在,我已经找到了一些代码,它们似乎通过将预编译的机器代码注入到流程中来完成第一部分。 (至少,我认为这就是它正在做的事情)通常,在注入对LoadLibraryW的调用之后,我将获得该调用返回的地址,将相对偏移量添加到我想要调用的导出函数,并注入一个调用function。 在这种情况下,我无法将32位库加载到我的64位注入器中,因此我无法像通常那样使用GetProcAddress找到函数的相对偏移量。 我通过以下方式解决了这个问题: 由于我无法使用常规方法找到32位DLL的函数偏移量,因此我正在将文件读入缓冲区,使用该缓冲区填充IMAGE_NT_HEADERS32结构,并枚举IMAGE_EXPORT_DIRECTORY以查找名称和相对偏移量所有导出的function。 所以在这一点上,我有以下内容: 32位DLL加载到32位进程中 在32位进程中运行以下代码时,该值等效于funcAddr: 码: HMODULE hInjectedDLL = LoadLibrary(“mydll.dll”); DWORD funcAddr = (DWORD)GetProcAddress(hInjectedDLL, “ExportedFunc”) – (DWORD)hInjectedDLL; 从理论上讲,我现在需要的只是hInjectedDLL的值,我应该可以调用该函数。 但遗憾的是,我对组装或机器代码知之甚少,知道如何获得该值。 有任何想法吗? (另外,我知道通过编译两个版本的注入器可以省去很多麻烦,当父进程的处理器架构不匹配时,让一个运行另一个版本。我试图避免去不过这条路线。) 编辑 :想想它可能有助于解释我在这个概念certificate中实际想要完成的事情。 我正在尝试一个想法,我必须允许在当前控制台中执行子进程,而不需要原始进程等待子进程完成。 由于在控制台应用程序中没有用于执行此操作的内置API,因此您通常会遇到一个进程树,所有进程都在等待各自的子进程完成。 为了实现此function,我想执行以下操作: 注射 DLL注入器将扮演“执行进程”的角色。 (通常必须等到子进程完成的进程)运行时,它确定其父进程的平台,以及父进程是否甚至是基于控制台的应用程序。 如果不是,则该过程仅使用exec系列函数来运行所需的子进程,立即退出。 如果父进程是控制台应用程序,则进程确定要使用的DLL,挂起最初创建注入进程的线程,然后将DLL注入父进程。 解决我们的职能 一旦DLL就位,注入器就会确定DLL导出的函数的地址。 (通常,我通过调用CreateRemoteThread来执行初始注入,然后在该线程上使用GetExitCodeThread来获取父进程中DLL的基址。一旦我有了这个,就可以通过简单的算法找到地址我们导出的函数,然后我可以使用它来注入该函数的第二次调用。 呼唤我们的function 导出的函数将类似于: BOOL RewriteHProcess(HANDLE hProcess) 注入器将再次使用CreateRemoteThread从父进程的上下文调用此函数,其中hProcess是注入器进程的句柄。 在DLL方面,该函数会做两件事之一(我不太确定我的第一个想法是否可行,考虑到跨线程的内存访问的安全限制,所以我把第二个想法放在一起,如果首先没有成功。) RewriteHProcess将打开先前挂起的线程进行读写,并使用ReadProcessMemory ,它将在进程的内存中搜索HANDLE到我们的注入器进程。 (我们假设父进程当前正在阻止使用WaitForSingleObject函数进一步执行。我知道命令提示符至少会执行,而这是我目前关注的焦点)然后DLL调用内部函数创建我们想要的子进程,关闭旧句柄,并使用新子进程的句柄覆盖内存。 […]

有没有办法在Windows中使文件描述符不阻塞?

我想将我的代码从linux移植到Windows。 它是这样的: void SetNonBlocking( int filehandle ) { int fhFlags; fhFlags = fcntl(filehandle,F_GETFL); if (fhFlags < 0) { perror("fcntl(F_GETFL)"); exit(1); } fhFlags |= O_NONBLOCK; if (fcntl(filehandle,F_SETFL,fhFlags) < 0) { perror("fcntl(F_SETFL)"); exit(1); } return; } 现在我希望在Windows中有相同的function。 有任何想法吗? Actualy我的文件句柄是管道的读取端,通过WinApi CreatePipe方法创建。

ReadProcessMemory更快

我正在创建一个应用程序,它将使用鼠标/键盘(宏)模拟一个变量值的动作。 我在这里扫描了我制作的代码: void ReadMemory(int value){ DWORD primeiroAddress = 0x000000; DWORD finalAddress = 0xFFFFFF; DWORD address=0; std::ostringstream ss; int i=0; TListItem *ListIt; int valor; HANDLE phandle = OpenProcess(PROCESS_VM_READ,0,TargetPID); if(!phandle){ ShowMessage(“Não encoutrou o processo”); }else{ for(address=primeiroAddress;address<=finalAddress;address+=sizeof(valor)){ ReadProcessMemory(phandle,(void*)address,&valor,sizeof(valor),0); if(valor==value){ i++; ss << std::hex <Label5->Caption=i; ListIt = Form1->ListView1->Items->Add(); ListIt->Caption = AnsiString(ss.str().c_str()).UpperCase(); ListIt->SubItems->Add(IntToStr(valor)); ss.str(std::string()); } } } } 我想知道我能做些什么才能让扫描更快

写蹦床function

我已设法覆盖内存中函数的前几个字节,并将其绕过我自己的函数。 我现在遇到创建蹦床function以将控制反弹回真实function的问题。 这是我的问题的第二部分。 BYTE *buf = (BYTE*)VirtualAlloc(buf, 12, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); void (*ptr)(void) = (void (*)(void))buf; vm_t* VM_Create( const char *module, intptr_t (*systemCalls)(intptr_t *), vmInterpret_t interpret ) { MessageBox(NULL, L”Oh Snap! VM_Create Hooked!”, L”Success!”, MB_OK); ptr(); return NULL;//control should never get this far } void Hook_VM_Create(void) { DWORD dwBackup; VirtualProtect((void*)0x00477C3E, 7, PAGE_EXECUTE_READWRITE, &dwBackup); //save […]