本人菜鸟,初学win api,刚刚学到用CreateRemoteThread()来注入,遇到一个很纠结的问题,向高手求救。
系统是win7+visual studio2010。具体问题是这样的:
用dll.dll文件注入calc.exe(计算器)的时候,用XueTr检测的结果是成功注入了,但是没有弹出消息框,dll.dll的代码如下:
#include <windows.h>BOOL APIENTRY DLLMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
if(ul_reason_for_call==DLL_PROCESS_ATTACH) 
 MessageBox(NULL,"TEXT","TEXT",0);
return true;
}这部分代码好像根本就不执行,改成其它的也一样,请问vs2010下dll文件应该怎么写?我是创建win32控制台应用程序项目--选空dll项目,内容只有以上一个cpp文件,是不是应该有其它内容呢?下面是用来注入的代码,是直接抄书的,应该没有问题:
#include <Windows.h>
#include <stdio.h>
#include <TlHelp32.h>BOOL LoadDll(DWORD dwProcessId,LPTSTR lpszDllName)
{
HANDLE hProcess=NULL;
HANDLE hThread=NULL;
PSTR pszDllFile=NULL;
hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessId);
if(hProcess==NULL)
return FALSE;
int cch=1+strlen(lpszDllName);
pszDllFile=(PSTR)VirtualAllocEx(hProcess,NULL,cch,MEM_COMMIT,PAGE_READWRITE);
if(pszDllFile==NULL)
return FALSE;
if((WriteProcessMemory(hProcess,(PVOID)pszDllFile,(PVOID)lpszDllName,cch,NULL))==FALSE)
return FALSE;
PTHREAD_START_ROUTINE pfnThreadRtn=(PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("kernel32"),"LoadLibraryA");
if(pfnThreadRtn==NULL)
return FALSE;
hThread=CreateRemoteThread(hProcess,NULL,0,pfnThreadRtn,(PVOID)pszDllFile,0,NULL);
if(hThread==NULL)
return FALSE;
system("pause");
WaitForSingleObject(hThread,INFINITE);
VirtualFreeEx(hProcess,(PVOID)pszDllFile,0,MEM_RELEASE);
CloseHandle(hThread);
CloseHandle(hProcess);
return TRUE;
}void main()
{
char lpDllName[MAX_PATH]=TEXT("dll1.dll");
PROCESSENTRY32 ProcessEntry={0};
HANDLE hProcessSnap;
ProcessEntry.dwSize=sizeof(PROCESSENTRY32);
hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
BOOL bRet=Process32First(hProcessSnap,&ProcessEntry);
while(bRet)
{
if(strcmp("calc.exe",ProcessEntry.szExeFile)==0)
{
LoadDll(ProcessEntry.th32ProcessID,lpDllName);
break;
}
bRet=Process32Next(hProcessSnap,&ProcessEntry);
}
}被困扰了好久,拜托各位高手了!

解决方案 »

  1.   

    没仔细看你的代码,但是建议你这类型的操作你最好是在xp,2003里测试。
    一定要在Win7里用的话就在你的程序上点鼠标右键,选择以管理员运行。
    我也遇到过这样的问题。
      

  2.   

    用管理员运行过了,结果一样。也在虚拟机xp里试过编译出来的程序,还是不行,应该是代码的问题吧,XueTr显示已经成功注入了
      

  3.   

    Lz把DllMain里边的if删了看看能不能有消息框,顺便打印下ul_reason_for_call看看是什么情况。要不换个进程试试?倒是我以前注入calc是没有问题的。另外 楼主导出DllMain了没?
      

  4.   


    我删了if,也printf了ul_reason_for_call,什么反应都没有,这段代码应该根本就没有执行,注入notepad也是一样的。
    问一下,什么叫做导出DllMain?我猜问题就出在这里了谢谢
      

  5.   

    能不能把那个if(ul_reason_for_call==DLL_PROCESS_ATTACH)去掉试试
      

  6.   

    弄清楚了,谢谢各位
    原因是dll文件的结构有问题,后来我用新建项目的时候不选空项目,出来就有一个完整的模板,在那个框架下写就没问题了