免杀笔记 ---> C语言

这次的更新可能有点慢,因为这段时间也比较忙,加上C语言还得和汇编结合,导致小编一个知识点总是得反复揣摩(太菜了),所以免杀的更新篇幅长度可能会达到两个月和三个月,但是小编能保证,只要你能看懂这些笔记,那么我包你能过360的!!!

1.空函数的实现

我们在平时写c或者c++的代码的时候,不知道大家有没有想过,如果我们直接写这样的代码会怎么样?   难道编译器会啥都不干吗??? 

那当然不会的,我们一起来从汇编的角度来分析一下 (这里建议大家先生成×86的程序)

在进入函数之前,因为我们没有参数的传递,所以我们不用PUSH任何东西

然后我们就会将返回地址 00C713E3压入到堆栈里面,并且ESP加四。 过程如下

然后先是提栈操作

然后就是保留现场

然后就是填充缓冲区和实现函数的功能,但是由于我们是空函数,所以这两步骤就没有了

然后就是到了我们的还原现场的操作了

先把三个寄存器POP出去

然后就是快速降低堆栈(ESP的值)

然后直接POP了EBP的值(其实我这里说的不太准确,因为这里EBP的值是一块地址),而不是我们平时存的数值

然后POP完之后就变了这样(这一步两个寄存器都在改变

最后ret,将00C717E3的值给到EIP,并且压栈,函数返回(这里其实一开始说错了,call的时候压的是00C717E8,我当时看错了,以为是test函数下面的地址就是汇编返回下一行的地址,不过过程没有任何问题!!!堆栈刚好平衡

2.手搓一个裸函数

讲完了空函数,我们就要讲裸函数了,我们都是学计算机底层的,怎么可能想让编译器给我写代码,所以我们就想能不能自己在VS上手写一个裸函数,内容要我们自己实现!!!

  在写裸函数之前,我们还得先写上这样的代码

void __declspec(naked)test()
{__asm{}
}

有了上面的代码我们就可以自己写一个函数出来了,我们就以两数相加为例子把!! 对于一个裸函数,我们可以按照下面这几个步骤进行!!!

1.提栈

其实说这样提栈还不准确,应该说想Push了一些参数入栈,然后Call了才进入我们的函数

以下都是进函数之前的操作

然后才真正的到我们的提栈

2.保留现场

然后就是我们的保留现场了,依次压入我们的寄存器

3.填充缓冲区

聪明的你们一定发现了ESP和EBP之间还存在一大片空隙,那么我们现在就来填充缓冲区

但是在写缓冲区之前,我们还需要来看一条指令

这条指令的意思就是将EAX的寄存器的值循环写ECX次

所以我们的汇编就可以这么写

先把缓冲区起始位置mov给edi(虽然我不理解这一步的实际用处),然后就是将eax的值赋为0xcccccccc,ecx的值赋为0x10 ,然后直接循环填充缓冲区

4.实现函数功能

比如说我想实现 b = a + b   其中函数的传入为 (int a , int b )这两个参数位置不能调换(否则对应的指令也要换,这个后面讲)

5.还原现场

然后就是将对应寄存器POP出去

然后就是降低堆栈

并且同时改变两个寄存器!!!

最后就是RET,将返回地址给到EIP,跳回main函数

但是这时候聪明的你就会发现问题了,堆栈不平衡!!!!! 别急我们先运行一下

发现代码成功的跑了起来

我们去看反汇编,就能发现,原来是vs帮我们在自动的函数外面平栈

这步 add esp8就显得很精髓

所以我们的最终就达到了堆栈的平衡,成功手搓了一个裸函数,看,我们最简单的一个a+b的功能也是如此的多步骤呢,在汇编中

源代码如下

#include<stdio.h>void __declspec(naked)test(int a,int b)
{__asm{//1.提栈push ebpmov  ebp ,espsub  esp ,0x40//2.保留现场push ebxpush esipush edi//3.填充缓冲区lea edi ,dword ptr ds:[ebp - 0x40]mov eax ,0xccccccccmov ecx ,0x10rep stosd //4.实现函数功能mov eax , dword ptr ds:[ebp + 0x8]add eax , dword ptr ds:[ebp + 0xc] // mov dword ptr ds:[ebp + 0xc],eax  //5.还原现场pop edipop esipop ebx mov esp ,ebppop ebpretn}
}int main()
{test(2,3);return 0;}

其中我对一行进行了注释,因为我觉得这段代码是开放的,你也完全可以把他直接存在EAX然后retn回函数之后再对你想要赋值的东西进行赋值(非裸函数的VS编译器就是这么干的)

mov dword ptr ds:[ebp + 0xc],eax  

3.调用约定

上面我们说的是外平栈,其实默认的就是这样的调用

double __cdecl test(double a, double b)
{return a + b;
}

直接在函数外面进行平栈 

那么如果我们想要内平栈呢??? 那么就要这么写了

int   __stdcall test2(int  a, int  b)
{return a + b;
}

他直接Ret8了,其实这个指令就是add esp8 ,然后再retn

然后,就是我们的__fastcall了,这个函数于其他两个函数的区别,他在只有两个参数的情况下是不会对栈进行操作的,而是直接存储在CPU中,这样速度会快很多。

而且还要注意的一点,不知道大家发现没有,我们Push数进栈的时候,是从右往左进行PUSH的,而不是从左往右进行PUSH的!!!!

4.条件语句

首先就是我们的if了,我们先去写一段IF的代码

IF

    int i = 1;if (i == 1){i = 2;}

然后我们直接去看它的反汇编

我们从上面就能发现,里面的JCC语句和现实逻辑其实是相反的,cmp如果相等的话ZF位就是1,

我们就能看见它的JCC语句是在如果两个数不相等的时候就会跳转,如果相等就会执行下面的语句

IF ELSE

既然有IF ,那怎么能少的了IF ELSE 呢

我们从汇编的角度不难发现,首先他是通过CMP判断,如果不是的话,JCC语句就跳到ELSE的位置,如果是的话,执行完cout之后他就会JMP到ELSE执行完毕

While

然后就是while了,我们还是通过写一段While代码进行看他的反汇编

我们还是能从反汇编里面看见je这个语句,其实就是Jump if zero,但是我们的test eax ,eax这个汇编语句是恒为真的,所以一定不会Jump!!!!就达到了一直循环的目的。

For

然后就是我们常用的for语句了

我们可以看见执行之前的JG这个JCC语句,它的意思是对于有符号数来说,如果大于则跳转,很明显,一开始我们的i都是小五5的,所以肯定是不会跳转的。

5.DLL

DLL (Dynamic Link Library) 文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可使用多个DLL文件,一个DLL文件也可能被不同的应用程序使用,这样的DLL文件被称为共享DLL文件。

当我们程序执行的时候,必须连接到DLL文件,然后通过DLL文件去调用一些Windows的API(像什么 WirteProcessMemory ,VirtualAlloc,CreateThread ......)

说了那么多,我们去VS生成一个DLL文件

生成之后我们能看见这样的东西

重点其实就在这串代码

  switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:break;}
  • DLL_PROCESS_ATTACH :这个事件在当前进程第一次装载该 DLL 时触发,即 DLL 被加载到进程的地址空间中时。在这个分支中,可以执行与 DLL 装载相关的初始化操作。
  • DLL_THREAD_ATTACH    :这个事件在新线程创建并且该 DLL 被加载到新线程的地址空间时触发。在这个分支中,可以执行与新线程相关的初始化操作。
  • DLL_THREAD_DETACH    :这个事件在线程退出时触发,如果该线程加载了该 DLL,则会在 DLL 从该线程的地址空间中卸载时触发。在这个分支中,可以执行与线程退出相关的清理操作。
  • DLL_PROCESS_DETACH  :这个事件在当前进程卸载该 DLL 时触发,即该 DLL 从进程的地址空间中移除时。在这个分支中,可以执行与 DLL 卸载相关的清理操作。

那么下面我们就来演示一下DLL的调用方法,我么这里写一个弹窗的DLL

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"BOOL APIENTRY DllMain( HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
{switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:MessageBox(0, L"我是黑客", L"没有绝对安全的系统", MB_OK);case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:break;}return TRUE;
}

然后我们去生成一下,并且通过工具,注入一个32位的程序(32位的DLL要注32位的EXE)

这里说一下 VS编译的快捷键是 Control + F7 

然后我们直接找一个EXE去注入,这里我就找一个自己写的EXE去注入了

然后就能看见弹框了

当然了,除了这种注入的方式去运行DLL,我们还可以去通过专门运行DLL的程序去运行

比如说rundll32就是一个不错的选择,不过被杀软盯得很严重,所以一般实战不会用这个,但是还是讲一下怎么使用!!!!

rundll32.exe custom.dll,CustomFunction

通过上面的命令,我们可以调用DLL里面的函数

#include <Windows.h>
extern "C" __declspec(dllexport) void rundll(HWND hwnd,HINSTANCE hinst,LPTSTR
lpCmdLine,INT nCmdShow)
{
MessageBox(NULL,TEXT("whoami"),TEXT("Rundll32"),MB_OK);
}
rundll32 testdll.dll, rundll 

 通过这个,我们的DLL中的函数也是能被加载进来的

那么,c语言的基础就到这里了,我后面就把Shellcode loader给补上

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/32341.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

动手学深度学习(Pytorch版)代码实践 -卷积神经网络-24深度卷积神经网络AlexNet

24深度卷积神经网络AlexNet import torch from torch import nn import liliPytorch as lp import liliPytorch as lp import matplotlib.pyplot as pltdropout1 0.5 #Alexnet架构 net nn.Sequential(nn.Conv2d(1, 96, kernel_size11, stride4, padding1),nn.ReLU(),nn.MaxPo…

智慧校园综合管理系统的优点有哪些

在当今这个信息化飞速发展的时代&#xff0c;智慧校园综合管理系统正逐步成为教育领域的一股革新力量&#xff0c;它悄然改变着我们对传统校园管理的认知。这套系统如同一个无形的桥梁&#xff0c;将先进的信息技术与学校的日常运作紧密相连&#xff0c;展现出多维度的优势。 …

训练营第四十五天 | 435. 无重叠区间763.划分字母区间56. 合并区间738.单调递增的数字968.监控二叉树

435. 无重叠区间 力扣题目链接(opens new window) 给定一个区间的集合&#xff0c;找到需要移除区间的最小数量&#xff0c;使剩余区间互不重叠。 注意: 可以认为区间的终点总是大于它的起点。 区间 [1,2] 和 [2,3] 的边界相互“接触”&#xff0c;但没有相互重叠。 示例 1…

6/22 第四周 python操作word

学习到了word有四个段落&#xff0c;都可以通过python来操作。 并且课程的体系&#xff0c;只是一个启蒙&#xff0c;需要在公司的项目中熟悉&#xff0c;从而具备专项测试的能力。 后续每天的学习笔记也需要侧重于理解的部分。

【CPP】归并排序

目录 1.归并排序简介代码分析归并的非递归形式 1.归并排序 归并排序&#xff08;MERGE-SORT&#xff09; 是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide andConquer&#xff09;的一个非常典型的应用。 将已有序的子序列合并&#xff0c;得到…

NXP实战笔记(十四):32K3xx基于RTD-SDK在S32DS实现HSE的安装。

目录 1、概述 1.1、什么是HSE&#xff1f; 1.2、如何实现HSE的OTA功能 1.3、S32K3放置HSE的地址 2、通过调试器安装HSE 3、通过IVT方式安装HSE 4、坑点慎重踩 4.1、优化等级 4.2、Flash放RAM 4.3、C40_Ip配置更改 4.4、程序烧录 5、测试结果 6、代码链接 1、概述 首…

“论SOA在企业集成架构设计中的应用”必过模板,软考高级,系统架构设计师论文

论文真题 企业应用集成(Enterprise Application Integration, EAI)是每个企业都必须要面对的实际问题。面向服务的企业应用集成是一种基于面向服务体系结构(Service-OrientedArchitecture,SOA)的新型企业应用集成技术,强调将企业和组织内部的资源和业务功能暴露为服务,实现…

vue-json-viewer组件 copyable失效,页面并不现实copy按钮

<json-viewer :value"props.row.param_detail.query" :expand-depth"10" copyable> </json-viewer> 官方文档中&#xff0c;说明&#xff0c;只要在json-viewer中加入 copyable属性&#xff0c;即可实现copy功能&#xff0c;如下图&#xff1…

yolov8环境搭建+训练自己数据集

一、yolov8环境搭建 1. 安装miniconda环境 地址&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda 选择Python3.8版本 最好安装在C盘 勾选自动添加环境变量 ***以下操作安装过程中关闭代理软件 *** 2. 创建虚拟环境 conda create -n yolov8 python3…

vue自建h5应用,接入企业微信JDK(WECOM-JSSDK),实现跳转添加好友功能

一、项目场景&#xff1a; 1、使用vue开发了一套h5页面的项目 2、这个h5链接是在企业微信里某个地方打开的 3、打开页面的时候有一个好友列表&#xff0c;点击好友列表某一条复制手机号跳转到企业微信添加好友页面 二、实现的效果图 博客只允许上传gif图&#xff0c;所以我只…

浙江工商大学24计算机考研数据,好几个专业都接收调剂,计专复试线284分!

浙江工商大学&#xff08;Zhejiang Gongshang University&#xff09;&#xff0c;简称“浙商大”&#xff08;ZJSU&#xff09;&#xff0c;坐落于浙江省杭州市&#xff0c;是中华人民共和国教育部、中华人民共和国商务部和浙江省人民政府共建的浙江省重点建设高校&#xff0c…

C#调用OpenCvSharp计算并显示带掩膜的图像直方图

之前的文章简要测试了调用OpenCvSharp的Cv2.CalcHist函数计算直方图的用法&#xff0c;不过使用过程中参数mask的值始终为null&#xff0c;也就是计算的整幅图像的直方图&#xff0c;如果mask不为空&#xff0c;则可以计算图像指定区域的直方图&#xff0c;本文学习掩膜的创建方…

css grid实现九宫格布局

常见的九宫格布局可以使用flex布局实现&#xff0c;但是flex布局有个致命的缺陷&#xff0c;比如3行3列的布局&#xff0c;当第不足3个元素的时候&#xff0c;元素依然是平局平铺的&#xff0c;这样就不满足九宫格的效果&#xff0c;这种情况&#xff0c;使用grid布局可以轻松搞…

Zigbee协议详解:低功耗无线通信的理想选择

什么是Zigbee协议 Zigbee是一种基于IEEE 802.15.4标准的无线通信协议&#xff0c;专为低功耗、低数据速率和短距离通信设计。它广泛应用于物联网&#xff08;IoT&#xff09;设备&#xff0c;如智能家居、工业自动化和健康监测等领域。Zigbee协议由Zigbee联盟维护和推广&#x…

Antd Table 表格 拖拽列宽

antd 的表格组件的列宽&#xff0c;是通过width属性去初始化的&#xff0c;有时候渲染的内容不固定&#xff0c;这个宽做不到通用所以研究怎么实现表格列宽拖动&#xff0c;主要的实现步骤如下&#xff1a; 使用table的components API修改表格头部为 react-resizable提供的组件…

C#事件详解及应用示例

简介 事件是使类具备向其它类通知发生的相关事情的能力。事件被分成两部分&#xff1a;一、引发或发送事件的类&#xff08;称发布者&#xff09;&#xff1b;二、处理或接收事件的类&#xff08;称订阅者&#xff09;。事件也是类型的成员。在 .NET 的桌面应用程序中&#xff…

Netty 入门实例

文章目录 1. 概述2. 代码实例2.1 服务端2.2 客户端2.3 运行截图 3. 整体结构4. 重要组件4.1 EventLoopGroup、EventLoop4.2 Handler & Pipeline4.3 ByteBuf 参考文献 1. 概述 Netty 是一款用于高效开发网络应用的 NIO 网络框架&#xff0c;它大大简化了网络应用的开发过程…

MySQL查询语句语法使用

目录 一、基本查询二、条件查询2.1 简单条件表达式2.2 逻辑表达式2.3 模糊查询 (LIKE)2.4 范围查询 (BETWEEN ... AND ...)2.5 列表查询 (IN)2.6 空值查询 (IS NULL 或 IS NOT NULL) 三、排序查询3.1 基本语法3.2 单列排序3.2 多列排序3.3 使用表达式排序 四、分组查询聚合函数…

mysql的安装和连接

一.数据库相关概 念 1.数据库 存储数据的仓库,数据是有组织的进行存储,简称DB。 2.数据库管理系统 操纵和管理数据库的大型软件,简称DBM。 3.SQL 操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准。简称SQL。 二.市面上流行的数据库 1.ORACLE 2.MySQL …

如何搭建一个成功的短剧制作平台

要搭建一个成功的短剧制作平台&#xff0c;需要考虑多个方面&#xff0c;包括目标定位、技术选择、内容管理、用户体验等。 1、明确目标和定位&#xff1a; 确定你的目标受众是谁&#xff0c;他们的年龄、兴趣、消费习惯等。 明确短剧制作平台的主要定位&#xff0c;是提供原创…