请问一个关于DLL_PROCESS_DETACH的错误

neji_bai 2012-03-31 11:43:27
我做了一个简单的IAT HOOK的DLL 利用线程注入来实现
在DLL_PROCESS_ATTACH的时候进行HOOK处理
pfnOrig = GetProcAddress(GetModuleHandleA("Kernel32"),"CreateFileW");
HookAPI("Kernel32.dll",pfnOrig,(PROC)MyCreateFile);
功能能正常运行(此时 DLL_PROCESS_DETACH下没有任何代码)。
但是我在 DLL_PROCESS_DETACH:加上一个MessageBoxA(NULL,"TEST","TEST",MB_OK);以后就出问题了,被注入的程序会崩溃
这个DETACH的执行到底是怎么回事呢。
---------------------
补充说明一下 我的程序是这样的
在CMD下
HOOK程序 目标程序
HOOK后的结果应该是在执行CreateFile之前弹窗显示一下要创建的文件的名字,其中被注入的目标程序也是自己写的只有CreateFile一个简单的功能

如果DLL_PROCESS_DETACH下有了代码 在CMD下第一次运行 程序就会崩溃,然后再运行一次的话(不关闭CMD),就不会说崩溃,但是DLL_PROCESS_DETACH下的弹窗会执行很多次,然后才弹出创建文件的名字。

我之前认为的效果应该是先弹创建文件的名字 再弹TEST这个窗才对的
...全文
351 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
neji_bai 2012-04-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

内容太多。。。
...Calling functions that require DLLs other than Kernel32.dll may result in problems that are difficult to diagnose. For example, calling User, Shell, and COM functions can cause access vio……
[/Quote]

呃 好像是你说的这个结果。。。
newseacher 2012-04-21
  • 打赏
  • 举报
回复
源码级调试下
unituniverse2 2012-04-19
  • 打赏
  • 举报
回复
内容太多。。。
...Calling functions that require DLLs other than Kernel32.dll may result in problems that are difficult to diagnose. For example, calling User, Shell, and COM functions can cause access violation errors, because some functions load other system components. Conversely, calling functions such as these during termination can cause access violation errors because the corresponding component may already have been unloaded or uninitialized.
...
unituniverse2 2012-04-19
  • 打赏
  • 举报
回复
你写程序都不看文档的。很无语...
brikehuang 2012-04-18
  • 打赏
  • 举报
回复
看看WINDOWS核心编程第20章:DLL的进入点函数
jamseyang 2012-04-07
  • 打赏
  • 举报
回复
是挺奇怪的,把代码都贴出来,大家一起研究下
neji_bai 2012-03-31
  • 打赏
  • 举报
回复
第一次运行崩溃的问题找到了
但是弹窗多次这个 不明白
VS2010中使用C++创建和使用DL.docx,文档加代码,全了。工程代码下载: 1.生成动态链接库(_declspec(dllexport)方式导出函数) 2.生成动态链接库(以.def文件(模块定义文件)方式导出函数) 3.以加载时动态链接方式调用DLL 4.以运行时动态链接方式调用DLL 5.以模块定义方式(.def文件)建立的动态链接库的调用 遇到的问题: 1.库导入的时候目录的问题。对应文中的问题1,后面有解释。 2.字符集的问题(是Unicode字符集还是多字节集),两种方案,一种修改字符集为多字节集,二是将字符串前面加 _T(""),文中问题2 3.不知道怎么通过模块定义文件方式生成DLL,通过看参考博客的代码找到了答案,主要修改头文件,和添加模块定义文件。 4.模块定义文件中的库文件名应和工程名一致。 DllMain函数 Windows在加载DLL时,需要一个入口函数,就像控制台程序需要main函数一样。有的时候,DLL并没有提供DllMain函数,应用程序也能成功引用DLL,这是因为Windows在找不到DllMain的时候,系统会从其它运行库中引入一个不做任何操作的默认DllMain函数版本,并不意味着DLL可以抛弃DllMain函数。 根据编写规范,Windows必须查找并执行DLL里的DllMain函数作为加载DLL的依据,它使得DLL得以保留在内存里。这个函数并不属于导出函数,而是DLL的内部函数,这就说明不能在客户端直接调用DllMain函数,DllMain函数是自动被调用的。 DllMain函数在DLL被加载和卸载时被调用,在单个线程启动和终止时,DllMain函数也被调用。参数ul_reason_for_call指明了调用DllMain的原因,有以下四种情况: DLL_PROCESS_ATTACH:当一个DLL被首次载入进程地址空间时,系统会调用该DLLDllMain函数,传递的ul_reason_for_call参数值为DLL_PROCESS_ATTACH。这种情况只有首次映射DLL时才发生; DLL_THREAD_ATTACH:该通知告诉所有的DLL执行线程的初始化。当进程创建一个新的线程时,系统会查看进程地址空间中所有的DLL文件映射,之后用DLL_THREAD_ATTACH来调用DLL中的DllMain函数。要注意的是,系统不会为进程的主线程使用值DLL_THREAD_ATTACH来调用DLL中的DllMain函数; DLL_PROCESS_DETACH:当DLL从进程的地址空间解除映射时,参数ul_reason_for_call参数值为DLL_PROCESS_DETACH。当DLL处理DLL_PROCESS_DETACH时,DLL应该处理与进程相关的清理操作。如果进程的终结是因为系统中有某个线程调用了TerminateProcess来终结的,那么系统就不会用DLL_PROCESS_DETACH来调用DLL中的DllMain函数来执行进程的清理工作。这样就会造成数据丢失; DLL_THREAD_DETACH:该通知告诉所有的DLL执行线程的清理工作。注意的是如果线程的终结是使用TerminateThread来完成的,那么系统将不会使用值DLL_THREAD_DETACH来执行线程的清理工作,这也就是说可能会造成数据丢失,所以不要使用TerminateThread来终结线程。以上所有讲解在工程DLLMainDemo(工程下载)都有体现。 函数导出方式

15,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧