dll - c 注入DLL并打印消息

  显示原文与译文双语对照的内容

我正在处理 2个新东西: 编写DLL并将它的插入另一个进程中。 我认为我成功注入了它,因为如果我尝试 delete,我会得到一条消息告诉我它是另一。

我按照 Visual Studio 2008 http://msdn.microsoft.com/en-us/library/ms235636%28v=vs.80%29.aspx的步骤,但是我在C 中写了,而不是 C++ 。

这就是密码


DWORD 


APIENTRY


DllMain(


 HMODULE hModule,


 DWORD ul_reason_for_call,


 LPVOID lpReserved


 )


{


 printf("Hello Worldn");


 Sleep(5000);//added this to make sure I see it when it happens


 return TRUE;


}



像在MSDN文档中一样,我创建一个引用DLL的应用程序,它可以正常工作。

在我的DLL注入程序中的每一步都检查错误并打印它们。 所以我知道没有函数失败。 我检查了退出码,它是 1927086080,我不知道什么意思。 我不知道是否需要,但这里是我的程序的源代码。


#include <stdio.h>


#include <windows.h>


#include <string.h>



int main(int argc, TCHAR* argv[])


{


 DWORD procId = 0; 


 DWORD pathLen = 0;


 DWORD writeProcMemory = 0;


 DWORD exitCode = 0;



 HANDLE hProc = NULL;


 HANDLE hDll = NULL;


 HANDLE hThread = NULL;



 LPVOID baseAdr = NULL;


 LPVOID fAdr = NULL;



 procId = atoi((char*)argv[1]); 


 pathLen = strlen((LPCSTR)argv[2]);



 if(0 == pathLen)


 {


 printf("Check DLL pathn");


 return 0;


 }



//Open process


 hProc = OpenProcess(PROCESS_ALL_ACCESS,


 0,


 procId);



 if(NULL == hProc)


 {


 printf("OpenProcess failednGetLastError() = %dn", 


 GetLastError());


 return 0;


 }



//Allocate memory


 baseAdr = VirtualAllocEx(hProc,


 0,


 pathLen + 1,


 MEM_COMMIT,


 PAGE_READWRITE);



 if(NULL == baseAdr)


 {


 printf("VirtualAllocEx failednGetLastError() = %dn",


 GetLastError());


 CloseHandle(hProc);


 return 0;


 }



//write my dll path in the memory I just allocated


 if(!WriteProcessMemory(hProc,


 baseAdr,


 argv[2],


 pathLen + 1,


 0))


 {


 printf("WriteProcessMemory failednGetLastError() = %dn",


 GetLastError());


 VirtualFreeEx(hProc,


 baseAdr,


 0,


 MEM_RELEASE);


 CloseHandle(hProc);


 return 0;


 }



//get kernel32.dll 


 hDll = LoadLibrary(TEXT("kernel32.dll"));



 if(NULL == hDll)


 {


 printf("LoadLibrary failednGetLastError() = %dn",


 GetLastError());


 VirtualFreeEx(hProc,


 baseAdr,


 0,


 MEM_RELEASE);


 CloseHandle(hProc);


 return 0;


 }



//get LoadLibraryA entry point


 fAdr = GetProcAddress(hDll,


"LoadLibraryA");



 if(NULL == fAdr)


 {


 printf("GetProcAddress failednGetLastError() = %dn",


 GetLastError());


 FreeLibrary(hDll);


 VirtualFreeEx(hProc,


 baseAdr,


 0,


 MEM_RELEASE);


 CloseHandle(hProc);


 return 0;


 }



//create remote thread


 hThread = CreateRemoteThread(hProc,


 0,


 0,


 fAdr,


 baseAdr,


 0,


 0);



 if(NULL == hThread)


 {


 printf("CreateRemoteThread failednGetLastError() = %dn",


 GetLastError());


 FreeLibrary(hDll);


 VirtualFreeEx(hProc,


 baseAdr,


 0,


 MEM_RELEASE);


 CloseHandle(hProc);


 return 0;


 }



 WaitForSingleObject(hThread, 


 INFINITE);


 if(GetExitCodeThread(hThread,


 &exitCode))


 {


 printf("exit code = %dn",


 exitCode);


 }


 else


 {


 printf("GetExitCode failednGetLastError() = %dn",


 GetLastError());


 }



 CloseHandle(hThread);


 FreeLibrary(hDll);


 VirtualFreeEx(hProc,


 baseAdr,


 0,


 MEM_RELEASE);


 CloseHandle(hProc);


 return 0;


}



现在,当我将 shellcode ( 与上面的程序稍有不同) 插入进程中时,我可以在流程资源管理器中看到 shell 代码是如何运行的。 这里,我没有看到什么,但再次,这是我第一次使用 dll 。 但是它仍然被加载,因为我不能 delete 文件,直到我杀死了受害者进程。

这里外,当我运行注入程序时,我可以看到它没有达到 5秒,因这里它就像是被跳过了。

在 Windows 7 x64上执行这里操作。 我知道CreateRemoteThread不在 Windows 7上工作,但是我在 shell 代码注入中使用它,并且在这里使用同样的目标。

更新:更改我的DLL调用 ExitProcess(0); 会杀死受害者进程,所以我不知道如何打印某些内容。

我怎么才能让它打印出来?

时间: 原作者:

你希望从DLL获取消息,但使用 printf 。 如何看到dll输出的printf? 你最好把你的信息写到文件里。


#define LOG_FILE L"C:MyLogFile.txt"



void WriteLog(char* text)


{


 HANDLE hfile = CreateFileW(LOG_FILE, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);


 DWORD written;


 WriteFile(hfile, text, strlen(text), &written, NULL);


 WriteFile(hfile,"rn", 2, &written, NULL);


 CloseHandle(hfile);


}



void WriteLog(wchar_t* text)


{


 HANDLE hfile = CreateFileW(LOG_FILE, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);


 DWORD written;


 WriteFile(hfile, text, wcslen(text) * 2, &written, NULL);


 WriteFile(hfile, L"rn", 4, &written, NULL);


 CloseHandle(hfile);


}



用我的函数替换所有 printf 调用,看看实际会发生什么。 顺便说一下,如果你的DLL中有线程,你可以每秒编写日志,以确保你的代码工作。 你也可以在日志文件中添加时间。

如果你有足够的特权将DLL注入到进程中,那么什么都不会阻止你。 更改代码并告诉我日志文件中发生了什么。

好运

...