asm區塊鏈
1. 度宇宙的邀請碼
最新3UA6NW
2. EXIN是什麼樣的認證機構,權威性如何
EXIN是一家專注於面向職業從業者的國際知名認證機構。EXIN是國際信息科學考試學會(Exam Institute of Information Science)的簡稱。1984年EXIN由荷蘭政府-經濟事務部創辦,目前從荷蘭政府部門獨立成立了EXIN基金會。EXIN在八十年代倡導自動化,九十年代推廣計算機化,2000年通過IT服務管理最佳實踐在全球推廣信息化。EXIN作為全球IT服務管理-ITIL的創始認證機構,持有EXIN認證的IT管理人才遍布全球世界五百強企業。 來自全球165多個國家和地區,累計近三百萬的ICT職業人士已經獲得了EXIN頒發的資格證書。
2018年作為國際IT管理領域的知名認證和人才鑒定機構,EXIN攜手英國計算機學會等多家權威組織發起了國際數字化能力基金會-IFDC (International Foundation of Digital Competence) 並發布了全球數字化服務管理體系-VeriSM。目前已覆蓋數字化轉型與創新管理認證如數字轉型官-Digital Transformation Officer - DTO」其中包括VeriSM、人工智慧AI、物聯網IoT、區塊鏈 Block Chain、雲計算 Cloud Computing 和大數據 Big Data。此外,還包含服務集成管理SIAM、DevOps,敏捷開發 Agile Scrum、精益IT、IT服務管理ISO/IEC20000、數據中心管理、基於歐盟數據隱私保護條例GDPR隱私保護的數據保護官- Data Protection Officer- DPO」、信息安全ISO27001、IT資產管理、商業分析、軟體測試、綠色IT、OpenStack、安全編程、應用管理等類別。
3. 幫忙說一下集成電路中的各種標語
Absolute Section(絕對段)
具備不可被鏈接器改變的固定(絕對)地址的段。
Access RAM (存取RAM,僅限PIC18CXXX系列器件)
這是數據存儲器RAM中的一個區間,無論目前所選的存儲體為何均可對其進行訪問。有了它,即可通過指令訪問特殊功能寄存器而無須改變所選存儲體。存取RAM還包括一些通用寄存器(GPR)。它對於在上下文切換期間(如中斷期間)保存所需變數很有用處。當用於引用PIC18CXXX器件時,存取 RAM指無論存儲體選擇位(BSR)設置值為何,均允許存取的特殊通用寄存器。
Acquisition Time (TACQ,採集時間)
該時間與模擬數字(A/D)轉換器有關。它是PIC18CXXX A/D上的保持電容充電到模擬輸入電壓電平時的時間。』當GO位置1時,模擬輸入與保持電容斷開,A/D轉換開始。
A/D
指的是模擬數字轉換器。見「Analog-to-Digital (A/D,模擬數字轉換)」的說明。
ALU
算術邏輯單元。器件上負責數學(加、減…)、邏輯(與、或…)和移位運算的邏輯單元。
Analog(模擬)
指通過將不同頻率或幅值的信號疊加到給定頻率的載波上進行電子傳輸的過程。
Analog-to-Digital (A/D,模擬數字轉換)
將一個模擬輸入電壓轉換到與之成正比的數字值的過程。
匯編語言
將二進制機器碼描述成可讀形式的符號語言。
AUSART
可定址通用同步非同步收發器。該模塊可作為一個全雙工非同步通訊口運行,也可作為一個半雙工同步通訊口運行。當運行在非同步模式下時,USART可與一台PC的串列埠連接。
Alphanumeric(字母數字元)
字母數字元包括字母和0到9的數字。
Application(應用)
用戶開發的一整套軟硬體結合體,通常是一個由PICmicro®單片機控制的產品。
Assemble(匯編)
匯編器所做的事。見assembler(匯編器)。
Assembler(匯編器)
一種將用戶的匯編源代碼(.asm)譯成機器碼的語言工具。MPASM™是Microchip的匯編器。
Assembly(匯編語言)
最終由機器語言取代的編程語言。機器語言完全由數字組成,人們幾乎無法識別和讀寫。匯編語言與機器語言的結構和命令集相同,但允許程序員使用名稱(指令)取代數字進行編程。
Assigned Section(賦值段)
在鏈接器命令文件中賦值到目標存儲器區塊的段。鏈接器將賦值段分配給特定的目標存儲器塊。
Bank(存儲體)
是一種對數據存儲器定址的方法。由於增強型器件具備8位直接定址功能,指令可定址到256位元組。為了使器件能具備多個數據存儲器,將數據存儲器分區為相鄰的存儲體,每個存儲體包含256位元組的數據。要選擇所需的存儲體,需對存儲體選擇寄存器(BSR)進行正確配置。共可實現16個存儲體。
Baud(波特)
通常用它來描述串列埠的通訊速度的快慢。與每秒位速(bps)相當。
BCD
見「Binary Coded Decimal (BCD,二進制碼十進制小數)」中的說明。
Binary Coded Decimal (BCD,二進制碼十進制小數)
其每4位表示一個0-9的十進制數。通常一個位元組包含0-99的兩位十進制數。
BOR
見「Brown-out Reset (BOR,掉電復位)」中的說明。
Brown-out(掉電)
當電源電壓短時跌落到規定最小工作電壓以下的情況。當電路中負載增加時可使系統/器件的電壓下降,而導致這種情況的發生。
Brown-out Reset (BOR,掉電復位)
當電源電壓跌落到規定電壓范圍以下時,迫使器件進入復位狀態的電路。有些器件具備內部BOR電路,而其它器件則需要外部電路才可產生掉電復位。
Bus width(匯流排寬度)
這是匯流排可運載信息的位數。對數據存儲器來說,匯流排寬度為8位。對增強型器件,程序存儲器匯流排寬度為16位。
Breakpoint – Hardware(斷點 – 硬體)
一種執行後會導致程序暫停的事件。
Breakpoint – Software(斷點 – 軟體)
一個執行固件後程序暫停的地址。通常由一個特殊的斷點操作符得到。
Build(重編譯)
對一個應用的源代碼進行重新編譯的功能。
C
一種高級編程語言,可用於為PICmicro® MCU,特別是高端器件系列產生代碼。
Calibration Memory(校準存儲器)
用於保存PICmicro®單片機板上RC振盪器校準值的特殊功能寄存器。
CAN
控制器區域網。一種針對汽車和工業應用的外設介面。
Capture(捕捉)
CCP模塊的一種功能,當預定事件發生時,定時器/計數器的值被「捕捉」到保持寄存器模塊中。
Capture Register(捕捉寄存器)
是一種16位寄存器,當捕捉事件發生時將TMR1寄存器中的16位值裝入該寄存器。
CCP
捕捉、比較和脈寬調制(PWM)。CCP模塊可配置作為輸入捕捉、定時器比較或PWM輸出運行。
COFF
通用目標文件格式。一種由MPLINK™ LINKER鏈接器生成的包含機器碼和調試信息的中間文件格式。
Command Line Interface(命令行界面)
命令行界面指的是在DOS下執行一條帶選項的命令。執行MPASM™ 匯編器和任一命令行選項或文件名將調用該匯編器。當命令行選項預設時,將執行默認輸入界面。
Common RAM(共用RAM)
是數據存儲器RAM上在所有存儲體中地址相同的區。該通用RAM可在70h - 7Fh(含)的地址間實現。它對於上下文轉換期間(如中斷期間)的保存所需變數是很有用處的。
Compare(比較)
CCP模塊的功能之一,當定時器的寄存器值與比較寄存器中的值相符時器件將執行一個動作。
Compare Register(比較寄存器)
是一種16位寄存器,包含一個與16位TMR1寄存器相比較的值。當計數器與比較寄存器中的內容相符時,比較功能模塊將被觸發。
Compile(編譯)
編譯器所做的事。見「compiler(編譯器)」。
Compiler(編譯器)
一種將用戶的C語言源代碼譯成機器碼的語言工具。MPLAB® C17和MPLAB® C18均為Microchip公司的C編譯器,分別用於PIC17CXXX和PIC18CXXX器件的編譯。
Configuration Bits(配置位)
用於編譯設置PICmicro®單片機運行模式的位。配置位不一定需要預編程。對於模擬器和模擬器,可通過Options > Development Mode對話框設置;對於編程器可在 _ _ CONFIG MPASM™指令中設置。
Configuration Word(配置字)
這是非易失性存儲器位置,它規定了器件運行的一些特徵(如振盪模式,WTD的使能,起動定時器的使能)。這些特徵均可在器件編程時進行規定。對於EPROM存儲器,只要某位的值為「1」,均可在日後編程為「0」;如果值為「0」,必須先擦除器件後再編程為「1」。
Conversion Time (Tconv,轉換時間)
該時間與模擬數字(A/D)轉換器相關。這是PIC18CXXX A/D轉換器將保持電容上的模擬電平轉換成數字值所需的時間。
CPU
中央處理單元。將指令解碼並決定程序執行所需的操作數並負責運算。將數學運算、邏輯運算和移位運算傳送到ALU。
D/A
見「Digital to Analog(數字模擬轉換)」的說明。
DAC
數字模擬轉換器。
Data Bus(數據匯流排)
將數據傳送到數據存儲器或從數據存儲器傳送回來的匯流排。
Data EEPROM(數據EEPROM)
數據電可擦除可編程只讀存儲器。該存儲器可由CPU編程和再編程,以確保在掉電時關鍵值/關鍵變數被保存在非易失性存儲器中。
Data Memory(數據存儲器)
在數據匯流排上的存儲器。該存儲器是易失的(SRAM),包含特殊功能寄存器和通用寄存器。
Data Memory(數據存儲器)
被模擬的PICmicro®器件上RAM的通用文件寄存器(GPR)。文件寄存器窗口顯示數據存儲器。
Digital-to-Analog(數字模擬轉換)
從數字值轉換到與之成正比的模擬電壓的過程。
Direct Addressing(直接定址)
指令中包含數據存儲器地址的情況。執行這種類型的指令將總是訪問嵌入地址的數據。
Directives(指令)
指令通過告知MPASM™匯編器如何處理助記符、定義數據、格式和列表文件來對匯編器操作進行控制。指令簡化了編碼並可根據特殊要求對輸出進行定製。
Download(下載)
下載是將數據從PC主機上傳送到另一台設備,如模擬器、編程器或目標板的過程。
EEPROM
電可擦除可編程只讀存儲器。是一種電可擦除的特殊類型的PROM。數據被逐個位元組地擦除。即使在電源被切斷時,EEPROM也會將其中的內容保存下來。
Embedded System(嵌入式系統)
內建或集成到器件上的一種特殊功能計算機。用於控制、監控和協助運行。所有嵌入式系統均包含計算機,其中最簡單的一種為單片微處理器(「晶元」)。可將微處理器進行設計以添加某種功能的ROM軟體(「固件」),如PC的ROM BIOS。(定義來源於ChipCenter.com)
Emulation(模擬)
開發時執行安裝在模擬存儲器中的軟體,如同執行安裝在單片機中的固件一樣。
Emulation Memory(模擬存儲器)
模擬器中的程序存儲器。
Emulator(模擬器)
進行模擬的硬體。
Emulator System(模擬系統)
MPLAB® ICE模擬系統包含線夾、處理器模塊、器件適配器、電纜以及MPLAB®軟體。PICMASTER®模擬系統包含線夾、針對不同器件的不同探針、電纜以及MPLAB®軟體。
EPROM
電可編程只讀存儲器。該存儲器能夠在線編程。要擦除它必須將其置於紫外線下。
Event(事件)
說明一個匯流排循環,包括地址、數據、通過次數、外部輸入、循環類型(取指,R/W)及時間戳等。用事件來描述觸發器和斷點。
Executable Code(可執行代碼)
見Hex Code(十六進制代碼)。
Export(引出)
將數據以標准格式從MPLAB® IDE中傳送出來。
Expressions(表達式)
表達式用於MPASM™匯編器源代碼行的操作數欄位,包含常量、符號或由算術運算符分隔的常量和符號的任意組合。每個常量或符號均前置正負號以表示表達式的正負。
External RAM (外部RAM,僅限PIC17CXXX和PIC18CXXX器件)
非片上讀/寫存儲器。
EXTRC
外部阻容(RC)。有些器件具備允許來自外部RC時鍾的器件振盪器選項。與一些器件上的RC模式相同。
Flash(閃速)
EEPROM的一種類型,數據被逐個區塊擦除而不是逐個位元組擦除。
FLASH Memory(快閃記憶體)
這種存儲器能夠在線編程和擦除。存儲器的編程技術在功能上與EEPROM存儲器幾乎相同。
FOSC
器件振盪器的頻率。
File Registers(文件寄存器)
片上通用和特殊功能寄存器。
GIO
通用輸入/輸出。
GPIO
通用輸入/輸出。
GPR
通用寄存器(RAM)。可用於存儲動態程序變數的那部分數據存儲器。
Harvard Architecture(哈佛結構)
在哈佛結構中,程序存儲器和數據存儲器是相互隔離的。它使對數據存儲器和程序存儲器的訪問可同時進行,提高了器件的性能。PICmicro®器件採用哈佛結構。
Hex Code(十六進制代碼)
將源代碼匯編或編譯成標准十六進制格式代碼的可執行指令,也稱可執行碼或機器碼。十六進制代碼被保存在hex file(十六進制文件)中。
Hex File(十六進制文件)
一種ASCII文件,包含適合進行器件編程的十六進制地址和值(十六進制代碼)。本格式可由器件編程器讀取。
High Level Language(高級語言)
與匯編代碼相比,用於編寫程序的高級語言對處理器進行了更高水平的提取。高級語言(如C語言)利用編譯器將語句譯成目標處理器能夠處理的機器指令。
Holding Capacitor(保持電容)
這是模擬數字(A/D)模塊中的一個電容,它在轉換開始時「保持」模擬輸入電平。信號採集期間,保持電容被模擬輸入引腳充電/放電。轉換開始時,保持電容從模擬輸入端斷開並將該電壓「保持」以進行A/D轉換。
HS (High Speed,高速)
高速。是器件振盪模式的一種。應調整振盪電路以支持高頻運行。目前它支持4 MHz至25 MHz的運行頻率。
I2C™
內部互聯電路。這是一種雙線通訊介面。它是「SSP」和「MSSP」模塊模式的特性之一。
ICD
在線調試器。MPLAB® ICD是Microchip公司針對PIC16F87X器件的在線調試器。MPLAB® ICD在MPLAB® IDE下使用。
ICE
在線模擬器。MPLAB® ICE是Mcrochip公司的在線模擬器,在MPLAB® IDE下使用。
IDE
集成開發環境。是一種具備多種功能的固件開發應用程序。MPLAB® IDE在Windows®應用程序上集成了編譯器、匯編器、項目管理器、編輯器、調試器、模擬器以及一系列其它工具。進行應用開發的用戶可無須離開 MPLAB® IDE桌面即可編寫代碼、編譯、調試和測試應用。
Identifier(標識符)
函數或變數的名稱。
Import(引入)
將數據從外部信號源傳送進MPLAB® IDE,如數據可來自一個十六進制文件。
Indirect Addressing(間接定址)
當指令中不包含數據存儲器地址時,指令在INDF地址執行,從而使數據存儲器地址成為FSR寄存器中的值。指令的執行將總是訪問FSR寄存器所指向地址的數據。
Initialized Data(初始數據)
由初始值定義的數據。在C語言中,int myVar=5; 定義的變數將駐留在初始數據區中。
Instruction Bus(指令匯流排)
用於將指令字從程序存儲器傳送進CPU的匯流排。
Instruction Cycle(指令周期)
指令執行的事件。有四種事件,分別描述為:解碼,讀取,執行和寫入。指令並不同時執行所有事件。欲了解指令周期期間的操作,請查看每條指令的有關說明。四個外部時鍾(TOSC)組成一個指令周期(TCY)。
Instruction Fetch(取指令)
哈佛結構下,欲執行一條指令時,下一個程序存儲器中的地址將被「取出」,並在當前指令執行完畢時立即被解碼。
Interrupt(中斷)
向CPU發出的信號,迫使程序流程進入中斷矢量地址(程序存儲器中的04h)。程序流程改變前,程序計數器中的內容被迫進入硬體堆棧,從而使程序執行返回中斷點。
INTRC
內部阻容(RC)。有些器件具備允許時鍾來自內部RC電路的器件振盪器選項。
KEELOQ®
KEELOQ®是一種專利跳碼技術。Microchip的KEELOQ®產品為單向傳輸提供了一種數據加密方法,即使按下同一按鈕發送的代碼也各不相同。
LCD
液晶顯示器。用於為系統提供狀態顯示。它可能需要定製LCD玻璃的規格。
LED
發光二極體。用於為系統提供狀態顯示。
Librarian(庫管理員)
一種創建和操縱庫的語言工具。MPLIB™是Microchip的庫管理員。
4. spring源碼怎麼讀
在我們的生活之中,有形形色色的萬物(Object),有飛機,有汽車,有輪船,還有我這個滄海一粟的java講師。
試問:了解飛機底層架構的人,就一定能把飛機開好嗎?精通汽車的構造和底層原理的人,就保證開車不出事故嗎?或者反過來問,一個多年的開計程車的老司機,技術非常嫻熟,但是你問他汽車的架構和底層原理,你覺得有多少老司機能准確的答出來?
那就對了,了解了,讀懂了spring底層源碼的程序員,我們並不能保證他就是一個好程序員,我心中的一個好的程序員是要能夠提出解決方案的程序員,就好比清華北大確實只是個過程,最後的目的,是為國家為人民做出奉獻才是我們活著的價值。所以說我並不看好去閱讀spring源碼這個行為。聞道有先後,術業有專攻,我們不是提供底層技術的人!絕大多數的程序員,我以為正確的做法是站在巨人的肩膀上,把前輩留下來的精髓發揚光大才是正道,簡而言之,把怎麼用,和為什麼要這么用學好才是大多數程序員學習技術的關鍵。就好比去學駕照的時候,教練只需要關心你是否會開車,是否遵守交通規則,並不關心你是否了解汽車是如何在路上跑起來的。
一個人的精力和時間都是有限的,分細了來說,開發者就是技術的使用者,重點在於如何正確熟練的使用,而不是一昧地去關心底層原理,如果要完全讀懂spring源碼,首先,英語就得很厲害吧,其次,得花多少時間?就算讀懂了,那收獲和付出也不成正比,大把大把的時間為何不花在java更多,更高級,更有意義的技術上呢?筆者此話並不是說spring源碼讀了沒用,只是讓我們的時間更有價值,例如分布式微服務,區塊鏈技術,大數據,python,作為新時代的IT佼佼者,我們是否應該隨著時代的腳步,迎接嶄新的未來?我奉勸大多數人,不必去看spring源碼,除非你確實感興趣作為技術研究,這樣是可以的。一個正常的工作者,是不建議花寶貴的時間去看的,那學生就更不應該去看了。此話怎講?我以為,學生應以學業為重,士不可不弘毅,任重而道遠,首先應該擴展其知識的廣度,和技術的嫻熟使用,再培養學生獨立解決問題的能力,溝通協作的能力,最後才考慮技術的深度。
筆者在多年前也被面試過很多很多問題,但是從來沒有一個面試官會問spring底層源碼,曾經阿里巴巴的架構師也面試過我,直到後來,我成為了面試官,當我去面試別人的時候,我也不會去問spring源碼這些東西,因為99.9%企業招人進來,是要做事實的,不是讓你去研究一個技術,絕大多數更在乎的是利用現有的技術,去完成一些項目功能。除了世界上極少數著名的企業他們需要技術研究員,才對這些有所要求,那要招這類人才,估計至少也是名校研究生以上吧,所以普通程序開發者,我覺得學好技術的正確與熟練使用,才是重中之重!
不宜本末倒置,不宜好高騖遠。筆者從事Java行業以來,真要說全階段全程全棧都精通的人,應屬風毛菱角,故此,更應讓所學知識運籌帷幄,舉一反三,千里爐火,萬里純青。以上篇幅在說我對閱讀spring源碼的一些強烈建議,最終結論,是不看、不讀就此作罷。
那有的感興趣的人非要閱讀呢?
Ok,其實閱讀spring源碼並不算很難。
首先,應該去官網spring.io閱讀寫spring框架的理念,就好比讀一本書,要閱讀這本書的綱要,要明白為什麼要設計spring架構。
然後,應該分模塊閱讀,先從核心模塊開始閱讀:如:
IoC Container, Events, Resources, i18n, Validation, Data Binding, Type Conversion, SpEL, AOP.
那麼在閱讀的時候,英文能力差的話,可以使用翻譯軟體翻譯成中文閱讀,畢竟不是每個程序員英語都很棒,畢竟中國人看中國字更容易去理解。當然,有些翻譯過來的並不準確,這個時候可以利用網路,去查看那段不理解的地方。
然後,把spring的jar包下載下來,利用IDEA打開,可以使用download資源,會發現,每個方法上面都會有詳細的英文注釋。一邊看官方的說明,一邊查看代碼的編寫,不難發現,非常多的代碼寫得很精闢,所以十分考驗一個程序員的java基本功,特別是反射,JDK\CGLIB代理,和java常用的設計模式等。
5. 學編程月薪多少
時間就是金錢。
對於快速發展的互聯網行業,這句話更是金科玉律。
一個項目,如果兩家公司同時想到,兩家公司同時研發,那麼誰能更快更好的研發出來,誰就能盈利。
在這個快節奏的時代,產品更新迭代甚至都能以分鍾計算,技術雖然沒有那麼誇張,但是新技術的研發學習應用也是在不斷的縮短時間。
而適合的技術人才,對於很多公司來說是至關重要的存在。
互聯網的發展,讓IT 職業人才的缺口越來越大。據保守估計,目前中國市場對 IT 人才的需求每年超過 30 萬人,但國內高校計算機專業培養出來的學生僅為 16萬人,遠遠不能滿足市場的需要。雖然各家企業開出更高的職位待遇,但是仍然招不到合適的技術人員。
根據國家統計局去年公布的行業工資數據顯示,IT技術人員從業者平均年薪已經高達11萬左右。而對於科技公司的程序員來說,只會比這個更高。更別說國內互聯網巨頭BAT,年薪30萬的程序員更是大批存在。
所以,如此高薪的就業市場讓更多的人想要做程序員,自然很多人就走上了學編程的道路。
那麼,那些學編程的人現在過的怎麼樣呢?是不是真的拿到了期望中的高薪呢?
網友A:
我本科學校211,但我學的專業不太熱門。我本身對技術很感興趣,就自己在網上找了WEB前端教程學習,成功轉行。做我那個專業的話,剛畢業工資也就4000,還是2010年的北京。現在我工資已經年薪30萬+,當然中間有跳槽幾次。
網友B:
大學專業不是喜歡的,出來找工作工資也不高。就專門去學了測試,現在在一家游戲公司做測試,我剛畢業兩年,年薪16萬,稅後。
網友C:
我本來就是學計算機專業的,但是我的學校不是特別有名的那種,大家都知道大學教育學出來的東西肯定跟企業的要求有很大的差距。大四下半年,我就自己在網上找教程看,然後加了一些學習群,遇見不懂的問題就在這些學習群問,現在畢業的第一份工作,月薪過萬。
網友D:
我弟弟,學習不好,高中畢業之後上了一個職業學校。連大專都不算吧。畢業之後找工作都找不到,我爸就花大價錢讓他去IT培訓班,學的Java。我弟算是很聰明的那種孩子,半年之後在我們三線城市找了一份工作,現在收入7千多,在貴陽。別人我不知道,但是我爸還挺高興的,認為錢花的值了。
上面這幾個人的例子算是很成功的了,當然也有失敗的例子。
網友E:
親戚家的孩子,不好好上學,職高畢業連20歲都不到。父母覺得他應該去學點東西,現在IT培訓不是很火嗎,就給孩子報了班。結果孩子雖然去了,但是也不怎麼好好學,不僅沒學到東西,錢也浪費了。工作更是沒著落。
網友F:
我的同事,一個三十多歲上有老下有小的男人,覺得我們現在的工作賺錢少,不夠花,媳婦兒還想要二胎。於是想轉行做IT,去報了培訓班。結果學了幾個月出來,也沒什麼變化,不知道是不是年級大了沒什麼學習的精力,而且家庭責任重,不能像年輕的程序員那樣拚命加班出差。導致現在不上不下。
看了上面的一些網友的真是案例,不知道你是怎麼覺得的。
學編程這件事情還是要理性的看待,從自身的客觀條件出發,看看自己是不是適合。
在自己做出選擇之前,要做好了付出足夠努力的准備,畢竟想到和得到之間還有一個做到,天上沒有掉餡餅的, 所有的得到背後都是艱苦奮斗的歷程。
6. 我電腦物理內存寫的是2G,但是系統休眠文件卻只有1.48G,這是為什麼
更全面的回答 求採納
發這份筆記時,比較惶恐,因為連我自己都覺得,這個東西沒用。但是事實上,在很多偏門或機密的領域里,它仍然是非常有價值的。鑒於國內這方面資料比較少,所以寫了一篇筆記,與大家共享。
Analyze Hibernation File
Introction
What』s Hibernation File?
Hibernation File也就是系統的休眠文件Hiberfil.sys,位於系統卷的根目錄下。windows在系統休眠時,將物理內存中的數據(包括系統運行時的狀態數據)mp到Hiberfil.sys,並生成一個有效的文件頭。下次系統開機的時候,利用hiberfil.sys文件中的數據恢復系統。
How to generate a valid Hiberfil.sys?
從用戶的角度來說,系統停機時,按下休眠按鈕,則會自動生成一個有效的Hiberfil.sys。
從電源管理器的角度來說,只有當系統電源狀態從S0àS4的時候,才會生成一個有效的休眠文件。
註:當系統正常運行時,電源狀態為S0;完全關閉時,電源狀態S5;休眠狀態時,電源狀態S4,此時只有電源電路和喚醒電路才有點滴電流;中間的幾個狀態S1,S2,S3,都是不同程度的睡眠狀態。
從S4àS0的過程,也就是利用Hiberfil.sys恢復系統的過程。
Valuation of Hibernation File
It is quick and easy
恢復系統比重啟系統要快。不解釋(除特殊情況)。
A new method to mp physical memory
利用hibernation技術mp系統物理內存中的數據。這些數據包括處理器狀態,當前EIP, IDT table, GDT table, SSDT table,當前狀態的可執行代碼和數據…
利用這些數據可以分析系統狀態。
Leak Information?
Yes。正常情況下,利用Hiberfil.sys恢復系統,雖然恢復後會清除掉Hiberfil的Header數據(one page),使之無效,但是Header之後的數據還會保留。利用外部工具,構造一個Header,就可以讀取該Hiberfil.sys的所有信息了。
Defensive uses
kernel –land malwares detection
分析hibernation file, 可以通過檢查SSDT, IDT, GDT表的完整性來判斷系統是否被修改。雖然在內核層有了更為輕量級的方法去檢測系統關鍵表的完整性,但是存在anti對抗問題,hibernation提供了一種終極檢測方式。
根據hibernation恢復原理,不在hibernation file中的代碼,將不會被恢復執行。基於此,可以對抗SMM rootkit。(不做介紹)
Offensive uses
可以獲取敏感數據,如:password, keys.
修改hibernation file, 提高某個進程的執行許可權;繞過系統登錄密碼…
Hibernation file internals
Headline of hibernation process
當磁碟被掛起時(S0àS4),Windows內核(ntoskrnl.exe)執行體創建一個hibernation file,並將物理內存中的數據用LZ77演算法壓縮後,寫入文件。
系統恢復時(S4àS0),OSLoader.exe讀取hibernation file,載入解壓後的數據到物理內存中,使系統以一種快捷方式恢復到休眠時的狀態。
註:恢復過程的分析,見appendix 1。
Hibernation file structure
先直觀的看下文件結構圖:(左側,域列表,是文件結構的組成域)
format.jpg下載此附件需要消耗2Kx,下載中會自動扣除。
File Header
位於休眠文件的第一頁(0x1000 bytes)數據空間。該結構PO_MEMORY_IMAGE由內核調試符號導出。結構中主要包含了休眠文件的創建日期,版本號,校驗和,有效標志,物理頁數量等信息。
註:用休眠文件恢復系統時,只有第一頁數據被清0,也就是file header,其他數據保留不變。
FreeMap Page
包含一個ulong數組,保存了空閑內存頁的映射信息。
Processor State
處理器狀態,由內核函數KiSaveProcessorControlState保存。包括控制寄存器CRX,GDT, IDT, EIP…
結構定義如下:
typedef struct _KPROCESSOR_STATE32
{
CONTEXT ContextFrame; //
KSPECIAL_REGISTERS SpecialRegisters; //
} KPROCESSOR_STATE32, *PKPROCESSOR_STATE32;
註:從vista版本以後,欄位2和3的位置就交換過來了。
Memory Range Array
存儲物理內存頁的壓縮數據。
typedef struct _MEMORY_RANGE_ARRAY
{
MEMORY_RANGE_ARRAY_LINK MemArrayLink;
MEMORY_RANGE_ARRAY_RANGE MemArrayRange[MAX_ARRAY_ENTRY];
} MEMORY_RANGE_ARRAY, *PMEMORY_RANGE_ARRAY;
欄位MemArrayLink作為鏈接表指針,將多個這樣的結構鏈接維護起來;
欄位MemArrayRange指向數據區,最多包含255個入口。這也就是為什麼要存在一個指向下一個MEMORY_RANGE_ARRAY結構的指針MemArrayLink,因為當休眠文件很大的時候,一個MEMORY_RANGE_ARRAY存儲不了所有數據。
結構MEMORY_RANGE_ARRAY_RANGE定義如下:
typedef struct _MEMORY_RANGE_ARRAY_RANGE
{
ULONG PageNo; // ???
ULONG StartPage; // Block start (physical address)
ULONG EndPage; // Block stop (physical address)
ULONG CheckSum; // Always zero, but used under Windows 2000.
} MEMORY_RANGE_ARRAY_RANGE, *PMEMORY_RANGE_ARRAY_RANGE;
指定了頁開始地址和頁結束地址,在這些地址范圍內的數據都是經過壓縮演算法來壓縮後存儲的,這個結構所對應的整塊數據就是一個壓縮塊PageCompressedData,壓縮快的起始部分是一個結構體,如下:
struct IMAGE_XPRESS_HEADER
{
CHAR Signature[8] = 81h, 81h, "xpress";
BYTE UncompressedPages = 15;
UINT32 CompressedSize;
BYTE Reserved[19] = 0;
};
也就是說,壓縮塊的標識是:\x81\x81xpress;之後就是壓縮數據了。
註:每個壓縮快所對應的解壓後的塊大小為64KB(0x10 pages)。
compression algorithm
This algorithm has been publicly documented since recent Microsoft Interoperability initiative (February 2008)
壓縮塊演算法使用LZ77+DIRECT2;
LZ77用於壓縮內存數據,DIRECT2對位元組的位置進行編碼和解碼。
Project and Application
Sandman Project
該開源項目的主要特點是定義了休眠文件的文件結構,並給出了解析休眠文件的代碼。
不過,這份代碼中存在問題。在虛擬地址轉換成物理地址時,作者將頁面映射的PAE部分解析錯了。
如果開啟了PAE頁面映射機制(實事上,幾乎所有多核計算機都開啟了PAE),那麼MMU將會用三級表來實現地址轉譯,分別是:頁目錄指針表,頁目錄索引,頁表索引,頁位元組偏移,其中前三項都是8位元組長,而作者解析時將其作為4位元組處理了。
具體改法:在mm.c文件à MmGetPhysicalAddress函數中,將處理PAE的偏移,改為8;
註:4KB分頁時,地址轉譯只需二級表,頁目錄索引,頁表索引,每項4位元組長。
Tiamo NTLDR Project
作者Tiamo基本實現了一個完整的NTLDR,可以替換系統NTLDR,主要包括了利用休眠文件hiberfil.sys恢復系統的C++實現。不過我沒有測試過可行性。
項目包括兩部分:
16位實模式代碼;
32位模式代碼,即OsLoader.exe,是windows真正的32位入口程序。作者這部分代碼參考了NT4代碼,但是NT4代碼中並沒有實現恢復hiberfil的代碼,估計作者是通過逆向寫的。
Useful application
利用Sandman,開發了若干免費小工具,一般開發人員用不上。
可訪問:http://www.moonsols.com
解析hiberfil.sys,獲取系統版本號,休眠文件的創建時間,從休眠文件mp物理內存內容(見附件)。
ANTI SMM Rootkit應用;
其他方面,取證分析,以及未知的應用…
APPENDIX
簡述用休眠文件恢復系統的過程
開機過程中,BIOS代碼首先獲得控制權,執行完硬體檢測後跳轉到MBR,MBR代碼部分主要讀取分區表信息,然後將控制權交給系統卷的引導扇區DBR,DBR執行一些初始化後,讀取文件NTLDR,NTLDR中的16位模式代碼開始執行,同樣進行一些必要的初始化工作,然後將處理器切換到32位保護模式。
控制權交給osloader.exe, 此時處理器雖然已經工作在保護模式下,但是它的虛擬地址轉譯機制尚未開啟,所以,處理器仍然直接使用物理地址。
Osloader 在入口函數NtProcessStartup里,調用全局初始化內存函數:
DoGlobalInitialization()-> InitializeMemorySubsystem() ->
實現的功能是: 用一個內存描述符數組把每一段內存的大小和用途記錄下來,然後構造頁目錄和頁表,使得16M一下的內存能夠通過頁面映射(paging)機制進行訪問,在loader階段是不使用高於16M以上的物理內存的,在設置好頁目錄寄存器,並打開頁面映射機制。
之後,osloader 繼續執行其他的初始化工作,包括IO設備的初始化。
分配PCR的頁面-> 分配TSS的頁面-> 初始化內存描述符-> 初始化IO系統BlIoInitialize。
接下來判斷控制啟動的方式。
函數:BlStartup(BootPartitionName);
過程大概這樣:打開啟動分區,以便載入驅動;初始化屏幕; 讀取hiberfil.sys,如果是一個有效的休眠文件,則系統以hiberfil.sys方式恢復系統。如果不是,打開boot.ini文件,並顯示一個引導選擇菜單。如果boot.ini只包含一個引導選項,那麼,此菜單不顯示,而是立即應用該引導選項。
如果檢測到hiberfil.sys有效,osloader將控制權交給一段能恢復系統的代碼。大致流程如下:
打開hiberfil,不成功則返回-->成功則繼續恢復 --> 分配頁面緩沖-->解析頭文件,判斷image signature,有三種標志,分別處理,如果判斷標志出錯,就直接返回-->進行一些其他的校驗工作->接下來分配PTE,讀取內存映射頁面的數據-> 分配壓縮數據的緩沖->解壓縮數據到物理內存—> 再經過一系列的恢復工作-> 讀取處理器的狀態......
通過NT4代碼,分析NTLDR的工作流
boot/bootcode/mbr/i386/x86mboot.asm ->
這里執行MBR引導代碼,讀取分區表,獲得引導分區,將引導分區的第一個扇區,即DBR讀入到內存,然後將EIP調到DBR引導代碼,執行。
boot/bootcode/ntfs/i386/ntfsboot.asm ->
該函數主要用來讀取卷上的數據,主要是將ntldr讀入到內存,然後執行。(卷上的數據是根據文件系統格式存儲和管理的,所以訪問卷上的文件內容,需藉助文件系統代碼去讀。)到目前為止,程序還是在實模式下,即16-bit模式。
boot/startup/i386/su.asm ->
直接跳到 JMP RealStart,准備stack和segment,然後去執行suMain函數,該函數位於:
boot/startup/i386/main.c ->
來到了C代碼。這里實現一些初始化,包括video ,memory,foppy等。之後在回到su.asm,進行模式切換,至32-bit;
boot/lib/i386/entry.c ->
入口函數NtProcessStartup,這里,進行一些初始化,調用DoGlobalInitialization 初始化16M以下的內存,分頁機制開始啟動。又進行了一些system memory和I/O system的初始化工作後,理解調用BlStartup函數,也就是說ntldr在BlStartup函數中執行完畢後,就返回了。該函數在:
boot/bldr/i386/initx86.c ->
這個函數打開boot.ini,獲取啟動選項,繼續調用osloader.c;
\boot\bldr\osloader.c
註:NT4不支持hiberfil休眠機制,在XP以後的系統中,恢復hiberfil的過程在 BlStartup過程中被調用。
通過逆向分析NTLDR,分析hibernation file
這里只說下分析方法,省去細節。
恢復Hiberfil的工作是由osloader完成的,所以,通過逆向分析osloader.exe,可以了解恢復hiberfil的一些具體細節。
NTLDR位於系統盤根目錄下,是一個具有隱藏只讀屬性的binary系統文件,不能直接使用IDA進行分析。
NTLDR由兩個image組成,一個是16-bit下的binary image,就像是一個.com 文件;另一個是32-bit 下的PE file image,主要包含載入任務,這個PE image對應的文件就是osloader.exe。
提取osloader.exe的方法
用一個16進制編輯器(e.g. WinHex),打開NTLDR, 查找'MZ'或'PE'標志,然後從'MZ'標志開始,將剩下的hex data全部復制並粘貼到另外一個空文件,重命名為:osloader.exe。用winhex的話,會很簡單(找到'MZ'標志,ALT+1,然後拖到文件末尾,ALT+2,這樣就選中的從'MZ'到文件末尾的區塊,然後右鍵'edit'->' block'->'into a new file')。
提取出osloader之後,用IDA載入,載入的時候會提示從MS官方下載'未公開'的符號,選擇YES或NO,等待分析,可能要花2分鍾左右時間。
分析osloader.exe文件
常理來說,osloader應該是一個native app,其入口函數是:NtProcessStartup。但是IDA分析後,入口函數為DriverEntry,當成驅動程序來分析了。但是,事實上,native app本質上就是一個驅動。
接下來就是利用各種資源,找自己關注的代碼區分析了。