1、靜態分析:IDA PRO
2、動態分析:Ollydbg/X32dbg/windbg
3、ARK工具:PCHunter
1、虛擬機:VMware WORKSTATION 14 PRO
2、系統版本:win7專業版
1、Windows的應用層基礎知識:《Windows核心編程》
2、Windows的內核的基礎知識:《Windows內核情景分析》
研究win7系統下通過CreateProcess所創建的進程的所有函數執行流程(R3到R0的函數調用的大致整體流程)
1、進程的本質,有哪些基本內容,需要哪些資源?
答:
本質:一個程序實際還是一段數據,管理的方式還是目錄+內容,即內核對象+程序空間,以內核中的EPROCESS為目錄,到CR3衍生的用戶的虛擬地址空間的PE文件映像。
內容:
(1)一個進程會有一個系統分配的主線程主要運行代碼。
(2)有一段虛擬內存空間,里面映射著PE文件內容。
(3)對應的一個內核對象,EPROCESS結構體。
2、R3環和R0的函數分別是如何調用的,分別有哪些和進程相關的函數?
答:
R3環:
CreateProcess
OpenProcess
CreateFile
.......
R3環下有程序主動調用API,dll可以看做是R3下底層,API的簡單實現在其中體現,dll中還會為進入R0環做一些準備工作。
R0環:
NTCreateProcess
NTCreateUserProcess
........
R0環下通過ETHREAD結構的ServiceTable找到SSDT或ShadowSSDT,通過R3環準備的參數和索引來進行函數調用。
ps:Wows系統設計思路也是面向對象,所以如果把函數當成對象來看其實每個函數都是由其它得函數組成的。
CreateProcessW
==> CreateProcessInternalW==> ZwCreateUserProcess==>
KiFastSystemCall==> KiFastCallEntry==> NtCreateUserProcess
3.R3環如何切換到R0環,R0如何返回R3環?
答:
(1)int 0X2E:
老版的進入方式,通過中斷門主動調用KiSystemService來完成系統服務調用,和int 3對應KiTrap03類似。
KiSystemCallExit:iret返回
(2)SYSENTER:
較新的進入方式,通過該特權指令切換寄存器(EIP/SS/CS/ESP)來進入R0環,KiSystemCallExit2:SYSEXIT返回
4、R0環調用函數的索引如何獲取?
答:
系統在進入R0環之前就做了很多檢查和準備,例如:后期用到的索引就是在進入R0環之前就存儲在EAX寄存器中,進入R0環只會切換關鍵寄存器來達到切換地址的目的,而EAX的值不會變化,索引就可以在R0下被訪問到。
1.進程的創建流程。
2.動態鏈接庫的調用。
3.系統服務描述符表的調用。
4.進程的虛擬地址空間(CR3寄存器)。
5.內核對象,例如:EPROCESS(據說搞定這個結構體就相當于搞定了大半個windows系統)、ETHREAD、KPCR、KPCRB。
6.R3環和R0環的交互。
1、整理以上知識點就得到了如下分析流程:
2、編寫程序
通過CreateProcess創建一個目標進程
#include "stdafx.h"
#include
#define Path L".\FileCleaner2.0.exe"
int _tmain(int argc, _TCHAR* argv[])
{
STARTUPINFO si={ sizeof(si) };
PROCESS_INFORMATION pi;
BOOL bRet=CreateProcess(Path,NULL,NULL,NULL,FALSE,NULL,NULL,NULL,&si,&pi);
return 0;
}
3、調試程序(R3/R0)
3.1 R3環
OD調試R3下調試程序得到如下流程:
R3-1:CreateProcessW(main函數)
R3-2: CreateProcessInternalW(Kernel.dll模塊)
1:ZwCreateUserProcess
2:KiFastSystemCall
3:SYSENTER
4.ZwResumeThread
R3-3:_CheckEsp
ps:其實可以直接在IDA中直接查看Kernel32.dll的函數實現。
3.2 R0環
R0環下windbg調式對新手用戶并不友好,故而只用它找到CreateUserProcess的函數地址就可,然后在IDA中查看CreateUserProcess 的具體實現。
分析時盡量保證SSDT沒有被HOOK,減少不必要的干擾。(找到函數的具體反匯編后就看個人的匯編的熟練程度了)
公式如下:
==> 偏移=函數地址-加載基址(ntkrnlpa.exe)
==> IDA的函數地址=偏移+0x400000(默認加載基址)。
PCHunter查看
1.ntkrnlpa的加載基址:0x84048000
2.SSDT 表中 CreateUserProcess 的原始函數地址:0x84298DE0
windbg調試:
1.dd KeServiceDescriptorTable
2.dds 840b76f0 +5d*4
IDA查看:
函數地址=0x8429dde0-0x84048000 + 0x400000=0x655DE0
1.NtCreateUserProcess未導出:
2.對比IDA和windbg的反匯編的函數內容
IDA
windbg
ps:可以將一個程序的組成看成:函數+執行邏輯,如果將系統看成一個巨大無比的程序,那么分析它也是可以從這兩方面入手。
本次只是簡單的分析了一個函數的執行流程,期間的函數實現會在開新貼進行具體分析,如:CreateProcessInternalW、NtCreateUserProcess、KiFastCallEntry等。
總之分析學習一項比較龐大的東西的時候,我覺的要觀察它的幾個主要行為作為主線,然后在主線中慢慢的發展一些支線來加深自己的理解,對我而言是提升比較快的方式。
例如:學習Windows系統時分R3/R0去拆解,然后以進程的整個生命的生存周期為例子,利用現有的知識量去去實踐去拓展。
所以就有了這篇帖子的誕生,算是為以后學習內核或是其他windowsAPI調用亦或是其他的一些事物提供一個思路,我不是方法論的崇拜者,但是好的方法、習慣的確可以事半功倍。
ps:~~共勉~~輕噴~~
原文鏈接:[原創]新手--win32程序的半生(CreateProcess)-『軟件逆向』-看雪安全論壇
本文由看雪論壇 Weaving 原創
轉載請注明來自看雪社區
IT之家10月20日消息 微軟日前為Windows 10的周年更新版(1607)、創意者更新版(1703)、創意者更新秋季版(1709)推送了累積更新,和往常一樣,這些更新主要進行了常規性的優化和修復。
本次的更新解決了許多穩定性的問題,并對系統的部分貨幣單位和時間信息進行了修復,用戶可以自行檢查更新。下面是IT之家整理的本次更新內容。
對Windows 10 v1607,本次更新將系統版本號更新至14393.2580,具體補丁編號為KB4462928,更新內容如下:
修復內容
解決了委內瑞拉中央銀行為進入玻利瓦爾索貝拉諾而實施的當地貨幣重新統一的問題。
解決更新時區信息的其他問題。
解決了從“開始”菜單調用阻止的應用程序時未顯示錯誤消息的問題。
解決了Microsoft-Windows-Kerberos-Key-Distribution-Center源和事件ID 7的事件日志條目中的AccountName有時會出現損壞的問題。
解決了非常快速創建登錄會話的帳戶的云身份驗證性能問題。
解決了在啟用聯邦信息處理標準(FIPS)模式時無法禁用TLS 1.0和TLS 1.1的問題。
解決了將兩個或多個證書映射到同一用戶的問題。用戶收到消息“發現重復”并收到錯誤“STATUS_CERTIFICATE_MAPPING_NOT_UNIQUE”。
解決了在使用帶有TLS協議的客戶端身份驗證證書時應用程序處理泄漏的問題。在應用程序代碼中的DeleteSecurityContext調用之前發生FreeCredentialsHandle調用時,會發生此問題。
解決svchost.exe(netsvcs和IP Helper Service)上的內存泄漏問題。
解決由于Hyper-V虛擬硬盤(VHDX)擴展而耗盡群集共享卷(CSV)上的存儲空間的問題。因此,虛擬機(VM)可能會繼續將數據寫入其磁盤,直至其損壞或停止工作。VM可能還會重新啟動,然后繼續寫入數據,直到發生損壞。
解決導致只讀域控制器(RODC)升級失敗的問題。如果定義了應用程序分區,則可能會發生這種情況,但DNS名稱解析失敗并顯示“名稱錯誤”。錯誤是“在提升只讀域控制器時,無法找到預期的狀態對象”和“有更多數據可用”(錯誤代碼234)。
解決Active Directory聯合身份驗證服務(ADFS)Extranet智能鎖定(ESL)和備用登錄ID之間的互操作問題。啟用備用登錄ID后,對AD FS Powershell cmdlet,Get-AdfsAccountActivity和Reset-AdfsAccountLockout的調用將返回“未找到帳戶”錯誤。調用Set-AdfsAccountActivity時,將添加新條目,而不是編輯現有條目。
解決日本日歷中十年視圖導航的問題。當用戶嘗試從當前時代進入下一個時代時,導航無法正常工作。
解決了導致遠程桌面服務網關在正常運行12到24小時后在負載平衡方案中無法有效工作的問題。
解決了使用多個Windows Server 2016 Hyper-V群集時出現的問題。日志中顯示以下事件:“群集共享卷'CSVName'('CSVName')由于'STATUS_USER_SESSION_DELETED(c0000203)'而進入暫停狀態。所有I / O都將暫時排隊,直到重新建立卷的路徑為止。“
解決可能導致創建單個節點群集或向群集添加更多節點以間歇性失敗的問題。
解決了在耗盡節點后重新啟動節點時出現的問題。事件ID 5120出現在日志中,帶有“STATUS_IO_TIMEOUT c00000b5”消息。這可能會減慢或停止對VM的輸入和輸出(I / O),有時節點可能會退出群集成員資格。
解決了2018年7月10日和2018年8月14日補丁之后未在.NET Framework 4.7.1上正確加載System.Security.Cryptography.Algorithms引用的問題。
解決了由于TaskCanceledException而導致系統在某些Windows Presentation Foundation(WPF)應用程序關閉期間停止工作的問題。在Application.Run函數返回值之后,易受此問題影響的應用程序會執行涉及弱事件或數據綁定的工作。
解決臨時文件和某些防病毒掃描程序中的競爭條件,導致.NET Framework應用程序停止工作。錯誤消息是“進程無法訪問文件”。
更新.NET Framework對日期中第一年日語日期格式的支持。當格式模式為“y?”時,年份格式將使用符號?并且不使用年份編號1.此外,.NET Framework將支持包含?的日期。
更新委內瑞拉貨幣信息。這對“es-VE”的影響如下:
貨幣符號是“Bs.S”。
英文貨幣名稱為“BolívarSoberano”。
當地貨幣名稱為“bolívarsooberano”。
國際貨幣代碼是“VES”。
解決了在Windows Server 2016群集中創建單個節點后,可能導致節點添加間歇性失敗的問題。錯誤代碼為“0x0000001e”。
解決可能導致具有子窗口的應用程序停止處理鼠標輸入的問題。當精確觸摸板觸發WM_MOUSEWHEEL事件時,會發生此問題。