// 启动程序.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. org.apache.jasper.JasperException: Expecting "jsp:param" standard action with "name" and "value" attributes

      jasper  英 ['dʒæspə]  美 ['dʒæspɚ] 跟读 口语练习 n. 碧玉:墨绿色 n. (Jasper)人名:(德)雅斯佩尔:(西)哈斯佩尔 JasperException 异 ...

  2. mysql 查询开销 sending data

    1.执行一个查询,发现时间开销都在sending data,为什么?2.sending data容易误导,让人以为只是发送数据给客户端,实际上sending data包含两个过程:读取数据并处理,发送 ...

  3. 通过注解(annotation)配置Bean

    Spring能够在classpath下自动扫描,侦测和实例化具有特定注解的组件,这在Spring中成为组件扫描(Component scanning). 特定组件的注解包括: @Component:基 ...

  4. Android 新手引导

    关于这个Demo的写法很多 我也献上一段 效果图如下 上代码 MainActivity public class MainActivity extends Activity { // public L ...

  5. JAVA学习提高之----安装多个JDK版本的问题

    我的机器上最开始安装的是jdk1.6,后来因为工作需要又安装了jdk1.4.但是,环境变量我并未更改,还是指向jdk1.6的路径的.可是,在cmd窗口输入 Java -version 却得到是1.4. ...

  6. 批处理+VBS+注册表实现开机自动启动EXE程序

    批处理+VBS+注册表实现WINDOWS开机自动启动EXE程序 以下都是基于WINDOWS系统. 我们都知道当我们有想某个程序在开机时自动运行,只能有三个方式: 1.做成服务,然后对服务进行配置为自动 ...

  7. shell脚本中获取本机ip地址的方法

    ipaddr='172.0.0.1' ipaddr=$(ip addr | awk '/^[0-9]+: / {}; /inet.*global/ {print gensub(/(.*)\/(.*)/ ...

  8. stdlib标准库的常用API

    iOS 有如下四种随机数方法,下面以产生 [0,100) 的随机数为例: 1. srand((unsigned)time(0));  //不加这句每次产生的随机数不变 int i = rand() % ...

  9. hiho_1290_demo_day

    题目大意 一个MxN的矩阵,矩阵中的有些方格中有障碍物,有些没有,有一个机器人从左上角出发,它只能有两种移动方式:一直向右移动,直到遇到障碍物:一直向下移动,直到遇到障碍物.     现在可以将矩阵中 ...

  10. python语法笔记(五)

    1.python内存管理 (1)对象内存使用 &nsbp;&nsbp;&nsbp;&nsbp;在python中通过执行内建函数 id(obj) 可以获得对象obj在内存 ...