博弟弟丶 发表于 2021-4-14 19:33

学习C++的第17天

#include <Windows.h>
#include <iostream>
BOOL injectDLL(DWORD        pid,const char *DLLname) {//BOOL类型的函数一个是PID 一个是DLL名字

        HANDLE Process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);//获取句柄
                if (Process==NULL)//判断是否为空
                {
                        std::cout <<"获取进程句柄失败返回值为:"<< GetLastError() << std::endl;////getLastError这个函数就是获取失败返回的值 看看返回的代码是多少
                        return FALSE;
                }
                DWORD changdu = strlen(DLLname) + 1;//计算DLL的长度 ,并且要加上0结尾的长度,就是为了怕内存不够
                LPVOID allocex=VirtualAllocEx(Process,NULL,changdu, MEM_COMMIT, PAGE_READWRITE);//在目标进程分配内存
                if (allocex==NULL)//判断是否为空
                {
                        std::cout << "分配内存失败返回值为:" << GetLastError() << std::endl;//getLastError这个函数就是获取失败返回的值 看看代码是多少
                        CloseHandle(Process);//关闭进程句柄
                        return FALSE;
                }
                BOOL WPM =WriteProcessMemory(Process,allocex,DLLname,changdu,NULL);//拷贝DLL路径名到目标进程的内存中
                if (!WPM)
                {
                        std::cout << "拷贝DLL到内存失败返回值为:" << GetLastError() << std::endl;//getLastError这个函数就是获取失败返回的值 看看代码是多少
                        CloseHandle(Process);//关闭进程句柄
                        return FALSE;
                }
                HMODULE hmodule = GetModuleHandle("KERNEL32.dll");//获取系统DLLKernel32.dll
                if (!hmodule)//判断
                {
                        std::cout << "系统DLL获取失败返回值为:" << GetLastError() << std::endl;//getLastError这个函数就是获取失败返回的值 看看代码是多少
                        return FALSE;
                }
                DWORD GPA=(DWORD)GetProcAddress(hmodule, "LoadLibraryA");//获取LoadLibraryA函数地址在补充一点 LoadLibraryA 是多字节版本   LoadLibraryW是 Unicode版本
                if (!GPA)//判断
                {
                        std::cout << "A函数加载失败返回值为:" << GetLastError() << std::endl;//getLastError这个函数就是获取失败返回的值 看看代码是多少
                        CloseHandle(Process);//关闭句柄
                        CloseHandle(hmodule);//关闭DLL
                        return FALSE;
                }
                HANDLE CRT=CreateRemoteThread(Process,NULL,0,(LPTHREAD_START_ROUTINE)GPA,allocex,0,NULL);//创建远程线程,加载DLL
                if (!CRT)
                {
                        std::cout << "远程线程加载失败返回值为:" << GetLastError() << std::endl;//getLastError这个函数就是获取失败返回的值 看看代码是多少
                        CloseHandle(Process);//关闭句柄
                        CloseHandle(hmodule);//关闭DLL
                        return FALSE;
                }
                CloseHandle(Process);//最后在关闭句柄
                return true;
};
int main() {
       
        injectDLL(3224,"D:\\C++日常练习代码\\Dll1\\Debug\\Dll1.dll" );//调用这个函数的时候可能会出现失败就好比如我注入计算器他给我返回的是拒绝被访问(错误代码为5),所以说知道这个原理就行了

        return 0;

};

骄阳似我 发表于 2021-4-14 19:49

请问下你是 零基础学的还是怎么学的啊?

wxbb979 发表于 2021-4-14 19:58

前来学习!

Rodriguezs 发表于 2021-4-14 20:01

零基础17天就DLL注入了,可这种写法,像带类的C了。

小任要努力 发表于 2021-4-14 20:08

我也想学一学可是没有时间

湖北吴彦祖 发表于 2021-4-14 20:29

默默支持你。

中本聪 发表于 2021-4-14 20:41

支持支持

smilencetion 发表于 2021-4-14 20:44

这是在学Win32吧

tlf 发表于 2021-4-14 21:05

不忘形影 发表于 2021-4-14 21:34

请教楼主是跟着哪个教程学的
页: [1] 2
查看完整版本: 学习C++的第17天