在Windows2000/XP下向进程插入自己的线程的演示

转载 2007年09月29日 15:22:00

在Windows2000/XP下向进程插入自己的线程的演示 

编写 ImageWalk.Dll (作用是当被加载,它就通过VirtualQuery获取加载它的进程所加载的Dll信息)使用VC6生成一个 Win32 Dynamic-Link Library 工程编写DllMain函数内容如下:

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
MEMORY_BASIC_INFORMATION mbi;
PBYTE ptr = NULL;
DWORD dwBytesReturn = sizeof(MEMORY_BASIC_INFORMATION);

char szBuffer[256*100] = "";
char szModuFile[240] = "";
char szThis[256] = "";
char szProcess[256] = "";
char szTmpBuffer[256] = "";

GetModuleFileName((HINSTANCE)hModule, szThis, 256);
GetModuleFileName(GetModuleHandle(NULL), szProcess,256);

while( dwBytesReturn == sizeof(MEMORY_BASIC_INFORMATION) )
{
dwBytesReturn = VirtualQuery( ptr,&mbi,sizeof(MEMORY_BASIC_INFORMATION) );

if( mbi.Type == MEM_FREE )
{
mbi.AllocationBase = mbi.BaseAddress;
}

GetModuleFileName( (HINSTANCE)mbi.AllocationBase, szModuFile,240 );

sprintf(szTmpBuffer,"/t[ Module: 0x%x - %s ] /r/n",mbi.AllocationBase,szModuFile);

if(mbi.AllocationBase == mbi.BaseAddress &&
mbi.AllocationBase != NULL &&
strcmp(szThis,szModuFile) !=0 &&
strcmp(szProcess,szModuFile) != 0 )strcat(szBuffer , szTmpBuffer);

ptr += mbi.RegionSize;

}
}
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

  编译生成ImageWalk.dll

  这个函数用来列举系统的进程(为了简化,生成一个字符串)
void EnumProcess(char * szBuffer)//由你提供的字符串缓冲区,此处为了简化,假定这一缓冲区足够大
{
char szCurrentProcessInfo[512] = "" ;
char szExeName[256] = "" ;
char szAllProcessInfo[512*256] = "" ;
HANDLE hCurrentProcess = NULL ;
HMODULE hCurrentModule = NULL ;

HANDLE hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPALL , 0 );
PROCESSENTRY32 ppe;

ppe.dwSize = sizeof(ppe);

Process32First(hSnapshot,&ppe);

hCurrentProcess = OpenProcess( PROCESS_QUERY_INFORMATION|PROCESS_VM_READ|PROCESS_VM_READ|PROCESS_VM_OPERATION , FALSE, ppe.th32ProcessID);


GetModuleFileName( hCurrentModule , szExeName , 256 );

sprintf(szCurrentProcessInfo,"[ExeFileName:%s; Process ID:0x%x(%d); Thread Count:%d; Usage:%d]/r/n",
ppe.szExeFile, ppe.th32ProcessID ,ppe.th32ProcessID , ppe.cntThreads, ppe.cntUsage);

strcat(szAllProcessInfo,szCurrentProcessInfo);

while( Process32Next(hSnapshot , &ppe) )
{
hCurrentProcess = OpenProcess( PROCESS_QUERY_INFORMATION|PROCESS_VM_READ|PROCESS_VM_READ|PROCESS_VM_OPERATION, FALSE, ppe.th32ProcessID);

GetModuleFileName( (HINSTANCE)hCurrentProcess , szExeName , 256 );

sprintf(szCurrentProcessInfo,"[ExeFileName:%s; Process ID:0x%x(%d); Thread Count:%d; Usage:%d]/r/n",
ppe.szExeFile , ppe.th32ProcessID ,ppe.th32ProcessID, ppe.cntThreads, ppe.cntUsage );

strcat(szAllProcessInfo,szCurrentProcessInfo);
}

CloseHandle(hSnapshot);
hSnapshot = NULL;
strcpy(szBuffer,szAllProcessInfo);
}

//这个函数将ImageWalk.dll插入指定的线程,为了简化,假定ImageWalk.dll就在d:/
void InjectDll(DWORD m_ProcessID, char * szBuffer)//通过上面的EnumProcess可以获得Process ID
{//szBuffer,储存了被插入线程加载Dll的信息(不会出现ImageWalk.dll)为了简化,假定其足够大
char szTmp[256] = "";
size_t bytesread = 0;

HANDLE hProcess = OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,m_ProcessID);//打开进程,获取进程Handle
PSTR pszLibName = (PSTR)VirtualAllocEx(hProcess,NULL,64,MEM_COMMIT,PAGE_READWRITE);
//我们要在远程进程中运行一个新的线程,所传入的参数的内容必须放入远程进程的地址空间,
//使用VirtualAllocEx分配远程进程的内存
WriteProcessMemory(hProcess,pszLibName,(PVOID)"D:/ImageWalk.dll",17,NULL);
//将参数写入刚才分配好的空间

PTHREAD_START_ROUTINE pfnLoadLib = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("kernel32.dll"),"LoadLibraryA");
//获取LoadLibraryA在内村中的地址

if(pfnLoadLib && hProcess)
{
HANDLE hThread = CreateRemoteThread(hProcess,NULL,0,pfnLoadLib,pszLibName,0,NULL);
//创建一个线程,让远程进程执行 LoadLibraryA("D:/ImageWalk.dll")
//注意pfnLoadLib不能换成LoadLibraryA
WaitForSingleObject(hThread,INFINITE);
//等待线程结束

HANDLE hDll;

GetExitCodeThread(hThread, (DWORD*)&hDll);//获取LoadLibraryA("d:/imagewalk.dll")所返回的hModule

CloseHandle(hThread);

pfnLoadLib = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("kernel32.dll"),"FreeLibrary");

FILE * fp;
while( (fp = fopen("d:/image.txt","rt") ) == NULL)
{
Sleep(50);
}//等待ImageWalk.dll将信息写入交换文件


while( !feof(fp) )
{
bytesread=fread(szTmp,1,255,fp);
szTmp[bytesread] = '';
strcat(szBuffer,szTmp);

}

fclose(fp);

if(pfnLoadLib)
{//将ImageWalk卸载

hThread = CreateRemoteThread(hProcess,NULL,0,pfnLoadLib,hDll,0,NULL);
WaitForSingleObject(hThread,INFINITE);
CloseHandle(hThread);
}

}

VirtualFreeEx(hProcess,pszLibName,0,MEM_RELEASE);//释放刚才分配的远程进程的内存
CloseHandle(hProcess);
}

如何在不插网线启用网卡的TCP/IP协议 ping 通自己的IP

HUB没通电,或是机器后面的网线没插上的情况下,OS 会自动在任务栏上显示一个“网线断开”的图标,并且将该网卡的所有协议层退出,这时你PING网卡的IP将无回应。这个功能叫做网卡的“媒介探测(Medi...
  • sflsgfs
  • sflsgfs
  • 2013年01月14日 16:37
  • 3260

JavaScript排序算法动画演示效果实现

JavaScript排序算法动画演示效果实现。冒泡排序、插入排序、选择排序、快速排序、归并排序、希尔排序动画演示。 实现过程。...
  • liusaint1992
  • liusaint1992
  • 2016年06月13日 11:29
  • 3419

两种方法在github中做在线Demo演示

作为一个前端工程师,平常写一些小demo或项目时会遇到这样的情况:我想把这个html页面呈现给别人看看,又不想把整个工程项目发给他,这样太麻烦,要是有个能在线演示demo的平台就好了。OK,githu...
  • sinat_29412671
  • sinat_29412671
  • 2016年12月14日 10:08
  • 2212

VC++信息安全编程(13)Windows2000/xp/vista/7磁盘扇区读写技术

有些时候,我们读取磁盘文件,会被hook.我们读到的可能并非实际的文件。 我们直接读取磁盘扇区获取数据。 实现磁盘数据的读写,不依赖WindowsAPI。   [cpp] view p...
  • thanklife
  • thanklife
  • 2017年10月20日 17:26
  • 176

Windows2000/XP启动过程详细分析

Windows2000/XP是一个优秀的操作系统,它功能强大,安全稳定,深受广大电脑用户青睐。但在使用过程中,我们明显地感觉到它的启动时间比Windows98要延长许多,比之Windows98更能考验...
  • muchmoneyman
  • muchmoneyman
  • 2014年07月15日 15:40
  • 406

解读Windows2000/XP分层驱动模型

可扩展性是Windows NT/2000/XP设计的目标之一,其分层驱动模型是可扩展性的最好体现。实现分层依赖于IO管理器的两个重要的设计:1、Windows中的任何一个驱动程序都被设计成Client...
  • wzsy
  • wzsy
  • 2012年03月02日 17:55
  • 573

VC++信息安全编程(13)Windows2000/xp/vista/7磁盘扇区读写技术

有些时候,我们读取磁盘文件,会被hook.我们读到的可能并非实际的文件。我们直接读取磁盘扇区获取数据。实现磁盘数据的读写,不依赖WindowsAPI。 void CSectorEdit2000Dlg:...
  • yincheng01
  • yincheng01
  • 2011年12月15日 08:04
  • 4414

Windows2000、XP、2003系统万能Ghost全攻略

一直以来,安装操作系统和应用软件是一件吃力不讨好的事情,虽然现在的电脑速度越来越快,并且操作系统安装步骤也很简单,但每次都是只能等系统慢慢地一步步完成,系统装完后,接着装应用软件,并具还要设置网络使用...
  • gisliuliu
  • gisliuliu
  • 2012年04月13日 15:09
  • 198

Windows2000系统进程总列表

Windows2000系统进程总列表(手工清木马时候有用)                                                       主要分为三大类 1.最基本的系统...
  • ruiqingzheng
  • ruiqingzheng
  • 2013年03月14日 23:34
  • 271

Windows2000_XP设备驱动程序探析

  • 2015年04月14日 09:46
  • 86KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在Windows2000/XP下向进程插入自己的线程的演示
举报原因:
原因补充:

(最多只允许输入30个字)