博客再次遷移

雖然用NotionNext的時候隱隱約約就知道還是會有這麼一天,不過比以前方便多了。 notion因為API改動,NotionNext的blog癱瘓了,我想了半天還是用回老方法吧,也就是使用hugo部署。 不過寫了這麼多年,我的blog已經文章太多了。 ...

2026年03月12日 · 1 分钟 · 304 字 · sdttttt

C草的編譯期編程:元模版

最近一直在寫time-devourer這個項目,我的多態設計的強迫症又犯了,不可避免和元模版打交道了。這篇文章簡單的稍微講一下我遇到的幾個場景。 自動包裝COM對象指針,生命週期結束自動調用Release。要求T必須能調用Release方法,且T必須是IUnknown的子類。 頭一次寫模版元編程給我肘暈了,這就是編譯期編程麼,害怕. ...

2025年09月10日 · 2 分钟 · 985 字 · sdttttt

關於Chrome密碼管理器的實現邏輯逆向研究

目前存在一個場景:需要填充網頁上的賬號密碼模擬登陸,但是不能觸發或者給chrome的密碼管理器識別到真實的賬號密碼。 以前其實就比較好奇這個密碼管理器是如何正確抓取網頁上的密碼的。 經過了一天的研究,大概可以得出幾個結論了,我不保證這個邏輯是正確的,但是如果有其他人需要參考我想還是能提供一些幫助的,當然也可能存在其他我沒觀測到的情況: ...

2025年09月05日 · 1 分钟 · 490 字 · sdttttt

全局描述符

這個東西其實很多,但是文章裡不想細講,我就大概的講一下,這個篇文章還是偏筆記為主。 總之全局描述符這個東西是繼實模式之後保護模式推出的一種內存管理結構。 在實模式下訪問內存基本就是靠“段地址+偏移地址=線性地址”這種方式來訪問。 ...

2025年08月09日 · 2 分钟 · 964 字 · sdttttt

BIOS最初的引導

由於操作系統本身時存放在硬盤中,並非能在bios引導後直接在內存中運行,所以才有了BIOS引導操作系統的這個步驟。 在主板上電之後,BIOS需要去找到引導程序的位置,這個位置固定在(0磁頭0柱面1扇區)的位置,這個扇區也被稱為主引導扇區(MBR)。一個扇區大小固定為512字節。也就是boot_loader的大小也必須在512字節以內。 ...

2025年05月14日 · 2 分钟 · 519 字 · sdttttt

通過函數指針來運行彙編(機器碼)

之前已經知道了函數這個玩意在計算機中的本質,本身在棧中存放其實就是一個指針的方式,而指針指向的內容就是在內存中存放的機器碼。 解釋到這裡就已經很明顯了,函數其實並不是一定要在編譯期載入內存後靜態,也就是固定的方式運行的。 ...

2025年05月07日 · 1 分钟 · 410 字 · sdttttt

C中的指針運算,類型轉換以及函數指針

這次依然是從彙編開始分析C語言裡的一些語法實現,這次還是Windows平臺上為主~ 直接上最簡單的: 1int z = 0; 2char s1 = (char)z; 3 4// ASM 5int* z = 0; 6// 這次就直接顯示符號名吧,不看內存地址了 7// dword ptr就是數據類型聲明 8mov dword ptr [z],0 9char* s1 = (char*)z; 10// movzx這個指令,下面講解,總之就是把z移動到eax寄存器. 11movzx eax,byte ptr [z] 12// 直接粗暴的進行一個強轉,al是AX的第八位,AX是EAX的低16位 13// mov指令要求操作數大小相等,byte ptr只佔8個字節,所以這裡用AL寄存器 14mov byte ptr [s1],al movzx這個指令簡單來說就是把小字節操作數移動到大字節寄存器,同時讓大字節的高位補零。 ...

2025年05月04日 · 2 分钟 · 995 字 · sdttttt

調用約定

感覺沒什麼營養,懶得寫了。

2025年04月24日 · 1 分钟 · 13 字 · sdttttt

看一眼Linux的匯編

繼續上一篇文章,還是那個代碼,這次我們在Linux上編譯試試,看看和windows有什麼不同。 1int add(int a, int b) { 2 return a + b; 3} 4 5int main() 6{ 7 int a = add(1, 2); 8 return 0; 9} 匯編來咯: 1 0x000055555555460e <+0>: push rbp 2 0x000055555555460f <+1>: mov rbp,rsp 3 0x0000555555554612 <+4>: sub rsp,0x10 4 0x0000555555554616 <+8>: mov esi,0x2 5 0x000055555555461b <+13>: mov edi,0x1 6 0x0000555555554620 <+18>: call 0x5555555545fa <add> 7 0x0000555555554625 <+23>: mov DWORD PTR [rbp-0x4],eax 8 0x0000555555554628 <+26>: mov eax,0x0 9 0x000055555555462d <+31>: leave 10 0x000055555555462e <+32>: ret 11 12 ;其實大差不差,前三句是保存上下文和開闢棧幀 13 ;後面把參數放進去,調用add,然後吧eax裡的返回值取出到rbp-4這個地址裡,清零 14 ;leave的看起來像是linux平臺下獨有的指令 15 ;這個指令其實基本等同於 mov rsp, rbp; pop rbp 16 ;實際上就是回復上下文 17 18 19 0x00005555555545fa <+0>: push rbp 20 0x00005555555545fb <+1>: mov rbp,rsp 21 0x00005555555545fe <+4>: mov DWORD PTR [rbp-0x4],edi 22 0x0000555555554601 <+7>: mov DWORD PTR [rbp-0x8],esi 23 0x0000555555554604 <+10>: mov edx,DWORD PTR [rbp-0x4] 24 0x0000555555554607 <+13>: mov eax,DWORD PTR [rbp-0x8] 25 0x000055555555460a <+16>: add eax,edx 26 0x000055555555460c <+18>: pop rbp 27 0x000055555555460d <+19>: ret 28 29 ;這裡也很簡單,前兩句還是保存上下文,不過這次沒有開闢棧幀 30 ;直接把兩個寄存器的值移動到內存地址裡再放在寄存器裡再計算? 31 ;這樣寫有點逆天,不過估計是debug模式完全沒有優化 32 ;最後彈出地址到棧裡返回

2025年04月24日 · 1 分钟 · 410 字 · sdttttt

久違的繼續學彙編

上次學彙編都是2年前了好像,學了一些基本的指令用法。 這次像重新撿起來了,同時想要自己寫點新的玩意,目前的知識不太夠呢 慢慢學吧… 這次開始讀彙編和畫棧結構吧~ 先從簡單的開始: 1int add(int a, int b) { 2 return a + b; 3} 4 5int main() 6{ 7 int a = add(1, 2); 8 return 0; 9} 彙編如下(Windows平臺): ...

2025年04月23日 · 2 分钟 · 902 字 · sdttttt