HOOK64 32转换

// Injection64bit.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <windows.h>
#include <Strsafe.h>

BOOL InjectDll(TCHAR szPath[MAX_PATH], DWORD dwPid);
int _tmain(int argc, _TCHAR* argv[])
{
    if (argc < 3) exit(0);
    // 第2个命令行参数为DLL路径,
    // 第3个命令行参数为要注入的程序PID
    DWORD dwPid = _wtoi(argv[2]);
    InjectDll(argv[1], dwPid);
    return 0;
}

BOOL InjectDll(TCHAR szPath[MAX_PATH], DWORD dwPid)
{
    // szPath:DLL路径
    // dwPid: 要注入的进程PID
    //1.打开要注入DLL的进程
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);
    if (!hProcess)
    {
        MessageBox(NULL, L"打开进程失败!", NULL, MB_OK);
        return FALSE;
    }
    //2.将Dll路径写进远进程内存
    //2.1.计算注入的DLL路径所占空间
    DWORD dwLength = 0;
    HRESULT hret = NULL;
    hret = StringCchLength(szPath, MAX_PATH, (size_t*)&dwLength);
    if (STRSAFE_E_INVALID_PARAMETER == hret)
    {
        CloseHandle(hProcess);
        MessageBox(NULL, L"DLL路径错误!", NULL, MB_OK);
        return FALSE;
    }
    DWORD dwSize = (dwLength + 1)* sizeof(TCHAR);
    //2.2.在要注入的进程内开辟空间用于存放DLL路径
    LPVOID lpVirAddr = NULL;
    lpVirAddr = VirtualAllocEx(hProcess,//进程句柄
        NULL,            //申请的内存地址
        dwSize,            //申请的内存的大小
        MEM_COMMIT,        //申请的内存属性
        PAGE_READWRITE);//申请的内存分页类型
    if (NULL == lpVirAddr)
    {
        CloseHandle(hProcess);
        MessageBox(NULL, L"内存申请失败!", NULL, MB_OK);
        return FALSE;
    }
    //2.3将DLL路径写入申请的内存
    if (!WriteProcessMemory(
        hProcess,//进程句柄
        lpVirAddr,//要写入的内存地址
        szPath,//要写入的数据地址
        dwSize,//写入大小
        NULL))//返回成功写入的数据的大小
    {
        if (lpVirAddr) VirtualFreeEx(hProcess, (PVOID)lpVirAddr, 0, MEM_RELEASE);
        if (hProcess) CloseHandle(hProcess);
        MessageBox(NULL, L"写入内存失败!", NULL, MB_OK);
        return FALSE;
    }
    //3.获取Loadlibrary地址
    PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)GetProcAddress(
        GetModuleHandle(L"Kernel32"), "LoadLibraryW");
    if (!pfnThreadRtn)
    {
        if (lpVirAddr) VirtualFreeEx(hProcess, (PVOID)lpVirAddr, 0, MEM_RELEASE);
        if (hProcess) CloseHandle(hProcess);
        MessageBox(NULL, L"LoadLibraryW地址获取失败!", NULL, MB_OK);
        return FALSE;
    }
    //4.创建远线程加载DLL
    HANDLE hThread = CreateRemoteThread(
        hProcess, //进程句柄
        NULL, //安全类型
        0, //栈大小
        pfnThreadRtn, //线程回调函数地址
        (PVOID)lpVirAddr, //线程回调函数参数
        0, //创建标志,创建立刻执行
        NULL); //传出值,线程ID
    if (NULL == hThread)
    {
        if (lpVirAddr) VirtualFreeEx(hProcess, (PVOID)lpVirAddr, 0, MEM_RELEASE);
        if (hProcess) CloseHandle(hProcess);
        return FALSE;
    }
    //5.等待远线程结束
    WaitForSingleObject(hThread, INFINITE);
    //6.释放相关资源并关闭句柄
    if (lpVirAddr) VirtualFreeEx(hProcess, (PVOID)lpVirAddr, 0, MEM_RELEASE);
    if (hThread) CloseHandle(hThread);
    if (hProcess) CloseHandle(hProcess);
    return TRUE;
}
时间: 2024-10-05 23:27:24

HOOK64 32转换的相关文章

python3基础之整数常用的方法整理

希望对大家学习或者使用python3能具有一定的参考价值. __abs__     #返回一个数的绝对值 >>> num3=-22 >>> num3.__abs__() 22 __add__                                   #两数相加 __and__                                   #两数按位与操作 __bool__                                  #求一个数的布尔

我用JAVA做了个简易图像相似度计算器

简单说两句: 笔主利用这个七夕前后两天的寂寞时光,用JAVA磨了一个简单的图像相似度计算小程序,就在刚才终于纠结完毕,输出了1.0版本,小小的满足了一下可怜的虚荣心..→_→ 原理是使用最简单最基础的感知哈希算法,算法原理戳这里,绝对比笔主讲的要好: http://www.ruanyifeng.com/blog/2011/07/principle_of_similar_image_search.html UI设计图: 实际运行效果图: 关键算法: 1 // 全流程 2 public static

Velocity模版使用

引入的jar包: 1 import org.apache.velocity.Template; 2 import org.apache.velocity.VelocityContext; 3 import org.apache.velocity.app.Velocity; 4 import org.apache.velocity.app.VelocityEngine; 5 import org.apache.velocity.tools.generic.DateTool; 6 import or

struts2 异常处理3板斧

板斧1:找不到action的错误 在struts.xml中参考如下配置 1 <struts> 2 3 ... 4 <package name="default" namespace="/" extends="struts-default"> 5 6 ... 7 8 <default-action-ref name="index" /> 9 10 ... 11 12 <action na

带分数计算程序思路

思路一 1.  将带分数用正则表达式转换成整数+一个组合数的形式. 例如:   1+3*2^2/3-2 转换成  1+3*(2+2/3)-2 2.  直接把结果算出来 3.  将结果的小数部分转换成分数,也就是两个整数比的形式  例如 1.23423423  提取小数部分 0.23423423 后, 设计算法找出这2个整数. 4.  最简单的算法是双重循环, for(i=0;i<10000;i++)for(j=0;j<100000;j++) ..... 但是这样复杂度太高,  可以用每一次内循

System.Uri类 - 获取Url的各种属性,文件名,参数,域名,端口等等

System.Uri类用于处理Uri地址信息,常用到它的地方有,相对Uri地址转绝对Uri地址,获取Uri的某部分信息等等,可以说是一个非常有用的类. 一.属性 AbsolutePath 获取 URI 的绝对路径. AbsoluteUri   获取绝对 URI. Authority  获取服务器的域名系统 (DNS) 主机名或 IP 地址和端口号. DnsSafeHost 获得可安全用于 DNS 解析的未转义主机名. Fragment 获取转义 URI 片段. Host  获取此实例的主机部分.

Ubuntu系统常见问题整理(Part 1)

大约是在2008年的时候开始接触Ubuntu系统,一开始被它吸引是因为它各种神奇的桌面特效.然后一直使用到现在,现在将使用中遇到的各种小问题的解决办法整理出来.希望对刚接触但同样爱好Ubuntu的朋友们有所帮助. 1 密码恢复 2 QQ掉线 3 开机自动挂载硬盘分区 4 修改软件源 5 软件相关 6 防火墙 7 设置IP 8 远程桌面 9 没有声音 10 rhythmbox 乱码 11 flash中中文方块乱码 12 备份还原系统 13 ***多余内核文件 14 防止别人ping 15 PDF文

Ubuntu系统常见问题整理(Part 2)

23 ***文件名带空格的文件 把文件名中间的空格加双引号.例: rm  my"空格"file 进入或者执行文件名带空格文件的命令格式也一样 24 更改MAC地址 00:1a:73:d7:3b:e2 sudo ifconfig eth2 down sudo ifconfig eth2 hw ether XX:XX:XX:XX:XX:XX sudo ifconfig eth2 up 以上修改重启后会失效,若要永久修改,可直接编辑/etc/network/interfaces文件 pre-

半角转换为全角 判断是否是全角

#region 半角转换为全角 /// <summary> /// 半角转换为全角 ////转全角的函数(SBC case) ///任意字符串 ///全角空格为12288,半角空格为32 ///其他字符半角(33-126)与全角(65281-65374)的对应关系是:均相差65248 /// </summary> /// <param name="input"></param> /// <returns></return