热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

通过远程代码注入实现不死进程

1.简介通过注入一个远程线程到explorer.exe中,该线程对要被保护的进程进行监控,如果发现该进程退出了就重新启动之.远程代码注入实现:http:www.cnblogs.comfreese

1.简介

通过注入一个远程线程到explorer.exe中,该线程对要被保护的进程进行监控,如果发现该进程退出了就重新启动之.

远程代码注入实现:http://www.cnblogs.com/freesec/p/6554518.html

 

2.测试代码

// lives.cpp : 定义控制台应用程序的入口点。
//

#include
"stdafx.h"
#include

#include

char exepath[MAX_PATH];

//声明需要用到的函数
typedef HMODULE(WINAPI *lpLoadLibraryA)(char* filename);
typedef FARPROC(WINAPI
*lpGetProcAddress)(HMODULE hModule, char* funcName);
typedef UINT(
WINAPI
*
lpWinExec)(
IN LPCSTR lpCmdLine,
IN UINT uCmdShow
);

typedef DWORD(
WINAPI
*
lpWaitForSingleObject)(
IN HANDLE hHandle,
IN DWORD dwMilliseconds
);


typedef HANDLE(
WINAPI
*
lpOpenProcess)(
IN DWORD dwDesiredAccess,
IN BOOL bInheritHandle,
IN DWORD dwProcessId
);


typedef
struct _thread_param
{
lpLoadLibraryA loadFunc;
lpGetProcAddress GetPFunc;
DWORD PID;
//被保护的进程的进程id
//char mutex[8];//保证只被注入一次
//保存所有参数
//在被注入进程中需要调用的函数:LoadLibrary,GetProcAddress,WaitForSimpleObject,WinExec
//因此需要参数:被保护的进程路径,kernel32.dll ,WaitForSingleObject,WinExec,
//OpenProcess(这3个作为GetProcAddress的参数) 共5个参数
char data[5][100];
}thread_param;

DWORD WINAPI threadProc(LPVOID param)
{
thread_param
* tparam = (thread_param*)param;
HMODULE hd
=tparam->loadFunc(tparam->data[0]);//data的第一个参数是kernel32.dll
lpWaitForSingleObject wfso=(lpWaitForSingleObject)tparam->GetPFunc(hd,tparam->data[2]);
lpWinExec we
=(lpWinExec)tparam->GetPFunc(hd,tparam->data[3]);
lpOpenProcess op
=(lpOpenProcess)tparam->GetPFunc(hd,tparam->data[4]);
DWORD pid
=tparam->PID;
HANDLE hProcess
=op(PROCESS_ALL_ACCESS,0,pid);
wfso(hProcess,INFINITE);
we(tparam
->data[1],SW_SHOW);
return 0;
}

DWORD codeInject(DWORD pid)
{
HANDLE hProcess
= OpenProcess(PROCESS_ALL_ACCESS, 0, pid);
if (hProcess==0||hProcess==INVALID_HANDLE_VALUE)
{
return 0;
}
thread_param param
= { 0 };
param.loadFunc
= (lpLoadLibraryA)GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA");
param.GetPFunc
= (lpGetProcAddress)GetProcAddress(GetModuleHandleA("kernel32.dll"), "GetProcAddress");
memcpy(
¶m.data[0], "kernel32.dll", 13);
GetModuleFileNameA(
0,exepath,MAX_PATH);
memcpy(
¶m.data[1], exepath, strlen(exepath)+1);
memcpy(
¶m.data[2], "WaitForSingleObject", 20);
memcpy(
¶m.data[3], "WinExec", 8);
memcpy(
¶m.data[4],"OpenProcess",12);
param.PID
=GetCurrentProcessId();
//DWORD codesize = (DWORD)codeInject - (DWORD)threadProc; //计算线程函数的代码大小
LPVOID database = VirtualAllocEx(hProcess, 0, sizeof(thread_param), MEM_COMMIT, PAGE_READWRITE);
DWORD written;
HANDLE hThread;
if (database==0)
{
CloseHandle(hProcess);
return 0;
}
WriteProcessMemory(hProcess, database,
¶m, sizeof(thread_param), &written);
LPVOID codebase
= VirtualAllocEx(hProcess, 0, 0x1000, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (codebase == 0)
{
VirtualFreeEx(hProcess, database,
sizeof(thread_param), MEM_FREE);
CloseHandle(hProcess);
return 0;
}
WriteProcessMemory(hProcess, codebase,
&threadProc, 0x1000, &written);
if ((hThread=CreateRemoteThread(hProcess, 0, 0, (LPTHREAD_START_ROUTINE)codebase, database, 0, 0))!=0)
{
VirtualFreeEx(hProcess, database,
sizeof(thread_param), MEM_FREE);
VirtualFreeEx(hProcess, codebase,
0x1000, MEM_FREE);
CloseHandle(hThread);
CloseHandle(hProcess);
return 1;
}
VirtualFreeEx(hProcess, database,
sizeof(thread_param), MEM_FREE);
VirtualFreeEx(hProcess, codebase,
0x1000, MEM_FREE);
CloseHandle(hProcess);
return 0;
}

DWORD getTargetProcessId()
{

PROCESSENTRY32W pe32;
pe32.dwSize
=sizeof(PROCESSENTRY32W);
HANDLE snap
=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
DWORD result
=Process32FirstW(snap,&pe32);
if(result==0)
{

return 0;
}
do
{
if (lstrcmpW(pe32.szExeFile,L"explorer.exe")==0)
{
CloseHandle(snap);
return pe32.th32ProcessID;
}
}
while (Process32NextW(snap,&pe32));
CloseHandle(snap);
return 0;
}
int wmain(int argc, WCHAR* argv[])
{
setlocale(LC_ALL,
"chs");
DWORD pid;

pid
=getTargetProcessId();
if (pid==0)
{
printf(
"getTargetProcessId error code is %d\n",GetLastError());
return 0;
}
codeInject(pid);
while(1)
{

MessageBoxA(
0,"kill me!","kill me!",0);
Sleep(
1000);
}
return 0;
}

 


推荐阅读
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
author-avatar
我不是不是小受
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有