博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用CreateRemoteThread把代码远程注入指定exe执行
阅读量:4193 次
发布时间:2019-05-26

本文共 4538 字,大约阅读时间需要 15 分钟。

效果图示如下:

做的这个例子首先是创建了一个MFC 对话框程序,然后自己创建了一个 带有导出函数 (简单的减法) 的DLL , 这个Calc按键就是调用自己DLL里面的减法函数 计算1 - 1, 其次创建一个拥有能够修改进程中某函数的入口代码功能的DLL(为什么是DLL,网上有大量详细的资料,), 然后我们还创建一个windows控制台程序 也就是 调用CreateRemoteThread  让Calc 加载我们准备好的DLL(修改函数入口代码), 因为DLL被加载时我们可以在DLLMain中指定要执行的代码。

未注入代码之前:

 

执行我的 注入程序createremotethread.exe 之后 如下图:

 

可以看到注入成功了, 注入的是什么呢? 这就是 CreateRemoteThread的作用了, 我们向Calc.exe 注入了一个线程,然后这个线程执行了LoadLibrary 函数,

我告诉Calc 要Load 我指定的 DLL, 为什么呢? 因为 我指定的这个DLL 是我们自己创建的, 它里面的函数代码能找到Calc进程中 原来sub函数的地址,然后并

修改sub函数地址处的入口代码,也就是改成 jmp xxx 使Calc 执行我们指定的代码。

 

最重要的CreateRemoteThread:

 

  HANDLE hThread;    char szLibPath[_MAX_PATH] = "E:\\vs2010project\\InjectDll\\Release\\InjectDll.dll"; //指定注入之后目标进程要加载的DLL    DWORD hLibModule;    HANDLE hProcess = NULL;    hProcess = GetProcessByName("Calc.exe");    DWORD ERRO = GetLastError();    if(hProcess == NULL)        return 0;    HMODULE modHandle = GetModuleHandle(_T("Kernel32")); //因为kernel32 每一个windows程序进程空间中都有 所以让他调用LOADLIBRARY不成问题  void* pLibRemote = VirtualAllocEx(hProcess, NULL, sizeof(szLibPath), MEM_COMMIT, PAGE_EXECUTE_READWRITE);    LPTHREAD_START_ROUTINE addr = (LPTHREAD_START_ROUTINE)GetProcAddress(modHandle, "LoadLibraryA");    WriteProcessMemory( hProcess, pLibRemote, (void*)szLibPath, sizeof(szLibPath), NULL);     hThread = CreateRemoteThread(hProcess, NULL, 0,                                addr,                                pLibRemote,                                0,                                NULL);        WaitForSingleObject(hThread, INFINITE);    CloseHandle(hThread);

 

 

 

根据进程名字获取进程句柄也是本例子非常关键的部分,可以通过微软提供的api 拍摄进程列表快照, 然后再遍历寻找,代码如下:

 

HANDLE GetProcessByName(const char* name){    EnableDebugPriv();    DWORD pid = 0;    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);    PROCESSENTRY32 process;    ZeroMemory(&process, sizeof(process));    process.dwSize = sizeof(process);    if (Process32First(snapshot, &process))    {        do        {            if( stricmp(UnicodeToAnsi(process.szExeFile), name) == 0)            {                pid = process.th32ProcessID;                break;            }        }while(Process32Next(snapshot, &process));    }    CloseHandle(snapshot);        if(pid != 0)    {        HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);                return hProcess;    }    return NULL;    }

 

 

 

其中 关于 CreateRemoteThread 部分的核心代码有许多需要注意的事情 主要有 执行OPENPROCESS之前需要开启特权 代码如下:

 

1 void EnableDebugPriv() 2 { 3     HANDLE hToken; 4     LUID luid; 5     TOKEN_PRIVILEGES tkp; 6  7     OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken); 8  9     LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid);10 11     tkp.PrivilegeCount = 1;12     tkp.Privileges[0].Luid = luid;13     tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;14 15     AdjustTokenPrivileges(hToken, false, &tkp, sizeof(tkp), NULL, NULL);16 17     CloseHandle(hToken); 18 }

 

接下来我们就可以调用openprocess 打开目标进程 进行进一步的操作(调用CreateRemoteThread)达到使目标进程加载我们指定DLL,进而指定DLL被加载时能执行指定代码。

 

最后 关于修改进程中 导入 dll 中的函数的入口处代码 的代码如下:

 

 

BYTE NewCode[5]; //用来替换原入口代码的字节 (jmp xxxx)typedef int (_cdecl* getsub)(int x,int y);    //typedef 比较少的用法 能定一个函数指针类型 即getsub getsub mySub = NULL; //用新定义的类型定义一个变量FARPROC pfar_sub;   //指向mySub函数的远指针HANDLE hProcess = NULL; //所处进程的句柄DWORD pid;    //所处进程ID

 

//修改mySub入口处代码void modify(){     assert(hProcess != NULL);    DWORD dwTemp=0;    DWORD dwOldProtect;        VirtualProtectEx(hProcess, pfar_sub, 5, PAGE_READWRITE, &dwOldProtect); //将内存保护模式改为可读写,原保护模式保存入dwOldProtect    WriteProcessMemory(hProcess, pfar_sub, NewCode, 5, 0);    VirtualProtectEx(hProcess, pfar_sub, 5, dwOldProtect, &dwTemp); //恢复内存保护模式}int new_sub(int x,int y){    return 1;}int inject(){    DWORD dwPid = ::GetCurrentProcessId();    hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, dwPid);     int addr_farpointer = 0;    //获取My_sub()函数地址    HMODULE hmod = ::LoadLibrary(_T("E:\\vs2010project\\My_Sub\\Debug\\My_Sub.dll"));    mySub = (getsub)::GetProcAddress(hmod, "mySub");    pfar_sub=(FARPROC)mySub;    addr_farpointer = (int)pfar_sub;            if (pfar_sub == NULL)    {            MessageBox(NULL, TEXT("locate mySub failed!!"), TEXT("info"), MB_OK);        return FALSE;    }    NewCode[0] = 0xe9;//0xe9 == jmp        _asm     {         lea eax, new_sub        mov ebx, pfar_sub         sub eax, ebx         sub eax, 5         mov dword ptr [NewCode + 1],eax     }     modify();     MessageBox(NULL, TEXT("Modified SUCCESSFULLY!!"), TEXT("info"), MB_OK);    return TRUE;}

 

 

 

整体流程清楚了实践应该没啥问题(还是需要折腾的, 折腾也是进步的过程)。

附上主要工程文件链接 http://pan.baidu.com/s/1dD4WhZN

转载地址:http://wuloi.baihongyu.com/

你可能感兴趣的文章
Soul回应赴美上市传闻:不是约会软件 没有确定的上市计划
查看>>
“考不上本科是智商有问题”,这位吴先生火了!涉事公司回应...
查看>>
黄峥辞任董事长,超级投票权失效!拼多多已成为中国电商第一
查看>>
华为P50系列旗舰恐延期至5月发布:首发预装鸿蒙系统
查看>>
中芯国际:与深圳国资造28nm晶圆厂 预期2022年开始生产
查看>>
苹果赢了!iOS14隐私功能并不违反法国反垄断法
查看>>
不到6年“拼”活近8亿用户 拼多多还在狂奔
查看>>
闲鱼的真正用法,其实是找对象
查看>>
谁说性能与功耗不可兼得!全新英特尔670p将重塑硬盘市场格局
查看>>
贾跃亭还没回国,退市的乐视网突然沸腾!连拉15个涨停?
查看>>
苹果春季发布会或推迟至4月 AirPods 3可能缺席
查看>>
苹果零售业逐步恢复:部分已允许顾客店内试用AirPods
查看>>
页面无法正常显示,淘宝又崩了!周五上班摸鱼被发现...
查看>>
一加9系列全网预约量破200万:3月24日见!
查看>>
realme X7 Pro至尊版确认:最便宜的曲面屏手机
查看>>
iPhone 12s渲染图曝光,刘海变小了!
查看>>
猎聘2020年Q4营收6.08亿元 同比增长47.6%
查看>>
数百台湾人把名字改成“鲑鱼”去吃免费日料,结果有人改不回来了
查看>>
2021款iPad Pro渲染图曝光:依旧采用双摄+激光雷达扫描仪
查看>>
华为P50首发麒麟9000L:5nm EUV工艺打造 配置有所缩减
查看>>