c语言-----劫持系统03

摘要:
wchar_ tstr[100];用于指定输入的命令,例如notepadmspaint对应于第二个参数STARTUPINFOsi;保存工艺信息,即倒数第二个参数process_ INFORMATIONpi;进程标识符也是最后一个参数。其他参数是NULL完整程序代码#include #include #include intmain(){STARTUINFOsi={sizeof}//保存进程信息si.dwFlags=STARTF_ USESHOWWINDOW;//显示窗口si.wShowWindow=1//显示窗口PROCESS_INFORMATIONpi;//过程信息wchar_ tstr[100]=L“记事本”;CreateProcessW;return0;}原理解释了为什么wchar_t.不是char?

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<Windows.h>
#include<stdio.h>
#include<stdlib.h>
int main() {
    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;
void pnew(参数){
  ...  
}
void hook(){
    ...
}

 (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;//执行失败
    
}

 第三步:实现劫持

void hook()
{
    DetourRestoreAfterWith();//恢复状态
    DetourTransactionBegin();//开始
    DetourUpdateThread(GetCurrentThread());//刷新当前线程
    DetourAttach((void**)&poldcreateprocess, NEWCreateProcessW);
    DetourTransactionCommit();//立刻生效
}

 第四步:编写dll函数

_declspec(dllexport)void go()
{

    hook();

}

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

完整源代码

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#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;//执行失败
}
void hook()
{
    DetourRestoreAfterWith();//恢复状态
    DetourTransactionBegin();//开始
    DetourUpdateThread(GetCurrentThread());//刷新当前线程
    DetourAttach((void**)&poldcreateprocess, NEWCreateProcessW);
    DetourTransactionCommit();//立刻生效
}
_declspec(dllexport)void go()
{
    hook();
}

4. dll注入

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

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

c语言-----劫持系统03第1张

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

免责声明:文章转载自《c语言-----劫持系统03》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇数据分析--降维--LDA和PCAflask logger下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C语言的面向对象设计 —— 对 X264/FFMPEG 架构探讨

类似题目的文章已经不新鲜了,这里,我仅仅总结自己的一些代码经验,结合两款在视频开发领域比较常用的开源软件探讨C语言的应用问题。 1.为什么要用C语言 曾几何时,我也不熟悉C,最早接触C的是在大学四年级,当时已经学过pascal,过二级也是pascal。接着走上了Delphi的路,多方便的软件,写写画画,程序就出来了,本科的毕业设计就是这样出来的MIS,在当...

浙大版《C语言程序设计(第3版)》题目集 练习2-12 输出华氏-摄氏温度转换表 (15 分)

练习2-12 输出华氏-摄氏温度转换表 (15 分) 输入2个正整数lower和upper(lower≤upper≤100),请输出一张取值范围为[lower,upper]、且每次增加2华氏度的华氏-摄氏温度转换表。 温度转换的计算公式:C=5×(F−32)/9,其中:C表示摄氏温度,F表示华氏温度。 输入格式: 在一行中输入2个整数,分别表示lower...

C语言操作mysql

php中 mysqli, pdo 可以用 mysqlnd 或 libmysqlclient 实现 前者 从 php 5.3.0起已内置到php中, 并且支持更多的特性,推荐用 mysqlnd mysqlnd , libmysqlclient 对比:http://php.net/manual/en/mysqlinfo.library.choosing.ph...

自己用C语言写单片机PIC18 serial bootloader

了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序)。 HyperBootloader_PIC18_J 和 HyperBootloader_PIC18_None_J 完成PIC16 bootloader (详细情况请阅读我的上一篇随笔《...

中国石油大学(华东)计算机复试C语言参考题库

目录 复试c语言 【研究创新型】8.1 谁能出线 【设计型】8.2 统计素数的个数 【设计型】8.3 数组逆序输出 【设计型】8.4 在屏幕上显示杨辉三角形 【设计型】8.5 求最大值 【设计型】8.6 二维数组 【设计型】8.11 存储并输出一个矩阵 【设计型】8.7 给数组中的元素按顺序编号 【设计型】8.8 求各位数字组成的最大数 【设计型】8...

Visual Studio 2019使用C语言进行websocket编程

一直在写C#代码好多年不写C语言代码了,记录一下之前某个项目里用C写的一个websocket服务,用C的优势是写的东西体积小性能高,但是写业务的话还得用C#、Java之类的语言,不然会折腾死人。。。 用Visual Studio新建一个C++(因为不能直接建C语言项目)项目,我演示就创建一个控制台项目。项目创建完后首先要添加socket编程需要的依赖库ws...