c语言编写劫持dll,c语言-----劫持系统03

本文详细介绍了如何在Windows系统中使用Detours库实现进程劫持,包括创建进程的基本步骤、宽字符的应用以及劫持system()函数替换为CreateProcessW的过程。通过实际代码演示,读者将掌握DLL注入和劫持系统调用的关键技术。
摘要由CSDN通过智能技术生成

1. 回顾

在前2节我们已经实现了劫持原理、函数指针等一些概念,下面进行系统劫持

2. 工具

vs2017

Detours

3. windows如何创建一个进程?

(1)创建进程函数

CreateProcessW(

LPCWSTR lpApplicationName,//执行程序名称

LPWSTR lpCommandLine, //命令行

LPSECURITY_ATTRIBUTES lpProcessAttributes, //进程安装

LPSECURITY_ATTRIBUTES lpThreadAttributes, //进程主线程安装

BOOL bInheritHandles, //附加参数

DWORD dwCreationFlags, //创建参数

LPVOID lpEnvironment, //环境变量指针

LPCWSTR lpCurrentDirectory, //进程当前路径

LPSTARTUPINFOW lpStartupInfo, //进程启动的附加信息

LPPROCESS_INFORMATION lpProcessInformation //进程标识符

);

(2) 我们需要用到哪些参数?

wchar_t str[100]; 用来指定输入的命令比如notepad mspaint...     对应第二个参数

STARTUPINFO si; 保存进程信息                                 也就是倒数第二个参数

PROCESS_INFORMATION pi; 进程标识符                 也就是最后一个参数

其他都是NULL

(3) 完整程序代码

#include#include#include

intmain() {

STARTUPINFO si= { sizeof(si) }; //保存进程信息

si.dwFlags = STARTF_USESHOWWINDOW;//显示窗口

si.wShowWindow = 1;//显示窗口

PROCESS_INFORMATION pi; //进程信息

wchar_t str[100] = L"notepad";

CreateProcessW(NULL, str, NULL, NULL,0, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);return 0;

}

(4) 原理解释

为什么是wchar_t,不是char?

汉语占两个字节,英语占一个字节,windows系统为了兼容函数,创建了宽字符wchar_t可以直接输入汉语,而不会出现乱码

4. 系统进程劫持

(1) 上次劫持原理回顾

void (*pold)(参数) =system;voidpnew(参数){

...

}voidhook(){

...

}

(2) 这次函数由system()改为CreateProcess

第一步:创建函数指针

BOOL(WINAPI *poldcreateprocess)(

LPCWSTR lpApplicationName,

LPWSTR lpCommandLine,

LPSECURITY_ATTRIBUTES lpProcessAttributes,

LPSECURITY_ATTRIBUTES lpThreadAttributes,

BOOL bInheritHandles,

DWORD dwCreationFlags,

LPVOID lpEnvironment,

LPCWSTR lpCurrentDirectory,

LPSTARTUPINFOW lpStartupInfo,

LPPROCESS_INFORMATION lpProcessInformation

)= CreateProcessW;//在中国使用宽字符更精准

第二步:创建新函数

BOOL NEWCreateProcessW(

LPCWSTR lpApplicationName,

LPWSTR lpCommandLine,

LPSECURITY_ATTRIBUTES lpProcessAttributes,

LPSECURITY_ATTRIBUTES lpThreadAttributes,

BOOL bInheritHandles,

DWORD dwCreationFlags,

LPVOID lpEnvironment,

LPCWSTR lpCurrentDirectory,

LPSTARTUPINFOW lpStartupInfo,

LPPROCESS_INFORMATION lpProcessInformation

)

{

MessageBoxA(0, "劫持系统", "点有用吗???", 0);return 0;//执行失败

}

第三步:实现劫持

voidhook()

{

DetourRestoreAfterWith();//恢复状态

DetourTransactionBegin();//开始

DetourUpdateThread(GetCurrentThread());//刷新当前线程

DetourAttach((void**)&poldcreateprocess, NEWCreateProcessW);

DetourTransactionCommit();//立刻生效

}

第四步:编写dll函数

_declspec(dllexport)voidgo()

{

hook();

}

第五步:改Debug模式 -> Rease模式  -> 生成解决方案

完整源代码

#include #include#include#include"detours.h"

#pragma comment(lib,"detours.lib")BOOL(WINAPI*poldcreateprocess)(

LPCWSTR lpApplicationName,

LPWSTR lpCommandLine,

LPSECURITY_ATTRIBUTES lpProcessAttributes,

LPSECURITY_ATTRIBUTES lpThreadAttributes,

BOOL bInheritHandles,

DWORD dwCreationFlags,

LPVOID lpEnvironment,

LPCWSTR lpCurrentDirectory,

LPSTARTUPINFOW lpStartupInfo,

LPPROCESS_INFORMATION lpProcessInformation

)= CreateProcessW;//宽字符的创建进程

BOOL NEWCreateProcessW(

LPCWSTR lpApplicationName,

LPWSTR lpCommandLine,

LPSECURITY_ATTRIBUTES lpProcessAttributes,

LPSECURITY_ATTRIBUTES lpThreadAttributes,

BOOL bInheritHandles,

DWORD dwCreationFlags,

LPVOID lpEnvironment,

LPCWSTR lpCurrentDirectory,

LPSTARTUPINFOW lpStartupInfo,

LPPROCESS_INFORMATION lpProcessInformation

)

{

MessageBoxA(0, "劫持系统", "点有用吗???", 0);return 0;//执行失败

}voidhook()

{

DetourRestoreAfterWith();//恢复状态

DetourTransactionBegin();//开始

DetourUpdateThread(GetCurrentThread());//刷新当前线程

DetourAttach((void**)&poldcreateprocess, NEWCreateProcessW);

DetourTransactionCommit();//立刻生效

}_declspec(dllexport)voidgo()

{

hook();

}

4. dll注入

打开dll注入工具,登陆qq后刷新dll注入工具选择qq

找到编写的dll,输入编写的函数go() 点击注入,在qq上打开qq空间

b4d421b4e15c5e9c4a8e0eb40aa99d1f.png

如果有explorer.exe的选择explore.exe 注入后任何进程打开失败

原文:https://www.cnblogs.com/mofei1999/p/11768785.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值