Time of Update: 2018-12-07
首先是在main.c中ExpInitializeExecutive函數。遍曆所有載入的模組,其中有ntoskrnl、各個驅動、nls、註冊表檔案等。找出驅動程式,依次調用LdrInitializeBootStartDriver函數。然後調用IoCreateArcNames函數,將\reactos 變為
Time of Update: 2018-12-07
1.一般的程式都是可重定位的,變數或者函數的地址,都是用相對位址記錄的。並且變數的地址在link後,可以確定相對位置,在載入後才可以確定絕對位置。一般這樣都寫成函數,用修飾符proc修飾。 2.但有時候需要寫非重定位程式,就需要用固定地址引用變數。例如需要寫一個bin檔案,然後這個bin檔案需要被載入到某個地址運行。 這時,在首地址需要寫成。這樣在編譯前,地址就已經確定了。一般用標籤,如XXX: AT&T文法 org 0x100
Time of Update: 2018-12-07
摘自ramdisk驅動程式 VOIDRamDiskQueryDebugRegParameters( IN PUNICODE_STRING RegistryPath )/*++Routine Description: This routine is called from the DriverEntry to get the debug parameters from the registry. If the registry query fails, then
Time of Update: 2018-12-07
ATA和ATAPI是廣為使用的IDE和EIDE裝置的相關標準。ATA是AT Attachment的縮寫,意思是AT電腦上的附加元件(還記得IBM PC/AT嗎?)。ATA可以使使用者方便地在PC機上串連硬碟,但有時這樣還不夠。有些使用者需要通過同樣方便的手段串連CDROM、磁帶機、MO磁碟機等裝置。ATAPI標準就是為瞭解決在IDE/EIDE介面上串連多種裝置而制定的。ATAPI是AT Attachment Packet
Time of Update: 2018-12-07
為了更好的學習reactos,特意找到了一個很早的版本,用svn取下,http://svn.reactos.org/reactos/tags/ReactOS-0.0.10/reactos帶的編譯環境裡的make版本,有點問題。例如在一級Makefile裡,調用make –C XX,會導致錯誤。 gcc版本呢3.4.5所以採用msys環境。 編譯的時候出現幾個問題,解決方案如下: 1. 修改rules.mak 將SEP := \$(EMPTY_VAR) 改為 SEP := / 2.修改tss.h
Time of Update: 2018-12-07
NTSTATUSReadWriteDisk( PDEVICE_OBJECT DeviceObject, ULONG SectorOffset, ULONG IsReadOperation, // = 0 means is a write operation otherwise is read PVOID Buffer, ULONG SectorCount, PIO_STATUS_BLOCK IoStatusBlock ){SENSE_
Time of Update: 2018-12-07
Owner Drawer 和 Custom Draw1.Owner Drawer有些控制項支援Owner Drawer屬性,如Button。如果控制項的這個屬性被設為TRUE,則程式員需要負責繪製這個控制項。這樣可以繪製與預設控制項不同的形狀,如繪製特殊形狀的Button。Owner Draw的控制項會給父對話方塊WM_DRAWITEM、WM_COMPAREITEM、WM_MEASUREITEM等訊息。2.Custom
Time of Update: 2018-12-07
最開始的是loadros.asm,它會將ntoskrnl.exe等各個模組讀入記憶體,並跳到0:901000。同時它還會初始化一個_LOADER_PARAMETER_BLOCK資料結構。typedef struct _LOADER_PARAMETER_BLOCK { ULONG Flags; ULONG MemLower; ULONG MemHigher; ULONG BootDevice; ULONG CommandLine;
Time of Update: 2018-12-07
#include <stdio.h>#include <windows.h>#include <winioctl.h>#include <ntddscsi.h>typedef struct _INQUIRYDATA{ UCHAR DeviceType:5; UCHAR DeviceTypeQualifier:3; UCHAR DeviceTypeModifier:7; UCHAR RemovableMedia:1; UCHAR
Time of Update: 2018-12-07
在atapi.sys的DriverEntry裡會調用ScsiPortInitialize。 PCI中有8個條PCI bus。在ScsiPortInitialize中對每條PCI
Time of Update: 2018-12-07
SECTIONS{ . = 0x10000; .text : { *(.text) } . = 0x8000000; .data : { *(.data) } .bss : { *(.bss) }} The first line inside the `SECTIONS' command of the above example sets the value of the special symbol `.', which is the location counter.
Time of Update: 2018-12-07
Basic Linker Script Concepts Every loadable or allocatable output section has two addresses. The first is the VMA, or virtual memory address. This is the address the section will have when the output file is run. The second is the LMA, or load
Time of Update: 2018-12-07
顯示內容分別是:中斷索引、中斷向量地址、符號表 0: kd> !idt Dumping IDT: 37:806ba78c hal!PicSpuriousService37 3d:806bbc90 hal!HalpApcInterrupt 41:806bbb04 hal!HalpDispatchInterrupt 50:806ba864 hal!HalpApicRebootService 63:8641376c VIDEOPRT!pVideoPortInterrupt
Time of Update: 2018-12-07
本來intel設計TSS的初衷是想通過這個段,來實現作業系統中多任務的切換。但據說使用這個切換任務,會佔用很多cpu的時間,並且打破cpu的流水。因而,linux和windows都沒有採用tss用作切換任務。tss還記錄著“I/O許可權位元影像”。另外tss中還記錄著0-2環的esp和ss寄存器。當外環(如ring3)進入內環(如ring0)時,會自動載入tss中內環的esp和ss。那為什麼tss沒有記錄ring3的esp和ss呢?這是因為,外環進入內環時,會將這些壓入堆棧。當從內環返回外環時,
Time of Update: 2018-12-07
資料轉送指令───────────────────────────────────────它們在存貯器和寄存器、寄存器和輸入輸出連接埠之間傳送資料.1. 通用資料傳送指令.MOV 傳送字或位元組.MOVSX 先符號擴充,再傳送.MOVZX 先零擴充,再傳送.PUSH 把字壓入堆棧.POP 把字彈出堆棧.PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次壓入堆棧.POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次彈出堆棧.PUSHAD
Time of Update: 2018-12-07
fs:[4]記錄著棧頂地址。開啟OD,點擊M按鈕,查看記憶體情況。顯示堆棧地區是0x12e000~0x12efff,大小8K。PE檔案參數SizeOfStackReserve = 100000 (1MB)SizeOfStackCommit = 1000
Time of Update: 2018-12-07
hook有很多種形式,這裡分析inline hook api這種形式的hook只針對被hook的進程,而不會影響到其他進程。例如,某個進程用到了MessageBox這個API,程式希望改變原有MessageBox這個函數的行為,可以進行這種hook。Inline hook有個幾種方式1.先執行hook函數,然後再執行原API。2.先執行原API,再執行hook函數。需要瞭解的幾個知識點:1.如果在Debug版下做實驗,需要將Link Increase功能關掉2.跳轉指令 jmp
Time of Update: 2018-12-07
被忽悠了,一直以為lea和mov指令差不多的,今天算是知道了,順便測試了下C內聯彙編的效率關於對MOV(指令組)與LEA指令的討論kanxue語錄:LEA EAX,[EBX + 4] 相當於:eax=ebx+4 ,lea指令允許使用者在一個時鐘內完成計算,速度快。ADD EBX,4; 相當於 ebx=ebx+4所不同MOV EAX,EBX + 4不合法,你可以在OD裡鍵入這句指令測試一下。csdsjkk 語錄:原則上先用mov offset,因為無論從執行效率還是編碼大小衡量,mov
Time of Update: 2018-12-07
Tree Control控制項使用此控制項一般先將“Has buttons”、"Has lines"、"Lines at root"屬性設定上。WTL、MFC等庫封裝了InsertItem函數,原理是填好了TVINSERTSTRUCT資料結構,然後向控制項發送TVM_INSERTITEM訊息。最簡單的InsertItem函數:HTREEITEM InsertItem( LPCTSTR lpszItem, HTREEITEM hParent = TVI_ROOT,
Time of Update: 2018-12-07
1.得到當前指令寄存器(IP)地址 call temptemp: pop ebp這樣ebp裡面的值就是temp的地址。2.shell code覆蓋緩衝區寫shell code時需要覆蓋緩衝區,覆蓋函數返回地址,應選擇call esp 或jump esp的地址。call esp和jump esp在程式中會有很多,搜尋相應地址,填入將覆蓋的地址。這樣jump esp或者call esp,就可以繼續執行覆蓋的堆棧裡的指令。