zoukankan      html  css  js  c++  java
  • c语言-----劫持原理01

    1. 劫持原理介绍

      (1) 通过劫持技术我们可以实现某些进程的拦截,比如禁止创建文件,禁止打开qq,禁止关机等等一系列的操作

      (2) 弹窗拦截就是最常见的一种劫持技术的实现。

    2. 使用的工具

      (1) vs2017   //编写c语言程序      可以用其他的版本 但是不建议2010及以下的 其他的IDE我没用过

      (2) DllInject.exe //查看当前所有的进程并且可以进行DLL注入

     

    3. 使用的技术与原理

      (1) 函数名和函数实体

        函数名的本质就是一个地址,但是函数名的地址和函数实体的地址不是同一个地址。

    例如:

    1 void show(){
    2     MessageBoxA(NULL,"我是文本","我是标题",0);
    3 }

        在show()函数中,show()的函数名是一个地址,show()函数中的代码 MessageBoxA(NULL,"我是文本","我是标题",0); 也就是函数实体也有一个地址。那么怎么证明呢?

        在vs2017中使用反汇编进行调试:(源码如下)

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #include<Windows.h>
     4 void show(){
     5     MessageBoxA(NULL,"我是文本","我是标题",0);
     6 }
     7 int main(){
     8     printf("%p
    
    ",show);
     9     show();
    10     return 0;
    11 }

     1> 设置断点

    2>运行

    3> 得到show()函数的地址(每次运行的结果不一样)

    4> 打开反汇编调试窗口

    5> 将show()的地址002B128F输入到箭头所指位置(并改为0x002B128 or 002B128F  这两个应该都可以,我用的第一个),并回车

     6> 现在已经跳转到show()函数的首地址处

         _show:

        002B128F  jmp  show(02B3C90h)   

        这句话说明,地址将要从002B128F 跳转到02B3C90h,这个02B3C90h就是函数实体的地址

    7> 查看函数实体--将show(02B3C90h)中的地址输入,并回车

     8> 结论:函数名和函数实体不是同一个地址

      (2) 劫持原理

        函数名和函数实体不是同一个地址,那么也就是这样:

         那么如果我们把函数实体的地址从02B3C90h改为0x0000,是不是执行的函数实体就不一样了呢?

           原理:修改函数实体的地址,即函数名不变(房子不变,把房子里边的人换了)

      (3) 函数指针

        既然函数名是一个地址,那么我们就可以通过指针的方式进行操作。

        基本格式:

          void (*p)() = 函数名;

          p();

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #include<Windows.h>
     4 void show(){
     5     MessageBoxA(NULL,"我是文本","我是标题",0);
     6 }
     7 
     8 void go(){
     9     printf("%s","create process failed");
    10 }
    11 int main(){
    12     /*printf("%p
    
    ",show);
    13     show();*/
    14 
    15     void (*p)() = show;
    16     p();//函数指针可以存储不同函数的地址,执行不同的代码块
    17     p = go;
    18     p();
    19     return 0;
    20 }

     (4) 劫持原理实现---exe文件生成

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #include<Windows.h>
     4 void show() {
     5     MessageBoxA(NULL, "我是文本", "我是标题", 0);
     6 }
     7 
     8 void go() {
     9     printf("%s
    ", "create process failed");
    10 }
    11 int main() {
    12     void (*p)() = go;
    13     printf("show=%p	go=%p	&p=%p
    ",show,p,&p);
    14     while (1)
    15     {
    16         p();
    17         Sleep(1000);
    18     }
    19     return 0;
    20 }

    (5) 劫持原理实现---dll文件生成(具体代码看下一步,这一步只是说如何生成dll)

    1> 右击项目,选择属性

     2> 跟着箭头走

     3> 跟着箭头走 先点击生成 -> 点击生成解决方案

     (6) 劫持原理实现

    1> 打开生成的exe文件

    2> dll文件编写

        首先我们需要找到指针p的地址,所以p是一个一级指针,需要一个二级指针获取地址

        其次当前exe运行的程序是go(),我要更改为show()函数

    1 _declspec(dllexport)void go(){
    2     void (**p)() = 0x008ffce8;
    3     *p= 0x001212a3;
    4 }

        重新生成解决方案

    3> 打开DllInject.exe 找到你刚刚打开的exe

     4> 点击注入 ->找到你生成的dll文件->点击确定->输入你编写的函数名

     5> 效果 (cmd控制台不再打印,然后弹出了对话框)

  • 相关阅读:
    支付宝支付
    七牛云存储介绍
    ubuntu开发机初始化
    Unity3D 正六边形,环状扩散,紧密分布,的程序
    Unity属性的封装、继承、方法隐藏
    DateTime.Now的一些用法
    [转] 增强现实 colAR Mix 浅析
    [转] Vuforia AR 中的阴影与浮现效果
    网址整理
    [转] 如何使用unity Vs来进行断点调试
  • 原文地址:https://www.cnblogs.com/mofei1999/p/11756417.html
Copyright © 2011-2022 走看看