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命令进行设置 简要说明 ...
随机推荐
- iOS - Xib
前言 xib 文件可以被 Xcode 编译成 nib 文件,xib 文件本质上是一个 xml 文件,而 nib 文件就是编译后的二进制文件,该文件将视图等控件对象封装了起来,而在程序运行起来后,这些对 ...
- 基于Linux的oracle数据库管理 part6 (backup 相关的脚本)
这里只是简单的介绍几种 备份方法 备份: 逻辑备份, 冷备份, 热备份 逻辑备份 也称作 导入(import), 导出(export), 作用是在不同的oracle数据库之间转移数据 物理备份, 就是 ...
- mysql 理解 int(11)
1.这里的int(11) 与int的大小和存储字节,没有一毛钱关系,int的存储字节是4个字节,最大值为 65536*65536 = 40多亿,对于有符号的int,是20多亿.2.那么这里的(11) ...
- Python学习笔记2—内置函数
函数的使用 官方文档:https://docs.python.org/2/library/functions.html
- linux之od命令
od [OPTION]... [FILE]... 把文件用8进制或者其他的格式显示出来.通常用于查看特殊格式文件的内容. 这个命令默认把文件的内容用八进制的形式清晰地写在标准输出上.如果是多个文件 ...
- (十一)C语言中内存堆和栈的区别
在计算机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到.但对于很多的初学着来说,堆栈是一个很模糊的概念. 堆栈:一种数据结构.一个在程序运行时用于存放的地方,这可能是很多初学者的认 ...
- a链接onclick="window.location.href=在ie6上面无法执行解决
<a href="javascript:void(0)" onclick="window.location.href=document.getElementById ...
- Android 异步加载图片,使用LruCache和SD卡或手机缓存,效果非常的流畅
Android 高手进阶(21) 版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请注明出处http://blog.csdn.net/xiaanming/article/details ...
- OpenGL的几何变换[转]
OpenGL的几何变换 1.实验目的: 理解掌握一个OpenGL程序平移.旋转.缩放变换的方法. 2.实验内容: (1)阅读实验原理,运行示范实验代码,掌握OpenGL程序平移.旋转.缩放变换的方法: ...
- 激活MyEclipse 6.5方法-通过一段Java程序生成激活码
在MyEclipse中新建一个Java类,名为MyEclipseKeyGen,将下面的Java代码拷贝到MyEclipseKeyGen类中,先修改变量subscriber的值,然后运行程序即可获得Su ...