HookIAT的启动程序
// 启动程序.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <Windows.h>
#include <TlHelp32.h>
#include <iostream>
#include <Psapi.h> #pragma comment(lib,"psapi.lib")
using namespace std;
BOOL IsX64PEFile(WCHAR* wzProcessFullPath);
BOOL GetProcessIDByProcessImageName(WCHAR* wzProcessImageName,DWORD* dwTargetProcessID);
BOOL EnableDebugPrivilege();
int _tmain(int argc, _TCHAR* argv[])
{ if (EnableDebugPrivilege()==FALSE) // 进行提权
{
return ;
} DWORD dwTargetProcessID = ;
HANDLE hTargetProcess = NULL; if(GetProcessIDByProcessImageName(L"EnumProcessByForce应用程序.exe",&dwTargetProcessID)==FALSE)
{
return ;
}
hTargetProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE,dwTargetProcessID);
if (hTargetProcess==NULL)
{
return ;
}
HMODULE hModule = NULL;
DWORD cbNeeded = ; WCHAR wzProcessFullPath[MAX_PATH] = {};
//进程文件的绝对路径
EnumProcessModules(hTargetProcess, &hModule, sizeof(hModule),&cbNeeded); cout<<GetLastError()<<endl;
//得到自身的完整名称 /* DWORD GetModuleFileNameEx(
HANDLE hProcess,
HMODULE hModule,
LPTSTR lpFilename,
DWORD nSize
); */
DWORD dwReturn = GetModuleFileNameEx(hTargetProcess, hModule,
wzProcessFullPath,
MAX_PATH); CloseHandle(hTargetProcess); WCHAR wzHookIATFullPath[MAX_PATH] = {}; GetCurrentDirectory(MAX_PATH,wzHookIATFullPath); WCHAR* v1 = wzHookIATFullPath+wcslen(wzHookIATFullPath); int i = ;
while (v1--)
{
if (*v1==L'\\')
{
i++;
if (i==) // 注意 调试和编译生成的文件位置不同 调试状态下 i == 2;
{
break;
} }
} *v1 = '\0'; //文件映射
if (IsX64PEFile(wzProcessFullPath)==TRUE)
{
//cout<<"X64 文件"<<endl; wcscat(wzHookIATFullPath,L"\\x64\\HookIAT(Ring3 x64).exe"); }
else
{ wcscat(wzHookIATFullPath,L"\\x86\\HookIAT(Ring3 x86).exe");
} STARTUPINFO si = {};
si.cb = sizeof(STARTUPINFO);
PROCESS_INFORMATION pi = {}; BOOL bOk = CreateProcess(wzHookIATFullPath,NULL,NULL,NULL,FALSE,,NULL,NULL,&si,&pi); WaitForSingleObject(pi.hProcess,INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread); return ;
} BOOL IsX64PEFile(WCHAR* wzProcessFullPath)
{
HANDLE hFile = CreateFile(wzProcessFullPath,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
PIMAGE_DOS_HEADER DosHeader = NULL;
PIMAGE_NT_HEADERS NtHeader = NULL;
cout<<GetLastError()<<endl;
if (hFile==INVALID_HANDLE_VALUE)
{
return FALSE;
} char szBuffer[0x1000] = {}; DWORD dwReturn = ;
if (ReadFile(hFile,szBuffer,0x1000,&dwReturn,NULL)==FALSE)
{
CloseHandle(hFile);
return FALSE;
} else
{
CloseHandle(hFile);
DosHeader=(PIMAGE_DOS_HEADER)szBuffer; NtHeader=(PIMAGE_NT_HEADERS)((ULONG64)szBuffer+DosHeader->e_lfanew); if(NtHeader->OptionalHeader.Magic!=0x20b)
{ return FALSE;
} return TRUE;
} } BOOL GetProcessIDByProcessImageName(WCHAR* wzProcessImageName,DWORD* dwTargetProcessID)
{
ULONG_PTR i = ;
BOOL bOk = FALSE;
HANDLE hProcessTool = NULL; PROCESSENTRY32 pe32 = {};
pe32.dwSize = sizeof(PROCESSENTRY32); hProcessTool = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,); if (hProcessTool==INVALID_HANDLE_VALUE)
{
return FALSE;
} bOk = Process32First(hProcessTool,&pe32);
do
{ if (bOk)
{
if(wcsicmp(pe32.szExeFile,wzProcessImageName)==)
{
*dwTargetProcessID = pe32.th32ProcessID;
return TRUE;
}
} else
{
break;
} bOk = Process32Next(hProcessTool,&pe32); } while (); return FALSE;
} BOOL EnableDebugPrivilege() //Debug
{ HANDLE hToken = NULL;
TOKEN_PRIVILEGES TokenPrivilege;
LUID uID; //打开权限令牌
if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken))
{
return FALSE;
} if (!LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&uID))
{ CloseHandle(hToken);
hToken = NULL;
return FALSE;
} TokenPrivilege.PrivilegeCount = ;
TokenPrivilege.Privileges[].Attributes = SE_PRIVILEGE_ENABLED;
TokenPrivilege.Privileges[].Luid = uID; //在这里我们进行调整权限
if (!AdjustTokenPrivileges(hToken,false,&TokenPrivilege,sizeof(TOKEN_PRIVILEGES),NULL,NULL))
{
CloseHandle(hToken);
hToken = NULL;
return FALSE;
} CloseHandle(hToken);
return TRUE; }
小小的代码
HookIAT的启动程序的更多相关文章
- Linux非root用户如何使用80端口启动程序
默认情况下Linux的1024以下端口是只有root用户才有权限占用,我们的tomcat,apache,nginx等等程序如果想要用普通用户来占用80端口的话就会抛出java.net.BindExce ...
- linux下普通用户如何使用80端口启动程序
linux下普通用户如何使用80端口启动程序 http://blog.csdn.net/shootyou/article/details/6750230 大家都知道默认情况下linux的1024以下端 ...
- 在执行Java命令或eclipse启动程序,提示报错’jvm.cfg无法找到’的解决办法
一.问题背景 昨天debug代码的时候,突然发现无法启动程序了.每次启动程序的时候均报如下错误:(回家以后重现了下这个问题.发现不同电脑,所在的lib下的文件夹不一样,应该和jdk安装时硬件的情况有关 ...
- linux开机启动程序
一./etc/rc.local这是一个最简单的方法,编辑“/etc/rc.local”,把启动程序的shell命令输入进去即可(要输入命令的全路径),类似于windows下的“启动”. 使用命令 vi ...
- 菜鸟学Linux命令:nohup命令启动程序
在UNIX/LINUX中,普通进程用&符号放到后台运行,如果启动该程序的控制台logout,则该进程随即终止. 要实现守护进程,一种方法是按守护进程的规则去编程,比较麻烦:另一种方法是仍然用普 ...
- Android中使用am命令实现在命令行启动程序详解
在Android中,除了从界面上启动程序之外,还可以从命令行启动程序,使用的是命令行工具am. 复制代码代码如下: usage: am [subcommand] [options] start an ...
- Linux开机启动程序详解
Linux开机启动程序详解我们假设大家已经熟悉其它操作系统的引导过程,了解硬件的自检引导步骤,就只从Linux操作系统的引导加载程序(对个人电脑而言通常是LILO)开始,介绍Linux开机引导的步骤. ...
- Linux开机启动程序详解[转]
Linux开机启动程序详解 我们假设大家已经熟悉其它操作系统的引导过程,了解硬件的自检引导步骤,就只从Linux操作系统的引导加载程序(对个人电脑而言通常是LILO)开始,介绍Linux开机引导的步骤 ...
- linux系统设置服务开机启动3种方法,Linux开机启动程序详解
linux系统设置服务开机启动 方法1:.利用ntsysv伪图形进行设置,利用root登陆 终端命令下输入ntsysv 回车:如下图 方法2:利用命令行chkconfig命令进行设置 简要说明 ...
随机推荐
- Android_使用 OpenVPN
1. 需要 root http://www.doc88.com/p-847633362717.html http://bbs.gfan.com/android-3679297-1-1.html 需要 ...
- poj3304Segments(直线与多条线段相交)
链接 枚举两点(端点),循环遍历与直线相交的线段. #include <iostream> #include<cstdio> #include<cstring> # ...
- go分页
简单的beego分页功能代码 一个简单的beego分页小插件(源代码在最下面): 支持条件查询 支持参数保留 支持自定义css样式 支持表/视图 支持参数自定义 默认为pno 支持定义生成链接的个数 ...
- [精品推荐]Android Studio插件整理
GOOD 现在Android的开发者基本上都使用Android Studio进行开发(如果你还在使用eclipse那也行,毕竟你乐意怎么样都行).使用好Android Studio插件能大量的减少我们 ...
- OpenGL的gluLookAt和glOrtho的关系
OpenGL的gluLookAt和glOrtho的关系 一直不明白gluLookAt()和glOrtho()两者之间的关系:gluLookAt()是观察变换,glOrtho()是正交投影.glLook ...
- Kafka消息保证不丢失和重复消费问题
使用同步模式的时候,有3种状态保证消息被安全生产,在配置为1(只保证写入leader成功)的话,如果刚好leader partition挂了,数据就会丢失.还有一种情况可能会丢失消息,就是使用异步模式 ...
- OA系统部门结构树
public class DepartmentUtils { /** * @param topList 顶级部门列表 * @param removeId 删除部门的id * @return */ pu ...
- java 导入包
导入包 问题:类名冲突时,要如何解决. 解决:sun提供导入包语句让我们解决该问题. 导入包语句的作用:简化书写. 导入包语句的格式:import 包名.类名;(导入xxx包的XX类) 导入包语句的细 ...
- Event 讲解
应用场景:某件事发生时,需要采取多步的动作,此时就用到了 使用方法:创建event方法一,使用命令 make:event 生成事件在app/Events目录下,命令make:listener 生成监 ...
- Apache Commons fileUpload实现文件上传之一
需要两个jar包: commons-fileupload.jar Commons IO的jar包(本文使用commons-io-2.4.jar) 利用Servlet来实现文件上传. package ...