為OICQ 820新增顯示IP地址和埠號的功能 (轉貼) (17千字)

看雪資料發表於2000-10-19

別申明:本文所述的內容僅供研究交流之用,如用作非法用途或修改不當,一切後果自負!
注意:只適合OICQ 0820版本

    我們的目標是去掉廣告顯示,並且在廣告的位置上顯示目標物件的IP地址和埠號。我們應該怎麼下手呢,好的,慢慢跟我來!

    經過對Oicq目錄結構的分析,發現目錄AD和廣告有關。其一是廣告的英文簡寫就是AD,其二是其中的圖片檔案就是我們在廣告中看到的。 試著刪除該目錄之後,呵呵,廣告消逝了。但是下次進入Oicq之後,程式會自動新建這個目錄,並且重新下載廣告檔案。既然程式讀取不到廣告檔案廣告就會消失,那麼就人 工讓它讀不到咯。用Soft-ice把斷點設定在CreateFileA上,這個API呼叫一般是用來開啟一個檔案或者裝置的。在Sice截到斷點後,檢視是即將開啟的那些檔案,從而判斷是 否是我們要修改的地方。具體修改方法詳見“開啟廣告檔案的程式段”。

    廣告是去掉了,但是在廣告區域上點選滑鼠,瀏覽器仍然會開啟廣告連結,看來我們還需要對程式作更完善的修改。好了,既然點選廣告會出現 瀏覽器,那一定是執行了一個程式。一般開啟執行瀏覽器程式的有兩種方法,一是呼叫COM介面,二是呼叫普通的執行程式的API函式。第一種方法技術難度較高,一般程式很 少採用。所以直接用Sice把斷點設定在幾個和執行程式有關的API函式上,比如ShellExecuteA,WinExec等等。好了,程式在ShellExecuteA處中斷,也就是隻要避過這個API函 數就行咯。呵呵,順著程式往上找合適的修改位置,會發現USER32.PtInRect函式的呼叫,經過分析,發現它是用作判斷滑鼠點選是否在特定區域內的。搞定,只要使它判斷總 是在區域外,就不會執行到ShellExecuteA那兒去了。傳送訊息視窗和回覆視窗的廣告點選的程式在不同的位置,也就說在兩個地方,這兩個地方都要修改,原理也都是一樣。 具體修改方法詳見“傳送訊息視窗點選廣告的程式段”和“回覆訊息視窗點選廣告的程式段”。(我們為了實現在點選滑鼠後出現IP地址和埠號,在傳送訊息視窗新增了一 個有關顯示的程式入口,我將在後面講解)。

    這下廣告真的是去除了,既不能看到,也不能點進去了。呵呵,開始我們的下一步目標,顯示IP地址和埠號!!!

    過去要想知道Oicq上朋友的IP地址只有藉助民間的一些小工具程式或者採用包監聽程式,後者專業要求比較高,而且辨別率低,也不方便。一些 小程式的確很管用,但是畢竟沒有把這個功能直接做到Oicq程式上方便和可靠,利用Oicq內部的很多資料和結構能獲得很多我們平常不容易獲得的資訊。但是畢竟只有二進位制 彙編程式碼,沒有源程式,程式的分析難度和工作量可想而知。經過令人難以想象多次數的當機和重起,以及極其艱辛的設定斷點跟蹤除錯分析工作……(以下省略5201314字) ,終於粗略的獲得了我們感興趣的資料結構指標以及它相關呼叫的位置。這段時間是我最鬱悶的時候,想起那段毫無人性的工作,就像已經過上幸福生活的老同志回憶起49年 以前悲慘生活般的膽戰心驚且心有餘悸……(以下省略520字)。還好我挺過來了,終於在0042513D處找到了需要的指標地址。只要利用這個指標就能獲得目標物件的IP地址 以及埠號。我們需要做的就是把這些資訊顯示在以前的廣告位置。

    又是一項艱鉅的任務放在我的面前,還好我有堅定的信念、豐富的臨床經驗以及對成功喜悅的企盼,還有對聊天MM住址的渴望,我一定會珍惜, 不能像周星星一樣期望再來一次……(再次省略若干,以免挨雞蛋)。

    言歸正傳,既然獲得了關鍵的資料指標,那可以說我們已經成功了90%了,接下來的就是顯示出來而已。但這也需要反覆的試驗和修改。讓我們 好好來回味一下這一過程:

    首先,要實現新的功能毫無疑問需要新增程式碼和資料,以及執行一定的API函式,所以需要找到適當的方法新增程式碼到原程式之中。完美的方法就 是作一個外殼新增程式,在原程式中新增所需要的段(資料段,程式段),以及新增Import表表項,以用於新的API函式的地址定位,還要修改PE檔案頭中的各項相關資訊,這 就是病毒的做法。這無疑非常的複雜和繁瑣,有興趣的同學可以參見我以前的文章“關於95下可執行檔案的加密研究”。其實我們的要新增的程式量並不大,充其量也就零零星 星的幾百個位元組,而且用到的API函式也不多。所以我們採取了手動修改新增的方法,但也需要必要的條件和方法。看我以下的分析和方法:

    PE可執行檔案的邏輯結構是段,比如程式碼段“.text”、資料段“.data”、資源段“.rscs”等等。這些段大小都是按檔案對齊,也就是說段大小 至少會按10h對齊,一般是1000h(4096位元組),這由檔案頭中指定(連結的時候確定)。但是程式碼也好資料也好,不可能做到長度剛好是對齊的。也就是說,段的大小是大於段 中程式碼或資料實際大小的。他們之間的差值就是該段冗餘的空間,這個空間被稱為“空隙”。有一些簡單的PE檔案減肥軟體就是使用去掉“空隙”的方法來減肥的。這個“空隙”可 以被我們用來放置程式碼、資料以及堆疊。我常用的分析PE檔案檔案頭的工具軟體是Borland以前在C++系列軟體中帶的“Tdump.exe”。讓我們看看實際分析的結果:

Object table:
# Name VirtSize RVA PhysSize Phys off Flags
-- -------- -------- -------- -------- -------- --------
01 .text 000D0637 00001000 000D1000 00001000 60000020 [CER]
02 .rdata 000320E8 000D2000 00033000 000D2000 40000040 [IR]
03 .data 00039848 00105000 00012000 00105000 C0000040 [IRW]
04 .rsrc 0003E4C0 0013F000 0003F000 00117000 40000040 [IR]

    以上是用Tdump看到的Oicq.exe的段資訊(它的Oject就是我們所說的段)。我們肯定是首選.text段進行觀察(.text是程式碼段,Flag為CER,意思就是包 含程式碼、可執行、可讀的意思(Contains code, Execute,Readable))。可以看到,.text段程式碼實際長度D0637h,物理長度D1000h,檔案偏移位置為1000h處。OK,這個段有 D1000h-D0637h=C9Ch的“空隙”。這個長度完全可以滿足我們的需要了,而且程式碼資料堆疊都可以放在這個區域內。眾所周知,要作為資料段使用,段的屬性(Flags)需要可寫。 好了,只需要改寫“.text”的屬性即可,可寫屬性的值是80000000h,然後加上原來的60000020h後,就是C0000020h了,也就是變成了CERW屬性(具體修改方法詳見“程式碼段段屬 性修改”)。看看我們更改後的用Tdump分析的結果。

Object table:
# Name VirtSize RVA PhysSize Phys off Flags
-- -------- -------- -------- -------- -------- --------
01 .text 000D0637 00001000 000D1000 00001000 C0000020 [CRW]
02 .rdata 000320E8 000D2000 00033000 000D2000 40000040 [IR]
03 .data 00039848 00105000 00012000 00105000 C0000040 [IRW]
04 .rsrc 0003E4C0 0013F000 0003F000 00117000 40000040 [IR]

    好了,找到了放置程式碼資料和堆疊的地方,也就是其實偏移1000h+D0637h 的地方。為了對齊邊界,我們採用D1640h這個值(檔案偏移)。用Tdump 檢視程式碼段基址(Code Base)和PE檔案映象基址(Image Base),分別是1000h和400000h,可以算出我們的程式在裝入後的實際地址,400000h+1000h+D0640h=4D1640h。也就是 說我們的程式碼在被系統裝入後在記憶體4D1640h處,這在以後程式跳轉處用到。

    新增程式碼的工作已經做好,現在關鍵的問題就是編制具體的程式碼,以用於IP地址和埠號的儲存和顯示。

    首先是對物件資料中IP地址和埠資訊的儲存,我們在獲得該資料指標後(程式00425157處),更改程式使程式直接跳轉到我們的儲存程式中 (4D1640h)。該資料的指標首址放在EAX,由於該段程式有些暫存器的值都有用,堆疊也不能亂壓。所以我們首先修改了棧指標,使所有的堆疊活動都在我們的“空隙”中進行 (堆疊頂端4D1900h)。然後儲存幾個暫存器的值(壓棧)。IP地址和埠號分別在該資料結構+214h和+218h的地方(也就是EAX+214h和EAX+218h)。IP地址是一個字串指標 ,埠是個32位整數。我們要做的就是把他們都轉換成字串,儲存在自己的地盤中。我們巧妙的用了一個wsprintfA函式把字串和埠號輸出到一個地址上(隨便在我們的 “空隙”中找個空閒的地址,我用的是4D1700h,4D1720h中放的是格式化字串“%s:%d”)。實際這段程式翻譯成C語言就是printf(“%s:%d”,char *ip,int port),這樣 我們就把字串形式的資料儲存在了資料區裡。值得注意的是,由於我們修改了原程式中的有用的程式碼用於跳轉程式,所以在我們的程式中就需要加上(cmp dword ptr [eax+000001DC], ecx)這句程式碼,退出我們的程式之前恢復棧指標和各暫存器,用一條無條件跳轉指令轉回到原程式繼續執行。

    細心的同學可能注意到我們沒有顯式的呼叫wsprintfA函式,但是我們實際上是呼叫了。在顯示IP的那段附加程式中呼叫SetWindowTextA的呼叫也 是這樣。這是怎麼回事呢?我們知道所有API函式的呼叫前都需要重定位,這個過程發生在系統裝入這個PE程式的時候。系統按照PE檔案中Import表的內容對API函式在程式中的 地址進行填寫。我們沒有修改Import表,所以,如果直接寫上彙編程式碼,系統是不會為它定位的。由於Import表比較複雜,更改它是個非常繁瑣的事情。所以我們採用變通的方 法,既然系統為用到的API函式地址都作了重定位,所以API函式的地址資訊也就存在了。

具體的做法如下:
找到原程式中有呼叫wsprintfA的地方:
:0049CE30 FF1560274D00 Call USER32.wsprintfA
:0049CE36 83C410 add esp, 00000010
:0049CE39 EB1A jmp 0049CE55

    實際的彙編程式碼應該是Call dword ptr [004D2760],我們就知道了wsprintfA的地址是放在004D2760中。所以,我們只要間接的獲得這個呼叫的地址 ,這個地址就是指向wsprintfA實際地址的二重指標。這樣我們就可以直接Call這個地址了。在“顯示IP地址和串列埠的附加程式”中所用到的SetWindowTextA也是用這種方法呼叫的 。(具體修改方法詳見“彈出傳送訊息視窗之前的物件資料呼叫的程式段”和“儲存IP地址和埠的附加程式”)

    在把IP地址和埠儲存為了字串形式在4D1700h之後,今後只需要在需要的時候顯示出來就行了。

    前面我們提到了需要在點選廣告後顯示IP地址。所以,我們在點選廣告的程式段中間新增了跳轉到我們顯示程式的入口(4D1680h)。顯示程式的原 理很簡單,使用SetWindowTextA函式把儲存在4D1700h的字串顯示在以前廣告的視窗中。在顯示之前,判斷一下如果沒有IP地址的情況,如果是隻有一個冒號,說明沒有IP地址, 就簡單的寫上一個“0”。呼叫SetWindowTextA函式的方法在前面已經提到。需要注意還有兩個重要的問題:

    我們從什麼地方獲得SetWindowTextA函式需要的一個引數DD廣告視窗控制程式碼呢?我特意在“傳送訊息視窗點選廣告的程式段”中寫出了在點選廣告 時有一個Call USER32.GetWindowRect呼叫的程式碼,這個函式同樣需要視窗控制程式碼。[ESI+160h]就是USER32.GetWindowRect需要的廣告視窗控制程式碼,我們就可以利用這個控制程式碼呼叫 SetWindowTextA,使字串顯示在廣告視窗上。

    還有就是由於原來的廣告視窗是用於圖片的顯示,所以不能用來顯示字元。它的視窗樣式中有個SS_ETCHEDFRAME的值。我們需要去掉它並加上用 於垂直居中和水平居中的兩個樣式SS_CENTER和SS_CENTERIMAGE。一般靜態對話方塊中的視窗元素(控制元件)都是靜態的儲存在資源段中,而不是程式動態生成的。所以我們不需要 改程式,只需要改掉資源段中的值就可以了。具體改法詳見“訊息傳送對話方塊中廣告視窗樣式的更改”。

    程式基本上改完了,終於可以享受我們辛苦改動的結果了,不料Oicq 820版有檢查檔案是否被修改過這一手。同樣,阻止我們通向成功道路上的任 何障礙只能無情的被我們消滅,這個提示檔案已被修改的對話方塊也只能被我們搞調。幸好搞它非常的簡單,把斷點設定在MessageBoxA上,等蹦出斷點後,查詢前面的程式碼,找到 判斷是否彈出對話方塊的程式碼並且無情的幹掉,詳見“彈出檔案修改警告框的程式段”。

    大功告成!學到不少東西吧!這麼多程式碼自己慢慢用UltraEdit查詢修改吧,知道敲錯一個的後果嗎?呵呵,不是當機就是重起。考慮到一些初級 DIY使用者的需求,我把修改好的EXE檔案用專業的Patch軟體“CodeFusion”作成了一個18K的Patch執行檔案。需要的朋友額可以到我主頁上去下載。(應騰訊公司要求,已撤掉該補丁程式,非常抱歉)。

    好了,課程結束。如果有時間的話,還可以對Oicq作很多的改造。但無疑這個任務是非常艱鉅而複雜的,但是隻要你有必勝的信心以及充沛的精力 ,並且敢於接受這種毫無人性任務的挑戰,還有視一切PPMM為糞土的高尚眼光和能忍受對自己無情虐待的勇氣,你會成功的!(¥……#%%……※#!¥#%啊啊啊啊~~~ ~~~~呃~~,被前排學生暴扁)。

    ~~~~下課咯~~~~

開啟廣告檔案的程式段 更改以前:
:0042AF5B FF152C244D00
:0042AF61 8BF8
:0042AF63 83FFFF
:0042AF66 897D08
:0042AF69 0F84EB000000
:0042AF6F 8D45F4
:0042AF72 50
:0042AF73 57

Call KERNEL32.CreateFileA
mov edi, eax
cmp edi, FFFFFFFF
mov dword ptr [ebp+08], edi
je 0042B05A
lea eax, dword ptr [ebp-0C]
push eax
push edi


;開啟廣告檔案
;返回檔案控制程式碼
;判斷是不是無效控制程式碼(開啟失敗)
;儲存
;無效就轉




更改以後:
:0042AF5B FF152C244D00
:0042AF61 8BF8
:0042AF63 83FFFF
:0042AF66 897D08
:0042AF69 E9CE000000

Call KERNEL32.CreateFileA
mov edi, eax
cmp edi, FFFFFFFF
mov dword ptr [ebp+08], edi
jmp 0042B03C

;開啟廣告檔案
;返回檔案控制程式碼
;判斷是不是無效控制程式碼(開啟失敗)
;儲存
;不管開啟成功與否都轉

手工更改方法:   
檔案偏移:  2AF69h 
查詢16進位制程式碼:  89 7D 08  0F 84 EB 00 00 00 
更改為:  E9 EC 01

彈出檔案修改警告框的程式段

更改以前:
:00443B56 33FF
:00443B58 397DDC
:00443B5B 755C

xor edi, edi
cmp dword ptr [ebp-24], edi
jne 00443BB9


;是否修改過原檔案,是就彈出警告對話控
;不是轉

更改以後:
:00443B56 33FF
:00443B58 397DDC
:00443B5B EB5C

xor edi, edi
cmp dword ptr [ebp-24], edi
jmp 00443BB9


;不管是不是都轉 
手工更改方法:   
檔案偏移:  43B5Bh 
查詢16進位制程式碼:  39 7D DC  75 5C 
更改為:  EB
 
傳送訊息視窗點選廣告的程式段

更改以前:
:00432B4E 50
:00432B4F FFB660010000
:00432B55 FF1578274D00
:00432B5B 8D45DC
:00432B5E 8BCE
:00432B60 50
:00432B61 E8A6110700
:00432B66 FF7510
:00432B69 8D45DC
:00432B6C FF750C
:00432B6F 50
:00432B70 FF15B8274D00
:00432B76 85C0
:00432B78 0F84FF000000
:00432B7E 6A10
:00432B80 FF157C274D00
:00432B86 33DB
:00432B88 663BC3
:00432B8B 7D0F
:00432B8D C705D874510001000000
:00432B97 E9E8000000

push eax
push dword ptr [esi+00000160]
Call USER32.GetWindowRect
lea eax, dword ptr [ebp-24]
mov ecx, esi
push eax
call 004A3D0C
push [ebp+10]
lea eax, dword ptr [ebp-24]
push [ebp+0C]
push eax
Call USER32.PtInRect
test eax, eax
je 00432C7D
push 00000010
Call USER32.GetKeyState
xor ebx, ebx
cmp ax, bx
jge 00432B9C
mov dword ptr [005174D8], 00000001
jmp 00432C84



;esi+160是視窗控制程式碼










;判斷是否在廣告區域內點選

;是








更改以後:
:00432B70 FF15B8274D00
:00432B76 85C0
:00432B78 0F84FF000000
:00432B7E 6A10
:00432B80 FF157C274D00
:00432B86 E9F5EA0900
:00432B8B 7D0F
:00432B8D C705D874510001000000
:00432B97 E9E8000000

Call USER32.PtInRect
test eax, eax
je 00432C7D
push 00000010
Call USER32.GetKeyState
jmp 004D1680
jge 00432B9C
mov dword ptr [005174D8], 00000001
jmp 00432C84

;判斷是否在廣告區域內點選


;是就跳到我們的顯示程式當中


手工更改方法:   
檔案偏移:  32B86h 
查詢16進位制程式碼:  33 DB 66 3B C3 7D 0F C7 
更改為:  E9 F5 EA 09 00 


回覆訊息視窗點選廣告的程式段

更改以前:   
:0046221C FF15B8274D00
:00462222 85C0
:00462224 0F84D8000000  Call USER32.PtInRect
test eax, eax
je 00462302  ;判斷是否在廣告區域內點選

;不是就轉 
 
更改以後:
 
:0046221C FF15B8274D00
:00462222 85C0
:00462224 E9D9000000
Call USER32.PtInRect
test eax, eax
jmp 00462302
;判斷是否在廣告區域內點選

;不管是不是都轉

手工更改方法:   
檔案偏移:  62224h 
查詢16進位制程式碼:  0F 84 D8 00 00 00 8B 46 56 
更改為:  E9 D9 00 00 00 90 

彈出傳送訊息視窗之前的物件資料呼叫的程式段

更改以前:   
:0042513D 56
:0042513E 8BF1
:00425140 FFB6F4000000
:00425146 FFB6B0000000
:0042514C E879810300
:00425151 33C9
:00425153 3BC1
:00425155 7431
:00425157 3988DC010000
:0042515D 7508
:0042515F 8988E8010000
:00425165 EB0A  push esi
mov esi, ecx
push dword ptr [esi+000000F4]
push dword ptr [esi+000000B0]
call 0045D2CA
xor ecx, ecx
cmp eax, ecx
je 00425188
cmp dword ptr [eax+000001DC], ecx
jne 00425167
mov dword ptr [eax+000001E8], ecx
jmp 00425171 



;獲得物件的資料結構首址

;是否成功,非零就成功
;失敗轉





 
更改以後:
 
:0042513D 56
:0042513E 8BF1
:00425140 FFB6F4000000
:00425146 FFB6B0000000
:0042514C E879810300
:00425151 33C9
:00425153 3BC1
:00425155 7431
:00425157 E9E4C40A00
:0042515C 90
push esi
mov esi, ecx
push dword ptr [esi+000000F4]
push dword ptr [esi+000000B0]
call 0045D2CA
xor ecx, ecx
cmp eax, ecx
je 00425188
jmp 004D1640
nop




;獲得物件的資料結構首址

;是否成功,非零就成功
;失敗轉
;跳到我們的儲存IP地址和埠的程式中
;加一個空操作對齊

手工更改方法:   
檔案偏移:  25157h 
查詢16進位制程式碼:  39 88 DC 01 00 00 75 08 
更改為:  E9 E4 C4 0A 00 90 

儲存IP地址和埠的附加程式

新增程式碼:   
:004D1640 8BDC
:004D1642 BC00194D00
:004D1647 50
:004D1648 51
:004D1649 52
:004D164A 56
:004D164B FFB018020000
:004D1651 FFB014020000
:004D1657 6820174D00
:004D165C 6800174D00
:004D1661 8B3532CE4900
:004D1667 FF16
:004D1669 83C410
:004D166C 5E
:004D166D 5A
:004D166E 59
:004D166F 58
:004D1670 3988DC010000
:004D1676 8BE3
:004D1678 E9E03AF5FF
:004D167D 90
:004D167E 90
:004D167F 90  mov ebx, esp
mov esp, 004D1900
push eax
push ecx
push edx
push esi
push dword ptr [eax+00000218]
push dword ptr [eax+00000214]
push 004D1720
push 004D1700
mov esi, dword ptr [0049CE32]
call dword ptr [esi]
add esp, 00000010
pop esi
pop edx
pop ecx
pop eax
cmp dword ptr [eax+000001DC], ecx
mov esp, ebx
jmp 0042515D
nop
nop
nop  ;儲存原程式的棧指標
;設定新的棧指標到無用的記憶體區域
;儲存原程式幾個有用暫存器



;物件埠的地址
;IP地址的字串指標
;指向“%s:%d”,這是printf的模式字元
;輸出到的地方
;其他地方呼叫wsprintfA的地址
;esi為已經重定位好了的wsprintfA的地址
;恢復棧指標
;恢復有用的暫存器值



;原程式00425157處被改掉的有用程式碼
;恢復為以前的棧指標
;跳轉到原程式




手工更改方法:   
檔案偏移:  D1640h 
新增16進位制程式碼:  8B DC BC 00 19 4D 00 50  51 52 56 FF B0 18 02 00 
00 FF B0 14 02 00 00 68
00 8B 35 32 CE 49 00 FF
39 88 DC 01 00 00 8B E3 20 17 4D 00 68 00 17 4D
16 83 C4 10 5E 5A 59 58
E9 E0 3A F5 FF 90 90 90

顯示IP地址和埠的附加程式

新增程式碼:   



:004D1680 803D00174D003A
:004D1687 7509
:004D1689 66C70500174D003000
:004D1692 6800174D00
:004D1697 FFB660010000
:004D169D A1E8714A00
:004D16A2 FF10
:004D16A4 E9D415F6FF
:004D16A9 90
:004D16AA 90
:004D16AB 90
:004D16AC 90
:004D16AD 90
:004D16AE 90
:004D16AF 90 


cmp byte ptr [004D1700], 3A
jne 004D1692
mov word ptr [004D1700], 0030
push 004D1700
push dword ptr [esi+00000160]
mov eax, dword ptr [004A71E8]
call dword ptr [eax]
jmp 00432C7D
nop
nop
nop
nop
nop
nop
nop  ;判斷字元記憶體區第一個字元是不是冒號,是就說明沒有IP地址
;不是轉到顯示程式
;在字元記憶體區寫上一個“0”
;字元記憶體區首址
;廣告視窗的視窗控制程式碼
;其他地方呼叫SetWindowTextA的地址
;eax為已經重定位好了的SetWindowTextA的地址
;跳到廣告點選程式之後
;無用的空操作,只是為了對齊好看




wsprintf所用到的模式字串:   
:004D1720 25733A2564  "%s:%d" 
手工更改方法:   
檔案偏移:  D1680h 
新增16進位制程式碼:  80 3D 00 17 4D 00 3A 75  09 66 C7 05 00 17 4D 00 
30 00 68 00 17 4D 00 FF
4A 00 FF 10 E9 D4 15 F6 B6 60 01 00 00 A1 E8 71
FF 90 90 90 90 90 90 90
檔案偏移為:  D1720h 
新增16進位制程式碼  25 73 3A 25 64 

訊息傳送對話方塊中廣告視窗樣式的更改

更改樣式字:   
更改以前的視窗樣式(style)是50000012h  WS_CHILDWINDOW|WS_VISIBLE|SS_LEFT|SS_ETCHEDFRAME 
更改以後的視窗樣式(style)是50000201h  WS_CHILDWINDOW|WS_VISIBLE|SS_LEFT|SS_CENTER|SS_CENTERIMAGE 
手工更改方法:   
檔案偏移:  141EFCh 
查詢16進位制程式碼:  12 00 00 50 
02 01 00 50 

程式碼段段屬性修改

更改屬性字:   
更改以前的程式碼段屬性為60000020h  CER(包含程式碼,可執行,可讀) 
更改以後的程式碼段屬性為C0000020h  CRW(包含程式碼,可執行,可讀寫) 
手工更改方法:   
檔案偏移:  21Ch 
查詢16進位制程式碼: 
20 00 00 60 
20 00 00 C0

作者:鄒丹
電郵:tpo@sina.com
主頁:http://www.zoudan.com

相關文章