首页
社区
课程
招聘
[旧帖] [原创]DLL注入最简单实例[申请邀请码] 0.00雪花
发表于: 2009-11-2 13:39 3402

[旧帖] [原创]DLL注入最简单实例[申请邀请码] 0.00雪花

2009-11-2 13:39
3402
本文章分两部分-消化以下代码可以对DLL注入有入门效果
1.DLL代码及代码讲解
2.EXE代码及讲解

//1.DLL源码
#include <windows.h>
DWORD WINAPI Thread(LPVOID lpParam)
//定义一个线程,用来执行你需要执行的代码,好处是可以使用Sleep之类的API函数,而不会影响主进程的运行,如果把以下代码直接放在DllMain中,程序就会假死,注入效果就没有了。
{
        while(true)
//无限循环用,当然你可以把true设为变量或者表达式,用来控制运行与结束
        {
                MessageBox(NULL,"程序运行!","温馨提示!",MB_OK);
                Sleep(5000);
        }
return 0;
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
{
        switch(fdwReason)
        {
        case DLL_PROCESS_ATTACH:
//只有得到 DLL_PROCESS_ATTACH 这个消息以后才能创建线程,具体什么原因我也说不清楚,此贴的目的是搭建一个可以在DLL中独立运行代码的结构
        {
           DWORD ThreadId;
           CreateThread(NULL,NULL,Thread,NULL,NULL,&ThreadId);
                   //线程创建以后,上面的代码就可以被执行了
           break;
        }
        default:break;
        }
        return TRUE;
}
//把以上代码编译成  NoProcessDll.dll

2.EXE源码
//上面我们建立了一个DLL,下面我们就要让DLL加载进程序的进程中。
#include <winsock2.h>
#include <stdio.h>
#include <tlhelp32.h>

#pragma comment (lib,"Advapi32.lib")

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
//下面的代码作用是查找我们需要注入的进程名   
        DWORD pid;

        HANDLE hSnapshot = NULL;
        hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL);
                //建立一个进程快照,快照里面含有 进程名,PID等信息
        PROCESSENTRY32 pe;
        pe.dwSize = sizeof(PROCESSENTRY32);

        Process32First(hSnapshot,&pe);
                //枚举进程快照,找出含有相应进程名的进程 PID
        do
        {
                if(stricmp(pe.szExeFile,"notepad.exe")==0)
                                //这里是进行比较的地方,我们要注入的程序是 系统自带的记事本 找到进
                {
                        pid = pe.th32ProcessID;
                        break;
                }
        }
        while(Process32Next(hSnapshot,&pe)==TRUE);

        CloseHandle (hSnapshot);
                //清除快照
        //
        PWSTR pszLibFileRemote = NULL;
        HANDLE hRemoteProcess = NULL,hRemoteThread = NULL;
                //这里打开需要注入的进程
        hRemoteProcess = OpenProcess(
                 PROCESS_QUERY_INFORMATION |   // Required by Alpha
         PROCESS_CREATE_THREAD     |   // For CreateRemoteThread
         PROCESS_VM_OPERATION      |   // For VirtualAllocEx/VirtualFreeEx
         PROCESS_VM_WRITE,             // For WriteProcessMemory
         FALSE, pid);
//**************
//星号中间的代码是为了得到我们需要注入的DLL文件的地址  NoProcessDll.dll 使我们需要注入的DLL文件 和我们的EXE文件处于同一目录下
        char CurPath[256];
        GetCurrentDirectory(256,CurPath);
        strcat(CurPath,"\\NoProcessDll.dll");

        int len = (strlen(CurPath)+1)*2;
        WCHAR wCurPath[256];
        MultiByteToWideChar(CP_ACP,0,CurPath,-1,wCurPath,256);
//**************
        pszLibFileRemote = (PWSTR)
                VirtualAllocEx(hRemoteProcess, NULL, len, MEM_COMMIT, PAGE_READWRITE);
// VirtualAllocEx 作用是在制定的进程中申请一个地方来放我们的DLL吧,我是这里理解的,VirtualAllocEx的中文解释可以在百度百科里面查到,{百度百科 http://baike.baidu.com/ } 相当于中文的MSDN ,有什么不懂得函数都可以去里面找。
        WriteProcessMemory(hRemoteProcess, pszLibFileRemote,
                (PVOID) wCurPath, len, NULL);
//申请以后我们就要把DLL写入进程的内存里面去,这样进程才能调用使用DLL

        PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)
         GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW");
// 检索指定的动态链接库(DLL)中的输出库函数地址。呵呵意思大概是这样,我也不大理解,但是好像只要是DLL远程注入都是用这几行代码,不理解就先放着,以后会理解的
        hRemoteThread = CreateRemoteThread(hRemoteProcess, NULL, 0,
                pfnThreadRtn, pszLibFileRemote, 0, NULL);
        return 0;
}
//把以上代码生成Noexe.exe 与 NoProcessDll.dll 放在一起  然后我们启动记事本,然后运行Noexe.exe 然后记事本就会一直弹出对话框,我们的注入就成功了,你可以用360安全卫士或者其他可以查看进程模块的工具查看记事本的进程,可以在记事本的进程里面看到我们的 NoProcessDll.dll  模块

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 2899
活跃值: (1753)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
2
很好的文章呢。
2009-11-2 19:48
0
雪    币: 66
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
hohohoho,终于理解什么叫dll注入进程了,以前一直搞不懂,楼主写的很有条理啊。 :)
2009-11-2 22:46
0
雪    币: 40
活跃值: (130)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
楼主写的不错,收藏了
2009-11-10 17:42
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
看的不是太懂
2009-11-13 15:49
0
雪    币: 33
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
好东西,先收藏再看
2009-11-13 16:02
0
雪    币: 465
活跃值: (191)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
楼主好,你这个注入过程在win7或win10下应该要UAC权限才能注入成功吧?
2016-3-8 10:59
0
雪    币: 1140
活跃值: (102)
能力值: ( LV4,RANK:48 )
在线值:
发帖
回帖
粉丝
8
对我很有帮助
2016-3-8 12:44
0
雪    币: 1
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
good
2016-3-8 19:09
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我把后面的LoadLibraryW改成LoadLibraryA了,这样就省去了这个转换:MultiByteToWideChar
2016-3-9 01:44
0
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
感谢楼主分享,谢谢楼主啊!!
2016-3-13 16:59
0
雪    币: 38
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
好贴子,虽然现在看不懂,等我接触这方面再来学习下
2016-3-18 16:02
0
雪    币: 230
活跃值: (540)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
谢谢分享
2016-3-18 16:28
0
雪    币: 36
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
新手,感谢楼主
2016-3-18 16:45
0
游客
登录 | 注册 方可回帖
返回
//