在Windows版上的LINE開啟後,如果使用Cheat Engine做進程掛接上去,會看到LINE直接崩潰掉. 先單看Windows提供的一組WinAPI怎麼建立Debugger機制: Win32 Debug API 原理 使用VS调试时,被调试进程如何被断下来的。 【原创】反OD调试的一些想法与实践 看完之後會知道Debugger的核心機制是: 1.創建進程(CreateProcess)使用 DEBUG_PROCESS這個Flag,此時該進程內的PEB中的 BeingDebugged Flag會被設為True ,呼叫完後,進成被創建完就會先是被凍結主線程(UI Thread)的進程了. 2.接著激活主線程後,WinNT消息機制發現了 BeingDebugged為True,就會主動調用 DbgBreakPoint API,在組語上遇到了int 3(0xCC)線程又會被凍結,然後會反彈一個 Create_PROCESS_DEBUG_EVENT訊息回去給父進程,給Debugger做事情. 3.如果Debugger想下新的Ring3層斷點,會先用CreateThread在指定進程中創線程,使此線程Call DbgUiRemoteBreakin,那麼指定進程內所有線程就會被Debugger掛起.那麼Debugger便可以對需要的指定記憶體段下int 3異常點. DbgUiRemoteBreakin內可以看到所有線程主動去Call DbgBreakPoint來把當前線程控制權交給Debugger. 4.如果是進程已經被運行,Debugger才去Attach,則用到DebugActiveProcess去Attach指定進程,接著 BeingDebugged又會被設為True,然後做異常機制的掛起線程. 最後我比較好奇的是 DbgUserBreakPoint函數內寫法跟DbgBreakPoint其實一模一樣,我不太懂微軟幹嘛把同個功能寫成兩個不同的API? 接著總結一下 所以一般Ring3層需要防Debugger可能會防止 1.自身 DbgBreakPoint被呼叫.(只要此函數呼叫了便把控制權交出去了) 2. 自身 DbgUserBreakPoint 被呼叫...