c语言用time(0)获取当前时间_什么叫c语言的劫持原理,有什么用 你知道吗?

说在前面:小伙伴们在学习的过程中难免会遇到很多的困难,有的是初学不知道如何入手,亦或是想要继续提升自己,小编为了帮助大家解决学习问题,大家可以点击上方我的头像私信我发送:“学 习”两个字,我将会针对性的帮助解答你学习上的问题和发送你学习资料哦,大家一起进步

0f18c776b9a4865db104ff878b60743c.png

c语言

1. 劫持原理介绍

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

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

2. 使用的工具

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

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

d6d76fbf0e2e1c4c08832777cd2ca29e.png

c语言

96cca8c5fd236e9cf01cfd051efcd368.png

c语言

3. 使用的技术与原理

(1) 函数名和函数实体

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

例如:

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

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

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

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

1> 设置断点

e29b5232fa78ef7fa411852ff4b8840a.png

c语言

2>运行

dc1fa7bac01a128e6d2c50f3320b09ab.png

c语言

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

c5b21c0ae1b0004ce75c96efcf0febce.png

c语言

4> 打开反汇编调试窗口

a0870d927a7cb5ba83545f5e2ecdf7ef.png

c语言

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

59fff571eb70cb8dc70bebe64205ed23.png

c语言

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

596d00b93c1dedb08c5a01f1f9bb51bd.png

c语言

_show:

002B128Fjmpshow(02B3C90h)

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

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

7aa2b4a1e2c2f2306d7f2f0aa51dedfa.png

c语言

bee74791a41709e468cdc50de1ca882e.png

c语言

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

(2) 劫持原理

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

e0f6b0b8564395f9856242dc05833f1c.png

c语言

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

abe21b6a638964f30dd80050140388dd.png

c语言

ca8a76d8da306bfb48ad73b510ef5926.png

c语言

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

(3) 函数指针

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

基本格式:

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

p();

 1 #include 2 #include 3 #include 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 2 #include 3 #include 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=%pgo=%p&p=%p",show,p,&p);14 while (1)15 {16 p();17 Sleep(1000);18 }19 return 0;20 }

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

1> 右击项目,选择属性

3bf6670d6f2f699f64f550d1e0304a83.png

c语言

2> 跟着箭头走

c4a8cf956817f5498dc6cd415544bb40.png

c语言

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

fe910460be25bd2aaee67ee5ab3c8afb.png

(6) 劫持原理实现

1> 打开生成的exe文件

1765c5c8cee0b2ac1f4683b9973d1bd8.png

c语言

2> dll文件编写

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

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

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

重新生成解决方案

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

b09ae62c76716ac5e17ad18d54d7b1f9.png

c语言

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

5fdda30639e17a3ab07d3ee815ddc122.png

c语言

4c7ed0a38d24175d4d6700b9db03fc0e.png

c语言

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

5966fa03a8cb7a091a556542cc6c0e57.png

c语言

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值