XP/Win7通用的CreateRemoteThread类

Inject.h


#pragma once
typedef DWORD (WINAPI *PFNTCREATETHREADEX)
(
PHANDLE ThreadHandle,
ACCESS_MASK DesiredAccess,
LPVOID ObjectAttributes,
HANDLE ProcessHandle,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
BOOL CreateSuspended,
DWORD dwStackSize,
DWORD dw1,
DWORD dw2,
LPVOID Unknown
);

BOOL InjectDll(DWORD dwPID, char *szDllName);

Inject.cpp


#include "StdAfx.h"
#include "stdio.h"
#include "tchar.h"
#include "Inject.h"
#include <Windows.h>

BOOL IsVistaOrLater()
{
OSVERSIONINFO osvi;
ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&osvi);
if( osvi.dwMajorVersion >= 6 )
return TRUE;
return FALSE;
}

BOOL MyCreateRemoteThread(HANDLE hProcess, LPTHREAD_START_ROUTINE pThreadProc, LPVOID pRemoteBuf)
{
HANDLE hThread = NULL;
FARPROC pFunc = NULL;
if( IsVistaOrLater() ) // Vista, 7, Server2008
{
pFunc = GetProcAddress(GetModuleHandle("ntdll.dll"), "NtCreateThreadEx");
if( pFunc == NULL )
{
return FALSE;
}
((PFNTCREATETHREADEX)pFunc)(&hThread,
0x1FFFFF,
NULL,
hProcess,
pThreadProc,
pRemoteBuf,
FALSE,
NULL,
NULL,
NULL,
NULL);
if( hThread == NULL )
{
//printf("MyCreateRemoteThread() : NtCreateThreadEx() 调用失败!错误代码: [%d]/n", GetLastError());
return FALSE;
}
}
else // 2000, XP, Server2003
{
hThread = CreateRemoteThread(hProcess,
NULL,
0,
pThreadProc,
pRemoteBuf,
0,
NULL);
if( hThread == NULL )
{
//printf("MyCreateRemoteThread() : CreateRemoteThread() 调用失败!错误代码: [%d]/n", GetLastError());
return FALSE;
}
}
if( WAIT_FAILED == WaitForSingleObject(hThread, INFINITE) )
{
//printf("MyCreateRemoteThread() : WaitForSingleObject() 调用失败!错误代码: [%d]/n", GetLastError());
return FALSE;
}
return TRUE;
}

BOOL InjectDll(DWORD dwPID, char *szDllName)
{
HANDLE hProcess = NULL;
LPVOID pRemoteBuf = NULL;
FARPROC pThreadProc = NULL;
char szAppPath[MAX_PATH];
GetModuleFileName(NULL, szAppPath, MAX_PATH);
(strrchr(szAppPath, ‘\\‘))[1] = 0;
strcat(szAppPath,szDllName);
DWORD dwBufSize = strlen(szAppPath)+1;
if ( !(hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID)) )
{
//printf("[错误] OpenProcess(%d) 调用失败!错误代码: [%d]/n", dwPID, GetLastError());
return FALSE;
}
pRemoteBuf = VirtualAllocEx(hProcess, NULL, dwBufSize,
MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(hProcess, pRemoteBuf, (LPVOID)szAppPath,
dwBufSize, NULL);
pThreadProc = GetProcAddress(GetModuleHandle("kernel32.dll"),"LoadLibraryA");
if( !MyCreateRemoteThread(hProcess, (LPTHREAD_START_ROUTINE)pThreadProc, pRemoteBuf) )
{
//printf("[错误] CreateRemoteThread() 调用失败!错误代码: [%d]/n", GetLastError());
return FALSE;
}
VirtualFreeEx(hProcess, pRemoteBuf, 0, MEM_RELEASE);
CloseHandle(hProcess);
return TRUE;
}

XP/Win7通用的CreateRemoteThread类

时间: 2024-11-25 20:44:16

XP/Win7通用的CreateRemoteThread类的相关文章

u盘安装系统(windows XP,win7,win8,2008通用)

1. 2G U盘一个.  UltraISO软件(下面有下载) 2.首先插入U盘格式化成FAT文件系统,打开UltraISO软件 (1)用UltraISO软件打开系统镜像 (2)点击菜单 "启动"-写入硬盘映像 (3)写入方式改成USB-HDD ,点击便捷启动-写入新硬盘主引导记录(MBR)-USB-HDD (4)点击写入 写入完毕就做好了然后重启把BIOS里的启动项调成USB-HDD启动保存后重启就可以安装了安装windows server 2008过程中会要求重启,这点要注意在重启时

Javascript中两种最通用的定义类的方法

在Javascript中,一切都是对象,包括函数.在Javascript中并没有真正的类,不能像C#,PHP等语言中用 class xxx来定义.但Javascript中提供了一种折中的方案:把对象定义描述为对象的配方(先看一下例子会比较容易理解).定义类的方法有很多种,这里有两中较为通用的方法,大家参考一下.这两种方法均可以解决 构造函数会重复生成函数,为每个对象都创建独立版本的函数的问题.解决了重复初始化函数和函数共享的问题??提示音:http://www.huiyi8.com/tishiy

PHP类初识,通用数据库操作类,前端easyui-datagrid,form

实现功能:     左端datagrid显示简略信息,右侧显示选中行详细信息,数据库增删改 (1)点击选中行,右侧显示详细信息,其中[新增].[修改].[删除]按钮可用,[保存]按钮禁用 (2)点击[新增]按钮,[修改],[删除]按钮禁用,[保存]按钮启用 (3)点击[修改]按钮,[新增],[删除]按钮禁用 难点:通用数据库操作类中insert方法跟update方法 最终效果图: 前端功能不是很完善,按钮之间逻辑还是有点问题,最后补充前端代码 其中Formain.php对前端传值判断,并调用ac

通用字符串管理类

1 import java.text.NumberFormat; 2 3 /** 4 * Created by Charlie on 2016/12/6. 5 * 通用字符串管理类 6 */ 7 public class StringUtils { 8 9 /** 10 * 将double转为数值,并最多保留num位小数.例如当num为2时,1.268为1.27,1.2仍为1.2:1仍为1,而非1.00;100.00则返回100. 11 * 12 * @param d 13 * @param n

MFC对话框美化使其具有xp/win7风格(转载)

首先在RES目录下建一个文件,命名 windows.manifest 后缀为:.manifest 然后用记事本打开放入 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <

三星笔记本R428安装xp win7双系统,切换系统重启才能进入系统解决办法。

三星笔记本 XP win7 双系统切换重启解决方法 三星笔记本有个奇怪的现象,就是装有XP和win7双系统    xp切换到win7.进系统是会重启一次,并且bios回复光驱为第一启动项,win7切换到XP也是一样.但是如果一直只用其中的一个系统时则没有重启的现象. 经过两天的实践我的三星R428本本终于可以一次就切换成功.现将我的经验与大家分享,希望能帮到有需要的童鞋 重启的原因如下: Bios中 advance下的AHCI Mode Control(仅供参考,不同品牌会不一样) 设置为AUT

Java中的静态代理、通用动态代理类以及原理剖析

代理模式和静态代理 在开发中,代理模式是常用的模式之一,一般来说我们使用的代理模式基本上都是静态代理,实现模式大致如下 : 我们以网络代理为例,简单演示一下静态代理的实现 : // 网络接口 interface Network { public void surfTheInternet(); public void gotoFacebook(); } // 普通网络 class CommonNetwork implements Network { @Override public void su

C#导出数据到Excel通用的方法类

导出数据到Excel通用的方法类,请应对需求自行修改. 资源下载列表 using System.Data; using System.IO; namespace IM.Common.Tools { public class Export { public string Encoding = "UTF-8"; System.Web.HttpResponse response = System.Web.HttpContext.Current.Response; public void Ec

通用Hibernate DAO类(包括分页)

package com.jronline.dao; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.List; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.SQLQuery; import org.hibern