pEntryPoint = pNTHeader->OptionalHeader.AddressOfEntryPoint + pNTHeader-
>OptionalHeader.ImageBase;
ImageUnload(pImage);
return (LPBYTE)pEntryPoint; }
// 创建FileMapping
hMap = CreateFileMapping((HANDLE)0xFFFFFFFF, NULL,
PAGE_READWRITE, 0, sizeof(SPY_MEM_SHARE), “MyDllMapView”);
// 保存目标进程的代码
第三步:将目标进程入口的代码保存起来。
LPSPY_MEM_SHARE lpMap = pMapViewOfFile(hMap,
FILE_MAP_ALL_ACCESS,
0, 0, 0);
ReadProcessMemory(m_proInfo.hProcess, pEntryPoint,
&lpMap->oldcode, sizeof(INJECT_CODE),
&cBytesMoved);
lpMap->lpEntryPoint = pEntryPoint;
// 第四步:在目标进程的入口写入LoadLibrary(MyDll)实现Dll的注入。
// 准备注入DLL的代码
INJECT_CODE newCode;
// 写入MyDll―――用全路径
lstrcpy(newCode.szDLL, szMyDll);
// 准备硬代码(汇编代码)
newCode.int_PUSHAD = 0x60;
newCode.int_PUSH = 0x68;
newCode.int_MOVEAX = 0xB8;
newCode.call_eax = 0xD0FF;
newCode.jmp_MOVEAX = 0xB8;
newCode.jmp_eax = 0xE0FF;
newCode.eax_Value = (DWORD)&LoadLibrary;
newCode.push_Value=(pEntryPoint + offsetof(INJECT_CODE,szDLL));
// 将硬代码写入目标进程的入口
// 修改内存属性
DWORD dwNewFlg, dwOldFlg;
dwNewFlg = PAGE_READWRITE;
VirtualProtectEx(m_proInfo.hProcess, (LPVOID)pEntryPoint, sizeof(DWORD), dwNewFlg,
&dwOldFlg);
WriteProcessMemory(m_proInfo.hProcess, pEntryPoint,
&newCode, sizeof(newCode),
NULL);//&dwWrited);
VirtualProtectEx(proInfo.hProcess, (LPVOID)pEntryPoint, sizeof(DWORD),
dwOldFlg, &dwNewFlg);
// 释放FileMaping 注意,不是Closehandle(hMap)
UnmapViewOfFile(lpMap);
// 继续目标进程的运行
第五步:用ResumeThread运行目标进程。
ResumeThread(m_proInfo.hThread);
在监视进程中就结束了自己的任务,剩下的第6,7,8步就需要在Dll的DllMain中进行配合。
DLL中用来保存数据的结构体
typedef struct {
DWORD lpEntryPoint; DWORD OldAddr; DWORD OldCode[4]; }JMP_CODE,* LPJMP_CODE;
static JMP_CODE _lpCode;
// 在DllMain的DLL_PROCESS_ATTACH中调用InitApiSpy函数
// 在该函数中实现第6,7,8步
第六步:目标进程就运行了LoadLibrary(MyDll),实现DLL的注入。
int WINAPI DllMain(HINSTANCE hInst, DWORD dwReason, LPVOID lpReserved) {
switch(dwReason)
{
case DLL_PROCESS_ATTACH:
return InitApiSpy(); ……
// InitApiSpy函数的实现
BOOL WINAPI InitApiSpy() {
HANDLE hMap;
LPSPY_MEM_SHARE lpMem;
DWORD dwSize;
BOOL rc;
BYTE* lpByte;
// 取得FileMapping的句柄
hMap = OpenFileMapping(FILE_MAP_ALL_ACCESS, 0, “MyDllMapView”);
if(hMap)
{
lpMem = (LPSPY_MEM_SHARE)MapViewOfFile(hMap,
FILE_MAP_ALL_ACCESS,
0, 0, 0);
if(lpMem)
{
第七步:目标进程运行完LoadLibrary(MyDll)后,将原来的代码写回目标进程的入口。
// 恢复目标进程的入口代码
// 得到mov eax, value代码的地址
_lpCode.OldAddr = (DWORD)((BYTE*)lpMem->lpEntryPoint + offsetof
(INJECT_CODE, jmp_MOVEAX));
_lpCode.lpEntryPoint = (DWORD)lpMem->lpEntryPoint;
// 保存LoadLibrary()后面的代码
memcpy(&_lpCode.OldCode, (BYTE*)lpMem->oldcode + offsetof
(INJECT_CODE, jmp_MOVEAX), 2*sizeof(DWORD));
// 恢复目标进程的入口代码
rc = WriteProcessMemory(GetCurrentProcess(), lpMem-
>lpEntryPoint, lpMem->oldcode, sizeof(INJECT_CODE), &dwSize);
lpByte = (BYTE*)lpMem->lpEntryPoint + offsetof(INJECT_CODE,
搜索“diyifanwen.net”或“第一范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,第一范文网,提供最新小学教育DLL的11种注入方法 (3)全文阅读和word下载服务。
相关推荐: