第一范文网 - 专业文章范例文档资料分享平台

DLL的11种注入方法 (4)

来源:用户分享 时间:2020-06-21 本文由淡若清风 分享 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

jmp_MOVEAX);

UnmapViewOfFile(lpMem);

}

CloseHandle(hMap);

}

// 实现自己Dll的其他功能,如导入表的替换

// ……

// 将LoadLibrary后面的代码写为转入处理程序中

// 指令为:mov eax, objAddress

// jmp eax

{

BYTE* lpMovEax;

DWORD* lpMovEaxValu;

WORD* lpJmp;

DWORD fNew, fOld;

fNew = PAGE_READWRITE;

lpMovEax = lpByte;

VirtualProtect(lpMovEax, 2*sizeof(DWORD), fNew, &fOld);

*lpMovEax = 0xB8;

lpMovEaxValu = (DWORD*)(lpMovEax + 1);

*lpMovEaxValu = (DWORD)&DoJmpEntryPoint;

lpJmp = (WORD*)(lpMovEax + 5);

*lpJmp = 0xE0FF; // (FF E0)

VirtualProtect(lpMovEax, 2*sizeof(DWORD), fOld, &fNew);

}

return TRUE; }

// 转入处理程序

DWORD* lpMovEax;

DWORD fNew, fOld;

void __declspec(naked) DoJmpEntryPoint () {

// 恢复LoadLibrary后面的代码

_gfNew = PAGE_READWRITE;

_glpMovEax = (DWORD*)_lpCode.OldAddr;

VirtualProtect(_glpMovEax, 2*sizeof(DWORD), _gfNew, &_gfOld);

*_glpMovEax = _lpCode.OldCode[0];

*(_glpMovEax + 1) = _lpCode.OldCode[1];

VirtualProtect(_glpMovEax, 2*sizeof(DWORD), _gfOld, &_gfNew);

第八步:目标进程Jmp至原来的入口,继续运行程序。

// 跳至目标代码的入口

_asm popad

_asm jmp _lpCode.lpEntryPoint }

这样就实现了原来的目标,将DLL的注入放在目标进程的入口运行,实现了目标进程运行之前运行

我们的注入Dll的功能。

第三种方法:

利用注册表注入

在Windows NT/2000/XP/2003中,有一个注册表键值

HKEY_LOCAL_MACHINE\\Software\\Microsoft\\WindowsHKEY_LOCAL_MACHINE\\Software\\Microsoft\\Wi

ndows NT\\CurrentVersion\\Windows\\AppInit_DLLs。当某个进程加载User32.dll时,这里面列出

的所有的DLL都将User32.dll利用LoadLibrary函数加载到该进程空间中。我们可以把自己的代码

放在一个DLL中,并加入该键值,这样就可以注入到所有使用User32.dll的进程中了。 当DLL以LoadLibrary的方式加载时,DllMain会被以DLL_PROCESS_ATTACH为原因调用,实际上

我们也只需要关心DLL_PROCESS_ATTACH BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) {

if (ul_reason_for_call == DLL_PROCESS_ATTACH) {

HANDLE f = CreateFile(L\ NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); CloseHandle(f); }

return TRUE;

}

第四种方法:

利用Windows Hooks注入

Windows系统给我们提供了一些挂钩函数,使得被挂钩的进程可以在自己处理接收到的消息之

前,先执行我们的消息处理函数,而这个消息处理函数一般会放在DLL中,来让目标进程加载,这

实际上已经达到了注入代码的效果。

一般情况下,我们把挂钩函数和消息处理函数都放在dll中: HHOOK g_hHook = NULL; HINSTANCE hInst;

BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) {

hInst = (HINSTANCE)hModule; return TRUE; }

LRESULT myKeyBrdFuncAd (int code, WPARAM wParam, LPARAM lParam) {

// To be nice, your rootkit should call the next-lower // hook, but you never know what this hook may be.

//::MessageBoxA(NULL, \ return CallNextHookEx(g_hHook, code, wParam, lParam); }

#ifdef __cplusplus // If used by C++ code,

extern \ // we need to export the C interface #endif

__declspec(dllexport) bool SetHook(DWORD dwThreadId) {

g_hHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)myKeyBrdFuncAd, hInst, dwThreadId);

if (g_hHook == NULL) {

return false; }

return true; }

#ifdef __cplusplus }

#endif

注入进程要加载这个DLL,然后执行里面的SetHook函数,传入的参数为被注入线程的ID

typedef bool (*MYPROC) (DWORD dwThreadId); ......

HANDLE hLib = LoadLibraryA

(\if (hLib == NULL) {

printf(\}

MYPROC myProc = (MYPROC)GetProcAddress((HMODULE)hLib,\if (myProc != NULL) {

if ((*myProc)((DWORD)4860) == false) {

printf(\ } } else {

printf(\}

第五种方法:

利用特洛伊DLL进行注入

这种方法的原理就是由自己写一个与原有进程调用的DLL具有相同接口函数的DLL,再用我们

的DLL替换原有的DLL。在替换的过程中,由我们自己编写感兴趣的函数替换原有函数,而对其它

不感兴趣的函数,则以函数转发的形式调用原有DLL中的函数。这里面有个前提,就是你在编写

搜索“diyifanwen.net”或“第一范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,第一范文网,提供最新小学教育DLL的11种注入方法 (4)全文阅读和word下载服务。

DLL的11种注入方法 (4).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/wenku/1092133.html(转载请注明文章来源)
热门推荐
Copyright © 2018-2022 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top