1. 劫持原理介绍

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

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

2. 使用的工具

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

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

3. 使用的技术与原理

  (1) 函数名和函数实体

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

例如:

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

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

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<Windows.h>
  4. void show() {
  5. MessageBoxA(NULL, "我是文本", "我是标题", );
  6. }
  7.  
  8. void go() {
  9. printf("%s\n", "create process failed");
  10. }
  11. int main() {
  12. void (*p)() = go;
  13. printf("show=%p\tgo=%p\t&p=%p\n",show,p,&p);
  14. while ()
  15. {
  16. p();
  17. Sleep();
  18. }
  19. return ;
  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控制台不再打印,然后弹出了对话框)

c语言-----劫持原理的更多相关文章

  1. c语言-----劫持自己02

    在上一节 c语言-----劫持原理01 已经叙述了劫持原理,下边正式进入劫持实战 1. 需要实现的功能 在c语言中 system("notepad") 可以打开一个记事本 syst ...

  2. Atitit.提升语言可读性原理与实践

    Atitit.提升语言可读性原理与实践 表1-1  语言评价标准和影响它们的语言特性1 1.3.1.2  正交性2 1.3.2.2  对抽象的支持3 1.3.2.3  表达性3 .6  语言设计中的权 ...

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

    1. 回顾 在前2节我们已经实现了劫持原理.函数指针等一些概念,下面进行系统劫持 2. 工具 vs2017 Detours 3. windows如何创建一个进程? (1)创建进程函数 CreatePr ...

  4. 【转】IE劫持原理 BHO

    为什么"浏览器劫持"能够如此猖狂呢?放眼众多论坛的求助贴,我们不时可以看到诸如"我的IE被主页被改了,我用杀毒工具扫了一遍都没发现病毒,我把主页改回自己的地址,可是一重启 ...

  5. DNS与DNS劫持原理、IP、域名、服务器访问浅讲

    我们都知道,平常我们所访问的网站,都是与服务器进行数据交互的.但是,浏览器和服务器是分处于不同的计算机上的,那他们是怎样进行通信的呢?今天,我们就来粗浅地聊一聊.不涉及很深的技术原理,只讲大概的流程. ...

  6. (转)IE劫持原理 BHO

    为什么“浏览器劫持”能够如此猖狂呢?放眼众多论坛的求助贴,我们不时可以看到诸如“我的IE被主页被改了,我用杀毒工具扫了一遍都没发现病毒,我把主页改回自己的地址,可是一重启它又回来了!”.“我的系统一开 ...

  7. C#语言基础原理及优缺点

    一.原理: C#是专门为.net程序框架而创造的语言. .net框架有ms的.netFramework:Mono的.NetFramework(也是符合.net IL语言,CTS规范,CLS规范, CL ...

  8. Java语言跨平台原理

    Java语言有一个很重要的原理叫:跨平台性. 在介绍Java语言的跨平台性之前首先要介绍一个很重要的概念:JVM: JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一 ...

  9. [零] Java 语言运行原理 JVM原理浅析 入门了解简介 Java语言组成部分 javap命令使用

    Java Virtual Machine  官方介绍 Java虚拟机规范官方文档 https://docs.oracle.com/javase/specs/index.html 其中以java8的为 ...

随机推荐

  1. 深度学习论文翻译解析(五):Siamese Neural Networks for One-shot Image Recognition

    论文标题:Siamese Neural Networks for One-shot Image Recognition 论文作者: Gregory Koch   Richard Zemel Rusla ...

  2. mybatis 插件的原理-责任链和动态代理的体现

    目录 1 拦截哪些方法 2 如何代理 3 代理对象 4 责任链设计模式 @ 如果没有自定义过拦截器, 可以看我前面的文章.如果不知道 JDK 动态代理怎么使用的, 可以看我这文章. 责任链设计模式理解 ...

  3. js初学总结

    基础 交换变量方式 //利用第三方变量进行交换 var num1 = 10; var num2 = 20; var temp; temp = num1; num1 = num2; num2 = tem ...

  4. Spring Data JPA 梳理 - 使用方法

    1.下载需要的包. 需要先 下载Spring Data JPA 的发布包(需要同时下载 Spring Data Commons 和 Spring Data JPA 两个发布包,Commons 是 Sp ...

  5. Spring 梳理-JdbcTemplate简介

    JdbcTemplate简介 Spring对数据库的操作在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中. JdbcTempla ...

  6. for for in 给已有的li绑定click事件生成新的li也有click事件

    想要给已有的li元素绑定一个click事件,点击生成新的li元素,并且新的li元素也要有click事件 //不能用for循环给每个li绑定click事件 因为这样的话 后面新生成的li就没有click ...

  7. 一个PHP文件搞定微信H5支付

     / 更新于 2018-07-02 / 8 条评论 过年期间也坚持要撸码啊接着给博客除草,在这个小除夕是情人节的一天,祝大家新年快乐,情人节能够顺利脱单~~~ 回归正题,这篇文章介绍一下微信H5支付, ...

  8. golang学习之路

    目录 go语言介绍 开发环境准备 go语言基础 Go语言常用标准库 数据库相关 前端相关 web开发 go语言介绍 为什么要学习go语言 开发环境准备 从零开始搭建Go语言开发环境 VS Code配置 ...

  9. js常用Matn函数的操练

    Math.PI console.log(Math.PI); 随机数以及向下取整 这是一个能实现从a-b之间随机打印一个整数 function rand_s(a, b) { var x = a + (b ...

  10. Java 学习笔记之 线程isAlive方法

    isAlive方法: 方法isAlive()功能是判断当前线程是否处于活动状态. 活动状态就是线程启动且尚未终止,比如正在运行或准备开始运行. public class IsAliveThread e ...