c语言-----劫持原理
1. 劫持原理介绍
(1) 通过劫持技术我们可以实现某些进程的拦截,比如禁止创建文件,禁止打开qq,禁止关机等等一系列的操作
(2) 弹窗拦截就是最常见的一种劫持技术的实现。
2. 使用的工具
(1) vs2017 //编写c语言程序 可以用其他的版本 但是不建议2010及以下的 其他的IDE我没用过
(2) DllInject.exe //查看当前所有的进程并且可以进行DLL注入
3. 使用的技术与原理
(1) 函数名和函数实体
函数名的本质就是一个地址,但是函数名的地址和函数实体的地址不是同一个地址。
例如:
void show(){ MessageBoxA(NULL,"我是文本","我是标题",0); }
在show()函数中,show()的函数名是一个地址,show()函数中的代码 MessageBoxA(NULL,"我是文本","我是标题",0); 也就是函数实体也有一个地址。那么怎么证明呢?
在vs2017中使用反汇编进行调试:(源码如下)
#include<stdio.h> #include<stdlib.h> #include<Windows.h> void show(){ MessageBoxA(NULL,"我是文本","我是标题",0); } int main(){ printf("%p\n\n",show); show(); return 0; }
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();
#include<stdio.h> #include<stdlib.h> #include<Windows.h> void show(){ MessageBoxA(NULL,"我是文本","我是标题",0); } void go(){ printf("%s","create process failed"); } int main(){ /*printf("%p\n\n",show); show();*/ void (*p)() = show; p();//函数指针可以存储不同函数的地址,执行不同的代码块 p = go; p(); return 0; }
(4) 劫持原理实现---exe文件生成
#include<stdio.h> #include<stdlib.h> #include<Windows.h> void show() { MessageBoxA(NULL, "我是文本", "我是标题", 0); } void go() { printf("%s\n", "create process failed"); } int main() { void (*p)() = go; printf("show=%p\tgo=%p\t&p=%p\n",s 2191 how,p,&p); while (1) { p(); Sleep(1000); } return 0; }
(5) 劫持原理实现---dll文件生成(具体代码看下一步,这一步只是说如何生成dll)
1> 右击项目,选择属性
2> 跟着箭头走
3> 跟着箭头走 先点击生成 -> 点击生成解决方案
(6) 劫持原理实现
1> 打开生成的exe文件
2> dll文件编写
首先我们需要找到指针p的地址,所以p是一个一级指针,需要一个二级指针获取地址
其次当前exe运行的程序是go(),我要更改为show()函数
_declspec(dllexport)void go(){ void (**p)() = 0x008ffce8; *p= 0x001212a3; }
重新生成解决方案
3> 打开DllInject.exe 找到你刚刚打开的exe
4> 点击注入 ->找到你生成的dll文件->点击确定->输入你编写的函数名
5> 效果 (cmd控制台不再打印,然后弹出了对话框)
- 深入php内核,从底层c语言剖析php实现原理
- 计算机原理之c语言实现链表
- c语言==野指针形成原理、造成的危害及避免方法(22)
- 红黑数之原理分析及C语言实现
- JSON劫持漏洞攻防原理及演练
- 烦请哪位老大可以介绍一下C语言中的内存对齐的原理和实现?
- C语言的可变参数的实现的原理
- SSClone非ARP会话劫持原理分析
- CRC算法原理及C语言实现 可算找到了!
- 一步一步从原理跟我学邮件收取及发送 5.C语言的socket示例
- 编译原理的学习总结(默认编译c语言)
- 转载:C语言编译原理简介
- 说说劫持 Cookie 的原理
- HTTP会话劫持被劫持的原理分析(转)
- 堆排序原理及c语言实现
- 线程池原理并用C语言实现
- C语言的指针、链表的原理和各类操作
- 基于ARP的局域网IP劫持——C语言实现
- C语言调用硬件原理学习.......
- C语言封装成object-c的过程,实现原理