c语言编写劫持dll,c语言-----劫持原理

1. 劫持原理介绍

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

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

2. 使用的工具

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

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

a7606b12aaf344c75a6cd5ae0db7b62b.png

2b849003c02e17edc9e97588b6664805.png

3. 使用的技术与原理

(1) 函数名和函数实体

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

例如:

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

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

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

1 #include

2 #include

3 #include

4 voidshow(){5 MessageBoxA(NULL,"我是文本","我是标题",0);6 }7 intmain(){8 printf("%p\n\n",show);9 show();10 return 0;11 }

1> 设置断点

f940a4a5439f20f10c38d73844663fb4.png

2>运行

b4e39291178b92d25946369d89db9d9d.png

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

6d346532eef9a4c4d3b9248053ce01ba.png

4> 打开反汇编调试窗口

08c71f3f58a3d0b4442c579b71efbc32.png

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

9f13556d61cc542844f572ac221863aa.png

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

61b3633b978fdf1f6ceb286990dfab33.png

_show:

002B128F  jmp  show(02B3C90h)

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

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

352363f9790dfe8a52dbd08f57b2d175.png

628e0f4659edcb925dcce0ce0fdc3ae9.png

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

(2) 劫持原理

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

15f18f919a947dca6a73fbba4160c819.png

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

adef2194695dd4652f8e0cca6117caff.png

5c57cacbad6572f4e170f004a70a8903.png

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

(3) 函数指针

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

基本格式:

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

p();

1 #include

2 #include

3 #include

4 voidshow(){5 MessageBoxA(NULL,"我是文本","我是标题",0);6 }7

8 voidgo(){9 printf("%s","create process failed");10 }11 intmain(){12 /*printf("%p\n\n",show);13 show();*/

14

15 void (*p)() =show;16 p();//函数指针可以存储不同函数的地址,执行不同的代码块

17 p =go;18 p();19 return 0;20 }

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

1 #include

2 #include

3 #include

4 voidshow() {5 MessageBoxA(NULL, "我是文本", "我是标题", 0);6 }7

8 voidgo() {9 printf("%s\n", "create process failed");10 }11 intmain() {12 void (*p)() =go;13 printf("show=%p\tgo=%p\t&p=%p\n",show,p,&p);14 while (1)15 {16 p();17 Sleep(1000);18 }19 return 0;20 }

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

1> 右击项目,选择属性

4985da4377b6638c9e68d3ee034fa98a.png

2> 跟着箭头走

258cb4c5e2866a26c44d0b5e325ec9fb.png

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

ed94ae542bd3275a528c159dc32a8382.png

(6) 劫持原理实现

1> 打开生成的exe文件

19b8787ef1323ae01c86d2cc5e83225d.png

2> dll文件编写

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

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

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

重新生成解决方案

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

7fac8941ba012dd439a21ced6997106f.png

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

4f39015caca411d3cb9e3c395a1a6368.png

f7313862f4a62b3e01be874419ee13ab.png

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

104d64b016830f80af89b1838735e227.png

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值