// 启动程序.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的启动程序的更多相关文章

  1. Linux非root用户如何使用80端口启动程序

    默认情况下Linux的1024以下端口是只有root用户才有权限占用,我们的tomcat,apache,nginx等等程序如果想要用普通用户来占用80端口的话就会抛出java.net.BindExce ...

  2. linux下普通用户如何使用80端口启动程序

    linux下普通用户如何使用80端口启动程序 http://blog.csdn.net/shootyou/article/details/6750230 大家都知道默认情况下linux的1024以下端 ...

  3. 在执行Java命令或eclipse启动程序,提示报错’jvm.cfg无法找到’的解决办法

    一.问题背景 昨天debug代码的时候,突然发现无法启动程序了.每次启动程序的时候均报如下错误:(回家以后重现了下这个问题.发现不同电脑,所在的lib下的文件夹不一样,应该和jdk安装时硬件的情况有关 ...

  4. linux开机启动程序

    一./etc/rc.local这是一个最简单的方法,编辑“/etc/rc.local”,把启动程序的shell命令输入进去即可(要输入命令的全路径),类似于windows下的“启动”. 使用命令 vi ...

  5. 菜鸟学Linux命令:nohup命令启动程序

    在UNIX/LINUX中,普通进程用&符号放到后台运行,如果启动该程序的控制台logout,则该进程随即终止. 要实现守护进程,一种方法是按守护进程的规则去编程,比较麻烦:另一种方法是仍然用普 ...

  6. Android中使用am命令实现在命令行启动程序详解

    在Android中,除了从界面上启动程序之外,还可以从命令行启动程序,使用的是命令行工具am. 复制代码代码如下: usage: am [subcommand] [options] start an ...

  7. Linux开机启动程序详解

    Linux开机启动程序详解我们假设大家已经熟悉其它操作系统的引导过程,了解硬件的自检引导步骤,就只从Linux操作系统的引导加载程序(对个人电脑而言通常是LILO)开始,介绍Linux开机引导的步骤. ...

  8. Linux开机启动程序详解[转]

    Linux开机启动程序详解 我们假设大家已经熟悉其它操作系统的引导过程,了解硬件的自检引导步骤,就只从Linux操作系统的引导加载程序(对个人电脑而言通常是LILO)开始,介绍Linux开机引导的步骤 ...

  9. linux系统设置服务开机启动3种方法,Linux开机启动程序详解

    linux系统设置服务开机启动 方法1:.利用ntsysv伪图形进行设置,利用root登陆 终端命令下输入ntsysv 回车:如下图     方法2:利用命令行chkconfig命令进行设置 简要说明 ...

随机推荐

  1. phpmailer发送邮件 SMTP Error: Could not authenticate 错误

    这个错误说明虚拟主机不支持PHPMailer默认调用的fsockopen函数,找到class.smtp.php文件,搜索fsockopen,就找到了这样一段代码: $this->smtp_con ...

  2. zend studio12.5破解方法

    其实,很简单,找到zend studio 安装目录,G:\zend studio\plugins,把文件com.zend.verifier_12.5.1.v20150514-2003.jar替换成压缩 ...

  3. gcc常用指令及相关知识

    1,gcc与g++的问题: 1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序:后缀为.cpp的,两者都会认为是c++程序. 2.编译阶段,g++会调用gcc,对于c++代码,两者是等 ...

  4. python下载地址

    https://www.python.org/downloads/release/python-351/

  5. 算法_栈与队列的Java链表实现

    链表是一个递归的数据结构,它或者为null,或者是指向一个结点的引用,该结点含有一个泛型的元素和指向另一个链表的引用.可以用一个内部类来定义节点的抽象数据类型: private class Node ...

  6. (四)ubuntu学习前传—uboot中对Flash和DDR的管理

    1.uboot阶段Flash的分区 (1)所谓分区,就是说对Flash进行分块管理.(2)PC机等产品中,因为大家都是在操作系统下使用硬盘的,整个硬盘由操作系统统一管理,操作系统会使用文件系统帮我们管 ...

  7. winScp 跳板机到服务器

    http://jingyan.baidu.com/article/454316ab6ffe1af7a7c03a31.html?qq-pf-to=pcqq.group

  8. Canu Quick Start(快速使用Canu)

    Canu Quick Start Canu Quick Start PBcR (老版的canu) CA Canu specializes in(专门从事) assembling PacBio or O ...

  9. 在XP下基于VHD版XP 2003 win7制作的RAMOS心得

    在XP下基于VHD版win7制作的RAMOS心得1.用DiskGenius创建1.85G的VHD固定磁盘文件,以win7prosen.vhd为例,然后进行分区格式化,格式化时启用NTFS压缩.2.为了 ...

  10. response.getWriter().write()与out.print()的区别

    1.首先介绍write()和print()方法的区别:  (1).write():仅支持输出字符类型数据,字符.字符数组.字符串等  (2).print():可以将各种类型(包括Object)的数据通 ...