請勿轉載此文章
[ 概說 - PostMessageA 的 NP攔截方式 ]
NP攔截PostMessage的方式很簡單,就把程式的開頭加上一個JMP把你跳掉回不去,使你BOT程式當掉
因此,我們必須將原有的程式還原使用,才可不被NP破壞您的程式架構,通常沒有成功通過NP檢察,您
都會收到一個訊息「XXXX 發生問題,必須關閉,僅此致歉。」(XP平台)
在討問這個問題時,您必須要對System提供的DLL,API有所了解,以及PostMessageA的使用方法。
使用方法不說明,故您必須對此PostMessageA這個function有所了解,此文只說如何通過NP。
MLBOT 的 Re-hooked 也是利用此方法過NP的!
----------------------------------------------------------------------------------------------------------------------
到底如何不要讓程式被NP跳掉呢?
讓我們來看一下,NP啟動時,他對楓之谷做了什麼蠢事
比較一下兩張圖不同的地方
----------------------------------------------------------------------------------------------------------------------
【圖2】-NP啟動後,程式碼竟然變了
----------------------------------------------------------------------------------------------------------------------
因為該JMP位址的記憶體是空的,回不來,而且原本該執行的程式碼也被吃掉了一些
----------------------------------------------------------------------------------------------------------------------
方法可能有很多種,在【圖1】和【圖2】時,其實就透漏了一種方法
方法1:將整個User32.dll的PostMessageA部分Re-source
說明:由於NP吃掉那5個Bytes,因此可在自己的程式,寫下了這幾行去呼叫PostMessageA,NP把那5個Bytes改掉
我們沒辦法去修改他,所以可以在自己的程式把它補齊後再Jmp到原本+5的地方
----------------------------------------------------------------------------------------------------------------------
[ Q&A專區 ]
Q. 為何不能直接把jmp 458a7710直接改成jmp 77D1CB8A,讓程式繼續正常運作?
A. 有兩個原因:
1.直接jmp到下一行,還是沒有還原原本NP吃掉的那些程式碼,一樣會當掉
2. 此位址,有另外的CRC檢查,改了之後不是斷線就是重開機
Q. 為何我不能直接把那5 byte還原? 這樣也不會有上面那個問題「程式碼還是有少」了呀?
A. 別忘了,還有第二點,除了400000-7xxxxx外,還有另外的CRC CHECK
Q. 我能在它jmp的位址(458a7710) Alloc一個空間,並放上原本的程式碼並跳回原處嗎?
A. 答案是有可能的,意即不太確定,目前無實測!在ME裡,可以設定Alloc於哪<條件是要能過HSSDT>,在458a7710 alloc一個空間
放上原碼再跳回即可,範例:
先用CE的DLL,CALL VAE(hProcess , 起始地址 , 長度 , 類型 , 寫入讀取模式),為458a7710 ALLOC 10 BYTES
458a7710: //(假設此空間,已被ALLOC)
mov edi,edi
push ebp
mov ebp,esp
jmp 77D1CB8A
這樣的程式,即可完全BYPASS PostMessageA
但是, 458a7710 這個位只是隨機抽選的,每此都不一樣 故此方法較不可靠