5 创建的线程是为了之后验证线程正常退出和强制关闭之间的影响。 61,62 是为了验证FreeLibrary是否会对之前对此DLL调用DllMain的线程存在影响。...6 TerminateThread D 强制关闭线程,不会导致任何DllMain的调用。...进程退出前,主线程会对DLL1和DLL2调用DllMain。 ...最后,我们考虑下LoadLibrary和Freelibrary对DllMain的影响。我将在两个线程中尝试多次LoadLibrary同一个Dll,多次Freelibrary同一个Dll。...可以想象LoadLibraryA和FreeLibrary之间存在一个计数器的关系(LoadLibraryA加计数器,FreeLibrary减计数器)。
(2)当一个模块提供一个内存分配函数(malloc、new)的时候,它必须同时提供另一个内存释放函数(free、delete) (3)在使用 C 和 C++ 混编的时候,要使用 extern "C"...FreeLibrary( _In_ HMODULE hModule ); // 卸载库和退出线程 VOID WINAPI FreeLibraryAndExitThread( _In_ HMODULE...如: DUMPBIN -exports D:\mydll.dll 复制代码 LoadLibrary 与 FreeLibrary 流程图 LoadLibrary 与 FreeLibrary 流程图 LoadLibrary...(4)获取命令行参数和环境变量。 (5)初始化 C 库的一些数据。 (6)调用 main 并记录返回值。 (7)检查错误并将 main 的返回值返回。...+哟~ 写在最后:对于准备学习C/C++编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!
// #include "stdafx.h" #include "第6章 线程基础.h" #include //线程函数 DWORD WINAPI ThreadProc(PVOID...nullptr, CREATE_SUSPENDED, nullptr); ResumeThread(hthread); system("pause"); BOOL bret = TerminateThread...(hthread, 0);//终止线程(异步),可能会导致资源没有释放(例如没有调用线程里类实例的析构函数!)...WaitForSingleObject(hthread, INFINITE); CloseHandle(hthread); hthread = nullptr; //创建C+
上面这个结构我已经是转换成C#的对应结构了,原结构可以查看按键精灵提供的插件C++接口源代码。...原本的想法是用C++写一个桥来调用dll,不过在.net 2.0 中,框架直接提供了 Marshal.GetDelegateForFunctionPointer 来转换一个函数指针为一个委托,这就方便多拉...hWnd, x, y), retVal); string[] tmp = retVal.ToString().Split('|'); return new WinApi.POINT...这样一来,我们可以在.net上面实现动态加载和卸载Win32 dll....public static extern int LoadLibrary(String funcname); [DllImport("Kernel32")] public static extern int FreeLibrary
如何生成动态链接库? 1....VS中创建新项目,动态链接库(DLL) 项目名称例如是myDLL 2.添加头文件 头文件名称例如是myLib.h 编写头文件 3.添加和编写源文件 源文件名称例如是myLib.cpp 源文件的内容 4....生成库文件 头文件在这里 3个文件都复制走,备用 如何调用动态链接库?...1.指定链接库文件对应的头文件的路径 在项目->属性,C/C++,常规,附加包含目录处指定链接库文件对应的头文件的目录 2.指定链接库文件的路径 在项目->属性,连接器,常规,附加库目录处指定链接库文件的目录...3.指定链接库文件的名称 在项目->属性,连接器,输入,附件依赖项处指定静态链接库文件的文件名 注意,这里不能写动态链接库文件的文件名,否则会出现链接错误1107 4.在调用方的源文件中调用链接库中的对象
A.exe需要B.dll、C.dll和D.dll辅助。现在我们要支持插件,那么我们需要提供一些接口函数供插件使用。比如我们要提供B1()、C1()和D1()供插件使用,那如何设计呢? ...我们先看下DLLOne和DllTwo的导出函数 LIBRARY "DllOne" EXPORTS Ret1 LIBRARY "DllTwo" EXPORTS Ret2 那么在Exe中如何暴露这两个函数呢...看Exe中的代码 typedef int (WINAPI* RetNFunc)(); extern "C" __declspec(dllexport) int MainRet1(); extern "...至于插件的调用,我这儿不准备搞复杂的设计,我这儿将直接Load插件DLL,并调用DLL中的导出方法(该方法的调用约定是提前确定好的)。...调用方法是 typedef void (WINAPI* PluginFunc)(); int _tmain(int argc, _TCHAR* argv[]) { HMODULE hPlugin
大家在实际工作学习C#的时候,可能会问:为什么我们要为一些已经存在的功能(比如Windows中的一些功能,C++中已经编写好的一些方法)要重新编写代码,C#有没有方法可以直接都用这些原本已经存在的功能呢...答案是肯定的,大家可以通过C#中的DllImport直接调用这些功能。...WinAPI的数据类型对应:DWORD=int或uint,BOOL=bool,预定义常量=enum,结构=struct。...以下自定义类的代码完成LoadLibrary的装载和函数调用: public class DllInvoke { [DllImport("kernel32...二 C# 中调用C++代码 int 类型 [DllImport(“MyDLL.dll")] public static extern int mySum (int a1,int b1); //返回个
线程分为界面线程和工作者线程,界面实际就是一个线程画出来的东西,这个线程维护一个“消息队列”,“消息队列”也是界面线程和工作者线程的最大区别,这个词应该进到你的脑子里,根深蒂固的!...; } else { DWORD dwRet = 0; GetExitCodeThread(g_hTrd, &dwRet); TerminateThread(g_hTrd,...当然也不能少了刚才的两个变量:退出标志和线程句柄。...lpParam); // CPP文件,创建的时候把 this 指针传进去,因为类静态成员函数不能访问类的非静态成员,没有this指针 //(C++的知识点) m_bExitThread = FALSE...Start启动线程 4、调用End结束线程 当然这种封装方式是我自己喜欢的,封装的目的是方便使用,隐藏细节,诸位看官也可以根据自己的喜好,封装线程的使用方法,如果能在此公开一下你的成果,让我和大家都学习一下你的设计手法
_stdcall是新标准C/C++函数的调用方法。...从底层来说,使用这种调用方法参数的进栈顺序和标准C调用(_cdecl方法)是一样的,但是_stdcall采用自动清栈的方式,而_cdecl采用的是手动清栈方式。 3. ...3)使用TerminateThread函数在一个线程中强制终止另一个线程的执行。注意,这是被强烈建议避免的函数。...但是这种方法相当于对每一个线程使用了TerminateThread函数,所以同样强烈建议避免。 PS:每一个线程都应该让它正常退出,即由它的线程函数返回。...Windows支持6个优先级类:idle、below normal、normal、above normal、high和real-time。
本文就会从 dll 开发基础讲起,如何开发和调试 dll,到如何在 dll 中上线木马,dllmain 中上线与 exe 上线的不同,如何在 dll 导出函数中执行上线,以及可能遇见的问题如何解决等。...当 dll 使用 LoadLibrary(Ex) 加载和使用 FreeLibrary 函数卸载 dll 时,系统还会调用该函数的入口点函数。...(1)导出函数名修饰规则 C 和 C++ 的导出函数名修饰规则不同,根据不同的调用约定有不同的修饰方法,见下表: 可以看到 C++ 比 C 的函数名修饰规则复杂了很多,但也能传递更多的信息。...+ 程序中调用和使用 C++ 编译的 .lib 在 C 程序中调用可能会出问题,如约定不匹配导致的堆栈异常等。...为了解决以上问题,最简单的方法就是在函数前面加上extern "C",告诉编译器该方法以 C 语言编译,同时让 C++ 编译器知道它是使用 C 语言编译,这样 C 和 C++ 都能正常调用该函数,在其他程序中使用
想要将代码注入到其他进程并能成功执行需要解决两个问题: 第一个问题是如何让远程进程执行注入的代码。...要进行远程代码注入的要点和难点主要就是这两个问题,下面给出两种不同的注入方式来说明如何解决这两个问题 DLL注入 DLL注入很好的解决了第二个问题,DLL被加载到目标进程之后,它里面的代码中的地址就会自动被转化为对应进程中的地址...那么如何在远程进程中执行DLL的加载操作呢?...调用CreateRemoteThread 函数创建远程线程,线程的回调函数为LoadLibrary,参数为对应的字符串的地址 按照这个思路可以编写如下的代码: typedef HMODULE(WINAPI...卸载的思路与注入的类似,只是函数变为了FreeLibrary,传入的参数变成了对应的dll的句柄了。 如何获取这个模块的句柄呢?我们可以枚举进程中的模块,根据模块的名称来找到对应的模块并获取它的句柄。
0x00 前言 DLL劫持算是一个老的漏洞,而且乌云漏洞库中也有很多的案例,只不过案例更多的只是验证一下,并没有教如何利用。...这有助于促进代码重用和内存的有效使用。...那么最终Windows2003以上以及win7以上操作系统通过“DLL路径搜索目录顺序”和“KnownDLLs注册表项”的机制来确定应用程序所要调用的DLL的路径,之后,应用程序就将DLL载入了自己的内存空间...8、然后我们把刚才生成好的dll文件和exe文件放到同一个目录中,并执行exe就能看到效果。 ? ?...= NULL); } inline VOID WINAPI Free() { if (m_hModule) FreeLibrary(m_hModule);
do { typedef HMODULE (WINAPI *LPLoadLibrary)(LPCWSTR); LPLoadLibrary...pRemoteLoadLibraryThread ) { break; } …… typedef HMODULE (WINAPI...之后CreateRemoteThread将在被注入进程中创建一个线程会去调用LoadLibrary,我们的DLL就被载入了,可以为所欲为了。...远线程结束和判断其返回值,这儿不再赘述。...于是这儿又遇到一个问题:如何将这个句柄给远线程呢?现在抛出这个问题,下节我们会讲到使用ShellCode加载我们的DLL,调用DLL中的导出函数并传入参数。
该模块提供一个接口用于完成非常复杂和耗时的工作。我们一般不会将该API放在UI线程中执行,而是启动一个线程,用工作线程去执行这个耗时的操作。...%d\n",nIndex); Sleep( ONESECOND ); } } // 我们启动的线程函数,用于在工作线程中执行那个耗时的第三方提供函数 static DWORD WINAPI...如何做呢? 一是让该模块设计方提供一个终止线程接口,比如给我们一个事件,我们通过设置这个事件来通知该线程退出。...nIndex++; printf("%d\n",nIndex); Sleep( ONESECOND ); } } 另一种可能就是TerminateThread...那有如何办呢? 目前有个方案是使用SEH。我们刻意造成该线程产生异常,同时在函数中捕获该异常,以使得线程可以体面的退出。 以下我详细讲解下这个方案。
CompressionFormatAndEngine参数指定压缩格式和引擎,CompressBufferWorkSpaceSize和CompressFragmentWorkSpaceSize分别用于输出缓冲区和片段的工作空间大小...定义变量并分配内存用于存储未压缩的数据和压缩后的数据。 定义变量用于存储工作空间。 调用RtlCompressBuffer函数,将数据进行压缩。 处理压缩后的数据。...调用RtlDecompressBuffer函数,将数据进行解压。 处理解压后的数据。...FALSE); // 释放 if (pWorkSpace) { delete[]pWorkSpace; pWorkSpace = NULL; } if (hModule) { ::FreeLibrary...pdwUncompressDataLength = dwFinalUncompressSize; bRet = TRUE; } while (FALSE); // 释放 if (hModule) { ::FreeLibrary
黑客常用WinAPI函数整理 之前的博客写了很多关于Windows编程的内容,在Windows环境下的黑客必须熟练掌握底层API编程。...kernel32.dll”); 获取模块内函数地址: GetProcessAddr(hmdl,”MessageBox”); 动态加载DLL: LoadLibrary(“user32.dll”); 卸载DLL: FreeLibrary...SetProcessPriorityBoost(hproc,true); GetProcessPriorityBoost(hproc,pBool); 二、线程 创建线程(CreateThread的线程函数调用了...hthread); SetThreadPriorityBoost(hproc,true); GetThreadPriorityBoost(hproc,pBool); 终止线程: ExitThread(5); TerminateThread...WinSocket库: WSAStartup(version,&wsa); WSACleanup(); 创建套接字: socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 绑定套接字IP和端口
本文就如何实现一个进程保护功能进行探究,驱动就不写了,就写一个用户层的。 实现原理 windows提供了一个可以杀死其他进程的API:TerminateProcess。...hRemoteThread);VirtualFreeEx(hprocess, pAlloc, 0, MEM_RELEASE);CloseHandle(hRemoteThread);CloseHandle(hprocess);FreeLibrary...");VirtualFreeEx(hprocess, pAlloc, 0, MEM_RELEASE);CloseHandle(hRemoteThread);CloseHandle(hprocess);FreeLibrary...根据实验:任务管理器会不断地调用openprocess这个api,不管有没有操作都会一直调用。这里就用微软更加稳定的detours库。...DetourTransactionCommit();}voidUnHook(){DetourTransactionBegin();DetourUpdateThread(GetCurrentThread());// 和Hook
// // 有关其他详细信息, // 请参阅 MFC 技术说明 33 和 58。...#pragma endregion return TRUE; } // 程序出口 int CTest_DllmfcApp::ExitInstance() { // TODO: 在此添加专用代码和/...=NULL) { // UnHook 鼠标钩子 UnhookWindowsHookEx(hhk); // 卸载 dll FreeLibrary(hInst); } } #pragma...,"StartHook"); // 判断导出函数是否调用成功 if (Hook==NULL){AfxMessageBox(_T("StartHook 调用失败"));} // 开始 Hook...UnHook(); // 卸载 dll FreeLibrary(g_hInst); // 重置 g_hInst , 方便下一次 UnHook 时判断 g_hInst=NULL; } //
大家好,又见面了,我是全栈君 在lua脚本调用中,如果我们碰到一种不好的脚本,例如: while 1 do do end 那我们的程序主线程也会被阻塞住。那我们如何防止这种问题呢?...(要详细了解工作线程和界面线程的区别和管理,请参看本人的另一篇文章BLOG下Windows编程里的《Windows 线程漫谈——界面线程和工作者线程》)。...总体思路: 1、开线程来执行脚本解析,下面是StartRun() 2、导出一个判断是否结束函数,让脚本每个循环都调用,判断线程是否该结束了,这个函数在下面是IsThreadExit(),返回一个字符串(...lua_pushcfunction(g_pLua, ySleep); lua_setglobal(g_pLua, “ySleep”); return 0; } // 线程函数 DWORD WINAPI...} // 否则强硬杀掉线程 else { DWORD dwExitCode; GetExitCodeThread(g_hDofile, &dwExitCode); TerminateThread
我也想不到这个有什么好利用的,那么2又如何可以被利用呢? ...为了做出结果比较,我将在MainExe中分别对DllTop_Real.dll和DllTop_Modify.dll进行加载并调用其函数。...typedef int (WINAPI *PRetN)(); void TopDll( LPCSTR lpFileName ){ PRetN pRet0 = NULL; PRetN pRet1...我们调用DllTop_Real.dll中函数时,由于Occupying001和Occupying002都是无返回值的,所以返回的结果是乱乱的数据。 ...我们调用DllTop_Modify.dll中函数时,Occupying001和Occupying002分别返回了1和2,这两个结果是DllBase.dll中Ret1和Ret2的执行结果!