針對進程行為的監控需求,以往很多安全軟件都是采用的Hook技術攔截關鍵的系統調用,來實現對惡意軟件進程創建的攔截。但在x64架構下,系統內核做了很多安全檢測措施,特別是類似于KDP這樣的技術,使得Hook方法不再有效。為此OS推出了基于回調實現的行為監控方案。本文借助IDA逆向分析該技術的實現原理并給出了關鍵數據結構及調用鏈,通過雙機內核調試驗證了該數據結構以及調用鏈的正確性。
涉及到的內容如下:
1、內核對象及內核對象管理;
2、進程回調;
3、內核調試;
4、Windbg雙擊調試;
近年來,各種惡意軟件新變種層出不窮,攻擊方法、手段多種多樣,造成了巨大的經濟損失。作為防守的第一個環節就是能夠識別出惡意進程創建的動作,而進程創建監控技術是為了能夠讓安全軟件有機會攔截到此動作的技術。安全軟件根據匹配算法判斷是否準許該進程創建,以此達到保護用戶數據安全的目的。x86架構下的實現方案多為Hook技術,通過攔截內核中進程創建的關鍵API如nt!NtCreateProcess或nt!NtCreateProcessEx,通過堆棧來回溯到關鍵參數,如待創建進程的exe全路徑、父進程信息,然后根據獲取到的全路徑檢測exe磁盤文件,同時也可以分析進程鏈最終確定是否放行該動作。但這種技術方案存在一些缺陷,一方面其破壞了內核的完整性,導致系統的穩定性下降;另一方面,這些API很多都是未公開的,也就意味著需要通過逆向工程等技術手段來分析OS內核鏡像文件,定位到關鍵的API。但如果系統升級了,該API可能就不存在了,這也導致安全軟件的兼容性特別差;最重要的是各個安全廠家的實現方案不一樣,掛鉤的點也不同,很容易出現相互競爭的情況,極有可能會導致BSoD(Blue Screen of Death)。另一種傳統的基于特征碼的攔截方式,也同樣存在類似的問題。需要為每個子版本的系統關鍵API做逆向分析,取出特征碼,當系統更新或者打補丁,則需要再次逆向分析取出特征碼。工作量巨大,效率低下,適配性很低,如果沒有及時更新特征碼,很可能會使得監控失效,情況糟糕的時候會直接導致BSoD。為此,在x64架構下,內核一方面為了保護關鍵數據的完整性,另一方面也為了提高內核程序自身的穩定性,推出了諸如KDP(Kernel Data Protection)、PG等安全措施,使得傳統的 Hook技術失效;同時OS為了規范化安全相關信息的獲取,使得安全軟件能夠在內核可控的情況下提供安全服務,Windows系統層面提供了一種基于回調的方式來通知安全軟件注冊的內核回調例程。這種方式優點是方便高效,可移植性好,穩定性高,且各個安全廠商之間也不會出現競爭的關系。
本文基于逆向工程及內核調試技術,分析了該技術的具體實現及系統額外增加的數據檢測機制。借助逆向工具IDA靜態逆向分析了系統關鍵API的內部動作及具體的實現,相關的數據結構,得到該技術實際觸發的調用源以及整個調用鏈。借助VMWare搭建雙機調試環境,利用Windbg動態調試系統內核,查看系統中所涉及到的關鍵數據,并與PCHunter給出的數據做對比分析,驗證了分析結論的正確性。此外還通過對調用鏈中的關鍵函數下斷點,通過?;厮菁夹g,動態觀察了整個調用鏈及觸發時間。分析得到的關鍵數據結構和系統對數據做的檢測校驗算法可用于檢測病毒木馬等軟件惡意構造的表項,且還可以應用到安全廠商對抗惡意代碼時,自動構造表項來檢測系統行為,完全脫離系統提供的注冊卸載API。
根據微軟官方技術文檔MSDN上的說明,通過PsSetCreateProcessNotifyRoutine、PsSetCreateProcessNotifyRoutineEx和PsSetCreateProcessNotifyRoutineEx2這三API來安裝一個進程創建、退出通知回調例程,當有進程創建或者退出時,系統會回調參數中指定的函數。以PsSetCreateProcessNotifyRoutine為例子,基于IDA逆向分析該API的具體實現。如圖1所示,由圖可知,該API內部僅僅是簡單的調用另一個函數,其自身僅僅是一個stub,具體的實現在PspSetCreateProcessNotifyRoutine中,此函數的安裝回調例程的關鍵實現如圖所示。
調用ExAllocateCallBack,創建出了一個回調對象,并將pNotifyRoutine和bRemovel作為參數傳入,以初始化該回調對象,代碼如圖所示;其中pNotifyRoutine即是需要被回調的函數例程,此處的bRemovel為false,表示當前是安裝回調例程。
緊接著調用ExCompareExchangeCallBack將初始化好的CallBack對象添加到PspCreateProcessNotifyRoutine所維護的全局數組中。值得注意的是,ExCompareExchangeCallBack中在安裝回調例程時,對回調例程有一個特殊的操作如圖所示。
與0x0F做了或操作,等價于將低4位全部置1;若ExCompareExchangeCallBack執行失敗,則接著下一輪循環繼續執行。由圖2中第66行代碼可知,循環的最大次數是0x40次。如果一直失敗,可調用ExFreePoolWithTag釋放掉pCallBack所占用的內存,且返回0xC000000D錯誤碼。
然后根據v3的值判斷是通過上述三個API中的哪個安裝的回調,來更新相應的全局變量。其中PspCreateProcessNotifyRoutineExCount和PspCreateProcessNotifyRoutineCount分別記錄當前通過PsSetCreateProcessNotifyRoutineEx和PsSetCreateProcessNotifyRoutine安裝回調例程的個數。PspNotifyEnableMask用以表征當前數組中是否安裝了回調例程,該值在系統遍歷回調數組執行回調例程時,用以判斷數組是否為空,加快程序的執行效率。
除了能夠安裝回調例程,這三個API也能卸載指定的回調例程。以PsSetCreateProcessNotifyRoutine為例,分析其實現的關鍵部分,如圖所示。
通過一個while循環遍歷PspCreateProcessNotifyRoutine數組,調用ExReferenceCallBackBlock取出數組中的每一項,該API內部會做一些檢驗動作且對返回的數據也做了特殊處理,如圖所示。圖6中*pCallBackObj即是取出回調對象中的回調例程的函數地址,通過判斷其低4位是否為1來做一些數據的校驗,如17行所示。系統做這個處理也是起到保護作用,防止惡意構造數據填入表中,劫持正常的系統調用流程。此外,圖中第33行處的代碼,在將回調例程返回給父調用時,也將回調例程的低4位全部清零,否則返回的地址是錯誤的,調用立馬觸發CPU異常。
ExReferenceCallBackBlock成功返回后,調用ExGetCallBackBlockRoutine從返回的回調對象中取出回調例程,并判斷取出的是否為當前指定需要卸載的項,如果是則調用ExDereferenceCallBackBlock遞減引用計數,接著調用ExFreePoolWithTag釋放掉Callback所占用的內存。期間也會更新PspCreateProcessNotifyRoutineExCount或PspCreateProcessNotifyRoutineCount的值。根據源碼還可以得知,該數組總計64項,也即只能安裝64個回調例程。如果遍歷完數組的64項依舊沒有找到,則返回0xC000007A錯誤碼。
回調例程安裝完之后,如果有新的進程創建或退出,內核則便會遍歷該數組來執行其中安裝的每一項回調例程。通過IDA的交叉引用功能,可分析出內核其他地方對PspCreateProcessNotifyRoutine的交叉引用,如圖所示,
共計5個地方涉及到此變量。其中PspCallProcessNotifyRoutines是直接調用回調例程的函數,該函數的關鍵部分如圖所示。
通過while循環,遍歷PspCreateProcessNotifyRoutine數組中安裝的所有回調例程,依次執行。PspNotifyEnableMask & 2的操作即為判斷當前數組中是否安裝有回調例程,加快程序的執行效率,這個變量的值在PsSetCreateProcessNotifyRoutine中安裝回調例程時設置。bRemove & 2這個if分支,是用來判斷當前的回調例程是通過PsSetCreateProcessNotifyRoutine還是PsSetCreateProcessNotifyRoutineEx安裝,因為這兩個API安裝的回調例程的原型不同,在實際調用時傳入的參數也不同。兩者的回調例程原分別為:void PcreateProcessNotifyRoutine(HANDLE ParentId,HANDLE ProcessId,BOOLEAN Create)和void PcreateProcessNotifyRoutineEx(PEPROCESS Process,HANDLE ProcessId,PPS_CREATE_NOTIFY_INFO CreateInfo)。此外,圖8中IDA給出的偽C代碼RoutineFun((unsigned __int64)RoutineFun)明顯不對,因為回調例程的參數個數是3個,而IDA分析出的參數只有1個,顯然有問題。直接看下反匯編代碼即可得知,如圖所示,
根據x64下的調用約定可知,函數的前4個參數是通過rcx、rdx、r8和r9這四個寄存器傳遞,圖給出的正是回調例程的前三個參數,_guard_dispatch_icall內部會直接取rax的值調用過去,而rax的值正是ExGetCallBackBlockRoutine調用返回的回調例程函數地址。
上圖中的第二個涉及到PspCreateProcessNotifyRoutine數組的是PspEnumerateCallback函數,該函數是系統內部函數,沒有導出,其具體實現如圖所示。
該函數根據dwEnumType來判斷想要枚舉的是哪個數組,由代碼分析可知,系統內核維護了三個回調相關的數組,分別為鏡像加載回調數組,進程創建退出回調數組,線程創建退出數組。類似之前的函數校驗,這里也檢測了索引是否超過0x40,超過了則返回0,以示失敗。
上節分析了回調例程的直接調用上級函數,本節分析整個調用鏈,主要分析調用源及調用過程中涉及到的關鍵函數。根據IDA給出的交叉引用圖如圖所示。
涉及到的函數調用非常多,很多不相關的也被包含進來,不便于分析。經手動分析整理后的調用鏈,其鏈路中的關鍵API如圖所示。
虛線以上部分為用戶態程序,虛線以下為內核態程序,紅色標注的都是標準導出的API。根據圖12可知,當用戶態進程調用RtlCreateUserProcess、RtlCreateUserProcesersEx或RtlExitUserProcess時,內核都會去遍歷PspCreateProcessNotifyRoutine數組,依次執行回調例程,通知給驅動程序做相應的處理。驅動接管之后,可以做安全校驗處理,分析進程的父進程或者進一步分析進程鏈,此外還可以對即將被拉起的子進程做特征碼匹配,PE指紋識別,導入表檢測等防御手段。這種方式不需要去Hook任何API,也無需做特征碼定位等重復繁瑣的工作,完全基于系統提供的回調機制,且在Windows系統中都可以無縫銜接。且各個安全廠家之間也不存在相互競爭,大大縮小了系統藍屏的風險。圖12中NtCreateUserProcess調用PspInsertThread的原因是創建進程的API內部會創建該進程的主線程。將遍歷回調例程數組的工作統一到PspInsertThread中,由其去調用下層的PspCallProcessNotifyRoutines更為合理。
實驗環境如表1所示,借助于VMWare進行雙機調試。
Guest OS Build 10.0.16299.125
Host OS Build 10.0.17134.885
Windbg版本 10.0.17134.1
VMWare 14.1.1 build-7528167
PCHunter V1.56
在Windbg中觀察PspCreateProcessNotifyRoutine數組,共計14項有效數據,如下所示;
1: kd> dd PspCreateProcessNotifyRoutineCount l1
fffff802`151f4e78 00000009
1: kd> dd PspCreateProcessNotifyRoutineExCount l1
fffff802`151f4e7c 00000005
1: kd> dq PspCreateProcessNotifyRoutine l40
fffff802`14da2a80 ffffcc8b`d884b9bf ffffcc8b`d8d9c96f
fffff802`14da2a90 ffffcc8b`d939975f ffffcc8b`da00044f
fffff802`14da2aa0 ffffcc8b`d9bd382f ffffcc8b`da41e8df
fffff802`14da2ab0 ffffcc8b`da53815f ffffcc8b`da5ca8bf
fffff802`14da2ac0 ffffcc8b`dac5178f ffffcc8b`dbef624f
fffff802`14da2ad0 ffffcc8b`dce333af ffffcc8b`dcec67df
fffff802`14da2ae0 ffffcc8b`dc735def ffffcc8b`dcabd32f
拆解第一項,尋找其所對應的回調例程,如下:
1: kd> dq ffffcc8b`d884b9b0 l3
ffffcc8b`d884b9b0 00000000`00000020 fffff802`13fd6268
ffffcc8b`d884b9c0 00000000`00000000
由此可知,安裝的回調例程起始地址為fffff802`13fd6268,且還可知道Remove為0,即這個是已經安裝的。尋找該回調例程對應的驅動模塊,如下:
1: kd> u fffff802`13fd6268
360qpesv64+0x26268:
fffff802`13fd6268 mov qword ptr [rsp+08h],rbx
fffff802`13fd626d mov qword ptr [rsp+10h],rbp
fffff802`13fd6272 mov qword ptr [rsp+18h],rsi
fffff802`13fd6277 push rdi
1: kd> lmvm 360qpesv64
start end module name
fffff802`13fb0000 fffff802`14002000 360qpesv64
Loaded symbol image file: 360qpesv64.sys
Image path: 360qpesv64.sys
Image name: 360qpesv64.sys
Timestamp: Wed May 27 20:13:22 2020 (5ECF2C52)
CheckSum: 00054A2A
ImageSize: 00052000
可知該回調例程是360官方提供。借助PCHunter來對比下,其給出的數據如圖所示,
以表項的第14項為例,內容如下,
1: kd> dq ffffcc8b`dcabd320 l3
ffffcc8b`dcabd320 00000000`00000020 fffff802`13d795b4
ffffcc8b`dcabd330 00000000`00000006
1: kd> bp fffff802`13d795b4
1: kd> g
斷點命中,查看父進程相關信息,如下,
Breakpoint 0 hit
fffff802`13d795b4 48895c2408 mov qword ptr [rsp+8],rbx
1: kd> dt _EPROCESS @$proc -yn ImageFileName
nt!_EPROCESS
+0x450 ImageFileName : [15] "svchost.exe"
由此可知,是svchost.exe這個父進程創建或者銷毀了一個子進程,更具體的信息如下分析;查看下當前的上下文環境;
1: kd> r
rax=fffff80213d795b4 rbx=ffffcb8050526c80 rcx=ffffcc8bdd67e080
rdx=0000000000001f28 rsi=000000000000000d rdi=ffffcc8bdd67e080
rip=fffff80213d795b4 rsp=ffffcb8050526c38 rbp=ffffcb8050526ca9
r8=ffffcb8050526c80 r9=ffffcc8bdc735de0 r10=ffff9401cdcc2760
r11=0000000000000000 r12=0000000000000001 r13=0000000000000000
r14=ffffcc8bdcabd320 r15=fffff80214da2ae8
iopl=0 nv up ei pl zr na po nc
cs=0010 ss=0018 ds=002b es=002b fs=0053 gs=002b efl=00000246
根據x64的調用約定可知,rcx寄存器中存儲的是EPROCESS對象指針,該對象存儲的是即將被創建的子進程的相關信息,可以獲取到的作為身份識別或者安全檢測的關鍵信息如下:
1: kd> dt _EPROCESS ffffcc8bdd67e080 -yn ImageFile
ntdll!_EPROCESS
+0x448 ImageFilePointer : 0xffffcc8b`dc97c5c0 _FILE_OBJECT
+0x450 ImageFileName : [15] "UpdateAssistan"
1: kd> dt 0xffffcc8b`dc97c5c0 _FILE_OBJECT -yn FileName
ntdll!_FILE_OBJECT
+0x058 FileName : _UNICODE_STRING "\Windows\UpdateAssistant\UpdateAssistant.exe"
1: kd> .process /p ffffcc8bdd67e080; !peb 186ef07000
Implicit process is now ffffcc8b`dd67e080
.cache forcedecodeuser done
PEB at 000000186ef07000
CurrentDirectory: 'C:\Windows\system32\'
WindowTitle: 'C:\Windows\UpdateAssistant\UpdateAssistant.exe'
ImageFile: 'C:\Windows\UpdateAssistant\UpdateAssistant.exe'
CommandLine: 'C:\Windows\UpdateAssistant\UpdateAssistant.exe /ClientID Win10Upgrade:VNL:NHV19:{} /CalendarRun'
可以獲取到該進程的EXE路徑,創建時的命令行參數,父進程的PID等信息,這些足以用于安全軟件的檢測。
父進程的完整調用棧如下,
1: kd> k
# Child-SP RetAddr Call Site
00 ffffcb80`50526c38 fffff802`14ef4ae5 0xfffff802`13d795b4
01 ffffcb80`50526c40 fffff802`14ef752c nt!PspCallProcessNotifyRoutines+0x249
02 ffffcb80`50526d10 fffff802`14f2797b nt!PspInsertThread+0x5a4
03 ffffcb80`50526dd0 fffff802`14b79553 nt!NtCreateUserProcess+0x9c7
04 ffffcb80`50527a10 00007ffe`547d1654 nt!KiSystemServiceCopyEnd+0x13
05 0000002f`4b67d258 00007ffe`50b406df ntdll!NtCreateUserProcess+0x14
06 0000002f`4b67d260 00007ffe`50b3d013 KERNELBASE!CreateProcessInternalW+0x1b3f
07 0000002f`4b67dec0 00007ffe`5216ee0f KERNELBASE!CreateProcessAsUserW+0x63
08 0000002f`4b67df30 00007ffe`4ce0a136 KERNEL32!CreateProcessAsUserWStub+0x5f
09 0000002f`4b67dfa0 00007ffe`4ce0bdd9 UBPM!UbpmpLaunchAction+0xb36
0a 0000002f`4b67e280 00007ffe`4ce08ee0 UBPM!UbpmLaunchTaskExe+0x279
0b 0000002f`4b67e490 00007ffe`4ce10a86 UBPM!UbpmpLaunchOneTask+0x6c0
0c 0000002f`4b67e8f0 00007ffe`4ce0b8bc UBPM!UbpmpHandleGroupSid+0x236
0d 0000002f`4b67ea10 00007ffe`4ce0b78b UBPM!UbpmpLaunchExeAction+0xec
0e 0000002f`4b67eaf0 00007ffe`4ce0b5a3 UBPM!UbpmpTakeAction+0xeb
0f 0000002f`4b67eb50 00007ffe`4ce0b193 UBPM!UbpmpPerformTriggerActions+0x293
10 0000002f`4b67eca0 00007ffe`4ce1316c UBPM!UbpmpHandleTriggerArrived+0x563
11 0000002f`4b67ef50 00007ffe`508c32d0 UBPM!UbpmpRepetitionArrived+0x1c
12 0000002f`4b67ef90 00007ffe`508c3033 EventAggregation!EaiSignalAggregateEvent+0x16c
13 0000002f`4b67f060 00007ffe`508c27aa EventAggregation!EaiSignalCallback+0xe7
14 0000002f`4b67f140 00007ffe`508c253e EventAggregation!EaiProcessNotification+0x1aa
15 0000002f`4b67f270 00007ffe`508caef8 EventAggregation!WnfEventCallback+0x506
16 0000002f`4b67f3a0 00007ffe`5476769f EventAggregation!AggregateEventWnfCallback+0x38
17 0000002f`4b67f3f0 00007ffe`54767a51 ntdll!RtlpWnfWalkUserSubscriptionList+0x29b
18 0000002f`4b67f4e0 00007ffe`5476b510 ntdll!RtlpWnfProcessCurrentDescriptor+0x105
19 0000002f`4b67f560 00007ffe`54766b59 ntdll!RtlpWnfNotificationThread+0x80
1a 0000002f`4b67f5c0 00007ffe`54764b70 ntdll!TppExecuteWaitCallback+0xe1
1b 0000002f`4b67f600 00007ffe`52171fe4 ntdll!TppWorkerThread+0x8d0
1c 0000002f`4b67f990 00007ffe`5479ef91 KERNEL32!BaseThreadInitThunk+0x14
1d 0000002f`4b67f9c0 00000000`00000000 ntdll!RtlUserThreadStart+0x21
由于前四個參數是通過的寄存器傳遞的,所以無法直接通過棧來回溯到參數,但可以通過手動方式分析得到。分析ntdll!NtCreateUserProcess的調用父函數,其返回地址處的匯編代碼如下所示:
1: kd> ub 00007ffe`50b406df
KERNELBASE!CreateProcessInternalW+0x1b11:
00007ffe`50b406b1 488b842440040000 mov rax,qword ptr [rsp+440h]
00007ffe`50b406b9 4889442420 mov qword ptr [rsp+20h],rax
00007ffe`50b406be b800000002 mov eax,2000000h
00007ffe`50b406c3 448bc8 mov r9d,eax
00007ffe`50b406c6 448bc0 mov r8d,eax
00007ffe`50b406c9 488d942448010000 lea rdx,[rsp+148h]
00007ffe`50b406d1 488d8c24e0000000 lea rcx,[rsp+0E0h]
00007ffe`50b406d9 ff1521901600 call qword ptr [KERNELBASE!_imp_NtCreateUserProcess (00007ffe`50ca9700)]
可知,NtCreateUserProcess第一個參數和第二個參數再rsp+0xE0和rsp+0x148處;查看該處的數據如下:
1: kd> dpu 0000002f`4b67d260+E0 0000002f`4b67d260+148
0000002f`4b67d340 00000000`00000000
0000002f`4b67d348 00000000`00000004
0000002f`4b67d350 00000100`00000000
0000002f`4b67d358 00000000`00000020
0000002f`4b67d360 000001f2`d9b87cc0 "C:\Windows\UpdateAssistant\UpdateAssistant.exe"
0000002f`4b67d368 00000000`00000000
0000002f`4b67d370 00000000`00000000
0000002f`4b67d378 0000002f`00000000
0000002f`4b67d380 000001f2`d8d43580 "C:\Windows\UpdateAssistant\UpdateAssistant.exe /ClientI"
0000002f`4b67d388 00000000`00000000
0000002f`4b67d390 00000000`00008664
0000002f`4b67d398 000001f2`d9d73c40 "ALLUSERSPROFILE=C:\ProgramData"
0000002f`4b67d3a0 00000000`00000000
0000002f`4b67d3a8 00000000`00000000
由此可知,svchost拉起的子進程為UpdateAssistant.exe,與之前分析得到的參數也相吻合。從調用??芍?,是在svchost創建子進程UpdateAssistant.exe時遍歷的回調例程,通知給驅動軟件做相應的處理。
本文詳細地分析了系統實現進程回調安全機制的內部原理,借助IDA工具逆向系統鏡像文件,分析了實現的關鍵代碼部分,得到了關鍵數據結構及系統額外做的數據檢測校驗算法。對關鍵全局變量的作用也做了詳細解釋。此外,通過逆向分析,給出了整個機制的調用源與調用鏈。最后基于雙機調試環境,動態查看內核中維護的進程回調例程表,并且下斷點實際動態調試了整個過程。對于驅動開發,內核安全相關方面的研究工作者提供了該技術實現原理與機制?;诘玫降年P鍵數據結構和系統數據檢驗保護算法,可以解密關鍵字段后檢測表項中的惡意代碼,也可以用于安全廠商在對抗過程中,完全脫離系統提供的API手工構建表項,達到監控系統行為的目的。
本周熱點趨勢榜雖然新項目不多,但是還是有幾個不錯值得收藏的工具項目,比如用來做文本轉語音的 tortoise-tts 能生成更加貼近真實人聲的語音,讓 Golang 并發更出色的 conc,以及通過 Hook 來管理 React 狀態的 zustand,以及本周特推調試 Windows 11 內核的 BugChecker。
選項標準:新發布 | 實用 | 有趣,根據項目 release 時間分類,發布時間不超過 14 day 的項目會標注 New,無該標志則說明項目 release 超過半月。由于本文篇幅有限,還有部分項目未能在本文展示,望周知
主語言:C
New BugChecker 是一個類 SoftICE 的 Windows 11 內核調試器,SoftICE 是一款 Windows 平臺下的動態脫殼輔助軟件。BugChecker 支持上古的 XP 到現在的 Windows 11 所有版本,只要是 x86 和 x64 架構即可。當你使用它進行調試工作時,不需要第二臺機器同設備相連接。BugChecker 在 NTOSKRNL 中利用了內部和非正式 KD API,而 KD API 允許 WinDbg/KD 可進行讀寫虛擬內存,讀寫寄存器,在地址中放置斷點等等操作。
部分特性:
GitHub 地址→github.com/vitoplantamura/BugChecker
New 如果你做數據分析,一定不能不懂統計。而本課程則教授你如何進行數據分析,側重于科學模型的學習。共計將有 10 周的學習時間,用近 3 個月來學習統計知識。
GitHub 地址→github.com/rmcelreath/stat_rethinking_2023
本周 star 增長數:800+,主語言:Jupyter Notebook
還記得上個月異?;鸨?AI 項目 ChatGPT 么?Open-Assistant 則是開源版的 ChatGPT,它在理解你的任務之余,輸出你想要的聊天結果。當項目并不只是想幫你寫個郵件、寫簡歷,希望未來能更多的個性化擴展,因此秉持小巧的宗旨讓 Open-Assistant 不要那么臃腫。
GitHub 地址→github.com/LAION-AI/Open-Assistant
本周 star 增長數:700+,主語言:TypeScript
簡化 flux 原則實現的小巧、快速、可擴展的 React 狀態管理工具,提供了基于 Hook 的 API 管理狀態,不用樣板或者固有模版。
GitHub 地址→github.com/pmndrs/zustand
本周 star 增長數:500+,主語言:Golang
更好的并發結構,可以更方便、安全地應對常見任務。conc 的三大目標:
下面是項目實現第一點目標的示例:
func main() {
var wg conc.WaitGroup
defer wg.Wait()
startTheThing(&wg)
}
func startTheThing(wg *conc.WaitGroup) {
wg.Go(func() { ... })
}
GitHub 地址→github.com/sourcegraph/conc
本周 star 增長數:400+,主語言:JavaScript
LinkTree 的開源替代品,讓你在某個社交平臺上放置你個人相關的鏈接。
GitHub 地址→github.com/EddieHubCommunity/LinkFree
本周 star 增長數:850+,主語言:Python
TorToiSe 是基于以下兩點構建的文本到語音應用:
你可以用以下方式使用它:
reference_clips=[utils.audio.load_audio(p, 22050) for p in clips_paths]
tts=api.TextToSpeech()
pcm_audio=tts.tts_with_preset("your text here", voice_samples=reference_clips, preset='fast')
GitHub 地址→github.com/neonbjb/tortoise-tts
- END -