由于本人也是新手,如果有朋友不懂windows api相关知识,我相信查阅书籍或者百度会比我说有帮助的多,下面就我所做简单复述一下过程,欢迎指正缺点。

效果图示如下:

做的这个例子首先是创建了一个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 ; 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, ,
addr,
pLibRemote,
,
NULL); WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);

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

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

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

 void EnableDebugPriv()
{
HANDLE hToken;
LUID luid;
TOKEN_PRIVILEGES tkp; OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken); LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid); tkp.PrivilegeCount = ;
tkp.Privileges[].Luid = luid;
tkp.Privileges[].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, false, &tkp, sizeof(tkp), NULL, NULL); CloseHandle(hToken);
}

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

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

BYTE NewCode[]; //用来替换原入口代码的字节 (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=;
DWORD dwOldProtect; VirtualProtectEx(hProcess, pfar_sub, , PAGE_READWRITE, &dwOldProtect); //将内存保护模式改为可读写,原保护模式保存入dwOldProtect
WriteProcessMemory(hProcess, pfar_sub, NewCode, , );
VirtualProtectEx(hProcess, pfar_sub, , dwOldProtect, &dwTemp); //恢复内存保护模式
} int new_sub(int x,int y)
{
return ;
} int inject()
{
DWORD dwPid = ::GetCurrentProcessId();
hProcess = OpenProcess(PROCESS_ALL_ACCESS, , dwPid); int addr_farpointer = ; //获取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[] = 0xe9;//0xe9 == jmp _asm
{
lea eax, new_sub
mov ebx, pfar_sub
sub eax, ebx
sub eax,
mov dword ptr [NewCode + ],eax
} modify();
MessageBox(NULL, TEXT("Modified SUCCESSFULLY!!"), TEXT("info"), MB_OK);
return TRUE;
}

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

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

使用CreateRemoteThread把代码远程注入指定exe执行的更多相关文章

  1. windows:shellcode 代码远程APC注入和加载

    https://www.cnblogs.com/theseventhson/p/13197776.html  上一章介绍了通用的shellcode加载器,这个加载器自己调用virtualAlloc分配 ...

  2. WinAPI【远程注入】三种注入方案【转】

    来源:http://www.cnblogs.com/okwary/archive/2008/12/20/1358788.html 导言: 我 们在Code project(www.codeprojec ...

  3. HOOK -- DLL的远程注入技术详解(1)

    DLL的远程注入技术是目前Win32病毒广泛使用的一种技术.使用这种技术的病毒体通常位于一个DLL中,在系统启动的时候,一个EXE程序会将这个DLL加载至某些系统进程(如Explorer.exe)中运 ...

  4. [转]远程注入DLL : 取得句柄的令牌 OpenProcessToken()

    http://hi.baidu.com/43755979/blog/item/3ac19711ea01bdc4a6ef3f6a.html 要对一个任意进程(包括系统安全进程和服务进程)进行指定了写相关 ...

  5. DLL的远程注入技术

    DLL的远程注入技术是目前Win32病毒广泛使用的一种技术.使用这种技术的病毒体通常位于一个DLL中,在系统启动的时候,一个EXE程序会将这个DLL加载至某些系统进程(如Explorer.exe)中运 ...

  6. 将DLL挂接到远程进程之中(远程注入)

    线程的远程注入 要实现线程的远程注入必须使用Windows提供的CreateRemoteThread函数来创建一个远程线程该函数的原型如下:HANDLE CreateRemoteThread(    ...

  7. 【技巧总结】Penetration Test Engineer[3]-Web-Security(SQL注入、XXS、代码注入、命令执行、变量覆盖、XSS)

    3.Web安全基础 3.1.HTTP协议 1)TCP/IP协议-HTTP 应用层:HTTP.FTP.TELNET.DNS.POP3 传输层:TCP.UDP 网络层:IP.ICMP.ARP 2)常用方法 ...

  8. DLL远程注入实例

    一般情况下,每个进程都有自己的私有空间,理论上,别的进程是不允许对这个私人空间进行操作的,但是,我们可以利用一些方法进入这个空间并进行操作,将自己的代码写入正在运行的进程中,于是就有了远程注入了. 对 ...

  9. 在Eclipse中运行JAVA代码远程操作HBase的示例

    在Eclipse中运行JAVA代码远程操作HBase的示例 分类: 大数据 2014-03-04 13:47 3762人阅读 评论(2) 收藏 举报 下面是一个在Windows的Eclipse中通过J ...

随机推荐

  1. ELK + Kafka + Filebeat

    ELK + Kafka + Filebeat学习 https://blog.csdn.net/qq_21383435/article/details/79463832 https://blog.csd ...

  2. 【bzoj3856】Monster 乱搞

    题目描述 你要打一只h点血的怪物,每回合你攻击会造成a点伤害,回合结束后怪物会回b点血,你每攻击k回合需要休息一次,该回合不能造成伤害.怪物血量降到0以下就会死亡,问最后能否打死怪物. 输入 Ther ...

  3. BZOJ4591 SHOI2015超能粒子炮·改(卢卡斯定理+数位dp)

    注意到模数很小,容易想到使用卢卡斯定理,即变成一个2333进制数各位组合数的乘积.对于k的限制容易想到数位dp.可以预处理一发2333以内的组合数及组合数前缀和,然后设f[i][0/1]为前i位是否卡 ...

  4. NOIP临考经验【转】

    NOIP临考经验 1.提前15分钟入场,此时静坐调整心态,适当的深呼吸 2.打开编辑器并调整为自己喜欢的界面 3.熟悉文件目录,写好准确无误的代码模板 4.压缩包或许还不能解压,但是文件名已经可以知道 ...

  5. SRM707 div1 MultiplyAddPuzzle

    题目大意:给定4个数,s,t,a,b 每次可以将s加a或者乘b,问最少多少次可以得到t 做法:考虑最后的形式,肯定是s*b^n + a*f(b),f(b)是关于b的多项式 那么b乘多少次实际上是可以知 ...

  6. [NOI2017 D1T1]整数

    题目大意:有一个整数 $x$ ,一开始为 $0$ .有 $n$ 个操作,有两种类型: $1 \;a\; b$:将 $x$ 加上整数 $a\cdot 2^b$ ,其中 $a$ 为一个整数, $b$ 为一 ...

  7. 安徽师大附中%你赛day4T1 金字塔 解题报告

    金字塔 题目背景: \(Zdrcl\)带着妹子们来到了胡夫金字塔周边旅游, 发现这里正在进行一个有关金字塔的游戏 题目描述: 游戏规则如下: 1. 这里的金字塔是一个 \(N\) 阶的二维金字塔. 2 ...

  8. 用伪类实现一个div的宽度和高度是固定百分比

    遇到一个题目:一个div宽度是固定百分比的情况下,如何设置高度是宽度的80% 看到题目的第一反应是用js控制,获取到div的宽度之后再用宽度的80%来设置div的高度,但是如何在不用js的情况下,只用 ...

  9. CentOS 6通过yum升级Git

    By francis_hao    Mar 9,2017   在一个新机器上推送代码到github上时出现了下面的问题 error: The requested URL returned error: ...

  10. ionic3自定义图标

    http://blog.csdn.net/qq993284758/article/details/78107412