c语言-----劫持原理
1. 劫持原理介绍
(1) 通过劫持技术我们可以实现某些进程的拦截,比如禁止创建文件,禁止打开qq,禁止关机等等一系列的操作
(2) 弹窗拦截就是最常见的一种劫持技术的实现。
2. 使用的工具
(1) vs2017 //编写c语言程序 可以用其他的版本 但是不建议2010及以下的 其他的IDE我没用过
(2) DllInject.exe //查看当前所有的进程并且可以进行DLL注入
3. 使用的技术与原理
(1) 函数名和函数实体
函数名的本质就是一个地址,但是函数名的地址和函数实体的地址不是同一个地址。
例如:
void show(){
MessageBoxA(NULL,"我是文本","我是标题",);
}
在show()函数中,show()的函数名是一个地址,show()函数中的代码 MessageBoxA(NULL,"我是文本","我是标题",0); 也就是函数实体也有一个地址。那么怎么证明呢?
在vs2017中使用反汇编进行调试:(源码如下)
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
void show(){
MessageBoxA(NULL,"我是文本","我是标题",);
}
int main(){
printf("%p\n\n",show);
show();
return ;
}
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,"我是文本","我是标题",);
} void go(){
printf("%s","create process failed");
}
int main(){
/*printf("%p\n\n",show);
show();*/ void (*p)() = show;
p();//函数指针可以存储不同函数的地址,执行不同的代码块
p = go;
p();
return ;
}
(4) 劫持原理实现---exe文件生成
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
void show() {
MessageBoxA(NULL, "我是文本", "我是标题", );
} void go() {
printf("%s\n", "create process failed");
}
int main() {
void (*p)() = go;
printf("show=%p\tgo=%p\t&p=%p\n",show,p,&p);
while ()
{
p();
Sleep();
}
return ;
}
(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控制台不再打印,然后弹出了对话框)
c语言-----劫持原理的更多相关文章
- c语言-----劫持自己02
在上一节 c语言-----劫持原理01 已经叙述了劫持原理,下边正式进入劫持实战 1. 需要实现的功能 在c语言中 system("notepad") 可以打开一个记事本 syst ...
- Atitit.提升语言可读性原理与实践
Atitit.提升语言可读性原理与实践 表1-1 语言评价标准和影响它们的语言特性1 1.3.1.2 正交性2 1.3.2.2 对抽象的支持3 1.3.2.3 表达性3 .6 语言设计中的权 ...
- c语言-----劫持系统03
1. 回顾 在前2节我们已经实现了劫持原理.函数指针等一些概念,下面进行系统劫持 2. 工具 vs2017 Detours 3. windows如何创建一个进程? (1)创建进程函数 CreatePr ...
- 【转】IE劫持原理 BHO
为什么"浏览器劫持"能够如此猖狂呢?放眼众多论坛的求助贴,我们不时可以看到诸如"我的IE被主页被改了,我用杀毒工具扫了一遍都没发现病毒,我把主页改回自己的地址,可是一重启 ...
- DNS与DNS劫持原理、IP、域名、服务器访问浅讲
我们都知道,平常我们所访问的网站,都是与服务器进行数据交互的.但是,浏览器和服务器是分处于不同的计算机上的,那他们是怎样进行通信的呢?今天,我们就来粗浅地聊一聊.不涉及很深的技术原理,只讲大概的流程. ...
- (转)IE劫持原理 BHO
为什么“浏览器劫持”能够如此猖狂呢?放眼众多论坛的求助贴,我们不时可以看到诸如“我的IE被主页被改了,我用杀毒工具扫了一遍都没发现病毒,我把主页改回自己的地址,可是一重启它又回来了!”.“我的系统一开 ...
- C#语言基础原理及优缺点
一.原理: C#是专门为.net程序框架而创造的语言. .net框架有ms的.netFramework:Mono的.NetFramework(也是符合.net IL语言,CTS规范,CLS规范, CL ...
- Java语言跨平台原理
Java语言有一个很重要的原理叫:跨平台性. 在介绍Java语言的跨平台性之前首先要介绍一个很重要的概念:JVM: JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一 ...
- [零] Java 语言运行原理 JVM原理浅析 入门了解简介 Java语言组成部分 javap命令使用
Java Virtual Machine 官方介绍 Java虚拟机规范官方文档 https://docs.oracle.com/javase/specs/index.html 其中以java8的为 ...
随机推荐
- java架构之路-(mysql底层原理)Mysql事务隔离与MVCC
上几篇博客我们大致讲了一下mysql的底层结构,什么B+tree,什么Hash需要回行啊,再就是讲了mysql优化的explain,这次我们来说说mysql的锁. mysql锁 锁从性能上分为乐观锁( ...
- 新手学习FFmpeg - 调用API完成视频的读取和输出
在写了几个avfilter之后,原本以为对ffmpeg应该算是入门了. 结果今天想对一个视频文件进行转码操作,才发现基本的视频读取,输出都搞不定. 痛定思痛,仔细研究了一下ffmpeg提供的examp ...
- MyEclipse 中无法直接使用BaseEncoder问题
首先 :点击项目---->build path--->configure Build Path 然后:java build path --->libraries--->JRE ...
- docker 运行容器时指定--sysctl参数来设置系统参数
指定--sysctl参数来设置系统参数,通过这些参数来调整系统性能,Docker通过一个 ValidateSysctl函数来限制 sysctl参数可以传入的项,源码如下: // docker/opts ...
- ThinkPHP5 支付宝 电脑与手机支付扩展库
ThinkPHP5 电脑与手机支付扩展库(2017年9月18日) 使用说明 在默认配置情况下,将文件夹拷贝到根目录即可, 其中extend目录为支付扩展目录, application\extra\al ...
- 在Android开发中,当按下home键程序会完全退出时,解决这个BUG:
把这段代码贴到 super.onCreate(savedInstanceState); 之后 //remenber process if(!this.isTaskRoot()) { //判断该Act ...
- springcloud -- sleuth+zipkin整合rabbitMQ详解
为什么使用RabbitMQ? 我们已经知道,zipkin的原理是服务之间的调用关系会通过HTTP方式上报到zipkin-server端,然后我们再通过zipkin-ui去调用查看追踪服务之间的调用链路 ...
- win10下使用Linux命令
下载Cygwin安装包 官网下载地址:https://cygwin.com/install.html 执行下载好的安装程序 选择默认安装路径C:\cygwin64即可,可在C:\cygwin64\bi ...
- 阿里云Centos操作Mysql
1. CentOS7 yum方式安装MySQL5.7 2.Centos下mysql导入sql 3.Centos设置远程 4.CentOS下mysql数据库常用命令总结 5.centos出现“Fire ...
- mysql 分页offset过大性能问题解决思路
在公司干活一般使用sqlserver数据库.rownumber分页贼好用. 但是晚上下班搞自己的事情就不用sqlserver了.原因就是自己的渣渣1核2g的小服务器完全扛不住sqlserver那么大的 ...