公司最近因為加上了網路控管,之前使用VPN的方式躲過,但實在是太慢了,所以又另找解法,經由強者者同事告知,原來只要製造出假Process就可以順利上網,但要創造出假的Process,我只有想到兩種方法,一種很簡單,一種很複雜,第一種就是你把隨便一隻程式改名,例如把notepad.exe,改為Orz.exe,這樣檢查程式就會以為Orz.exe已經再執行了,缺點是可能會耗一點GDI的資源,雖然執行起來之後就隱藏了,但完美主義的我總是覺得不夠漂亮。 第二種則是現在要講的稱為Dll Injection技術,先講一下用途為何,某支沒有Source的程式呼叫WindowsAPI的時候,你希望可以改寫WindowsAPI的行為,這就需要用到Dll Injection,技術上來說就是對方的程式會改為呼叫你寫的Code,至於要不要繼續呼叫WindowsAPI,就看你的Code怎麼寫。 像上面的需求,一般列出Windows,應該是用EnumWindow,所以我就需要寫一個EnumWindow的取代函式,讓其使用。但要修改這部分則沒有那麼簡單,因為OS有實做Virtual Memory的關係,每個Process都是各自的記憶體空間,所以對方的Process是無法呼叫到你的Process裡面的函式的。DLL在Windows是一個特例,因為DLL Code在記憶中是共用的,所以可以被其他Process映射過去執行。至於要怎麼映射,這裡則是我覺得學Windows API滿精彩的一部分~ 當年接了一個CASE,需求是當USB裝置插入的時候,程式可以得知,一直寫不出來,但手中有一個小程式可以做到這個功能,只是他會跳出MessengeBox來,所以我把小程式隱藏,然後攔截他呼叫的MessageBox函式,再通知我的程式,這樣就OK了~ 下面是我當年的筆記,其實重點就是要知道現在正在執行的Code是在哪一個空間執行,DLL裡面會實做下面幾個函式 int __stdcall HOOK_MessageBox( HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption,UINT uType) 這個是取代MessageBox的函式,也就是小程式會呼叫到這裡 int replace_IAT(const char *pDllName,const char *pApiName,boo...