程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 為OICQ添加顯示IP和端口功能

為OICQ添加顯示IP和端口功能

編輯:Delphi
特別申明:本文所述的內容只用於研究交流之用,如用作非法用途或修改不當,一 切後果自負!
  
  
  我們的目標是去掉廣告顯示,並且在廣告的位置上顯示目標對象的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]
  
  
  以上是用看到的Oicq.exe的段信息(它的Oject就是我們所說的段)。我們肯定是 首選.text段進行觀察(.text是代碼段,Flag為CER,意思就是包含代碼、可執行 、可讀的意思(Contains code, Execute,Readable))。可以看到,.text段代碼 實際長度D0637h,物理長度D1000,文件偏移位置為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。也就是說我 們的代碼在被系統裝入後在內存4D1640處,這在以後程序跳轉處用到。
  
  
  添加代碼的工作已經做好,現在關鍵的問題就是編制具體的代碼,以用於IP地址和 端口號的保存和顯示。
  
  
  首先是對對象數據中IP地址和端口信息的保存,我們在獲得該數據指針後(程序 00425157處),更改程序使程序直接跳轉到我們的保存程序中(4D1640)。該數據 的指針首址放在EAX,由於該段程序有些寄存器的值都有用,堆棧也不能亂壓。所 以我們首先修改了棧指針,使所有的堆棧活動都在我們的"空隙"中進行(堆棧頂端 4D1900)。然後保存幾個寄存器的值(壓棧)。IP地址和端口號分別在該數據結構 +214h和+218h的地方(也就是EAX+214h和EAX+218h)。IP地址是一個字符串指針 ,端口是個32位整數。我們要做的就是把他們都轉換成字符串,保存在自己的地盤 中。我們巧妙的用了一個wsprintfA函數把字符串和端口號輸出到一個地址上(隨 便在我們的"空隙"中找個空閒的地址,我用的是4D1700,4D1720中放的是格式化字 符串"%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函數需要的一個參數??廣告窗口句柄呢? 我特意在"發送消息窗口點擊廣告的程序段"中寫出了在點擊廣告時有一個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為糞土的高尚眼光和能忍受對自己無情 虐待的勇氣,你會成功的!(¥……#%%……※#!¥#%啊啊啊啊~~~~~ ~~呃~~,被前排學生暴扁)。
  
  
  為OICQ添加顯示IP和端口功能
  
  
  打開廣告文件的程序段
  
  更改以前:|
  
  :0042AF5B FF152C244D00 Call KERNEL32.CreateFileA ?
  
  文件
  
  :0042AF61 8BF8 mov edi, eax ?
  
  :0042AF63 83FFFF cmp edi, FFFFFFFF ?
  
  
  句柄(打開失敗)
  
  :0042AF66 897D08 mov dWord ptr [ebp+08], edi ?
  
  :0042AF69 0F84EB000000 je 0042B05A :0042AF6F 8D45F4 lea eax, dWord ptr [ebp-0C]
  
  :0042AF72 50 push eax
  
  :0042AF73 57 push edi
  
  更改以後:
  
  :0042AF5B FF152C244D00 Call KERNEL32.CreateFileA ?
  
  
  文件
  
  :0042AF61 8BF8 mov edi, eax ?
  
  :0042AF63 83FFFF cmp edi, FFFFFFFF 更改以後:
  
  :00443B56 33FF xor edi, edi
  
  :00443B58 397DDC cmp dWord ptr [ebp-24], edi
  
  :00443B5B EB5C jmp 00443BB9 ?
  
  
  手工更改方法:
  
  查找16進制代碼:39 7D DC 75 5C
  
  更改為: EB
  
  文件偏移為43B5Bh
  
  發送消息窗口點擊廣告的程序段
  
  更改以前:
  
  :00432B4E 50 push eax
  
  :00432B4F FFB660010000 push dWord ptr [esi+00000160] ;
  
  esi+160是窗口句柄
  
  :00432B55 FF1578274D00 Call USER32.GetWindowRect
  
  :00432B5B 8D45DC lea eax, dWord ptr [ebp-24]
  
  :00432B5E 8BCE mov ecx, esi
  
  :00432B60 50 push eax
  
  :00432B61 E8A6110700 call 004A3D0C
  
  :00432B66 FF7510 push [ebp+10]
  
  :00432B69 8D45DC lea eax, dWord ptr [ebp-24]
  
  :00432B6C FF750C push [ebp+0C]
  
  :00432B6F 50 push eax
  
  :00432B70 FF15B8274D00 Call USER32.PtInRect
  
  :00432B76 85C0 test eax, eax ?
  
  區域內點擊
  
  :00432B78 0F84FF000000 je 00432C7D
  
  :00432B7E 6A10 push 00000010 ?
  
  :00432B80 FF157C274D00 Call USER32.GetKeyState
  
  :00432B86 33DB xor ebx, ebx
  
  :00432B88 663BC3 cmp ax, bx
  
  :00432B8B 7D0F jge 00432B9C
  
  :00432B8D C705D874510001000000 mov dWord ptr [005174D8], 00000001
  
  :00432B97 E9E8000000 jmp 00432C84
  
  
  更改以後:
  
  :00432B70 FF15B8274D00 Call USER32.PtInRect
  
  :00432B76 85C0 test eax, eax
  
  :00432B78 0F84FF000000 je 00432C7D
  
  :00432B7E 6A10 push 00000010 ?
  
  區域內點擊
  
  :00432B80 FF157C274D00 Call USER32.GetKeyState
  
  :00432B86 E9F5EA0900 jmp 004D1680 ?
  
  示程序當中
  
  :00432B8B 7D0F jge 00432B9C
  
  :00432B8D C705D874510001000000 mov dWord ptr [005174D8], 00000001
  
  :00432B97 E9E8000000 jmp 00432C84
  
  
  手工更改方法:
  
  查找16進制代碼:33 DB 66 3B C3 7D 0F C7
  
  更改為: E9 F5 EA 09 00
  
  文件偏移為32B86h
  
  回復消息窗口點擊廣告的程序段
  
  更改以前:
  
  :0046221C FF15B8274D00 Call USER32.PtInRect ?
  
  廣告區域內點擊
  
  :00462222 85C0 test eax, eax
  
  :00462224 0F84D8000000 je 00462302 ?
  
  更改以後:
  
  :0046221C FF15B8274D00 Call USER32.PtInRect ?
  
  廣告區域內點擊
  
  :00462222 85C0 test eax, eax
  
  :00462224 E9D9000000 jmp 00462302 ?
  
  
  手工更改方法:
  
  查找16進制代碼:0F 84 D8 00 00 00 8B 46 56
  
  更改為: E9 D9 00 00 00 90
  
  文件偏移為62224h
  
  
  彈出發送消息窗口之前的對象數據調用的程序段
  
  更改以前:
  
  :0042513D 56 push esi
  
  :0042513E 8BF1 mov esi, ecx
  
  :00425140 FFB6F4000000 push dWord ptr [esi+000000F4]
  
  :00425146 FFB6B0000000 push dWord ptr [esi+000000B0]
  
  :0042514C E879810300 call 0045D2CA ?
  
  結構首址
  
  :00425151 33C9 xor ecx, ecx
  
  :00425153 3BC1 cmp eax, ecx ?
  
  成功
  
  :00425155 7431 je 00425188 結構首址
  
  :00425151 33C9 xor ecx, ecx
  
  :00425153 3BC1 cmp eax, ecx ?
  
  成功
  
  :00425155 7431 je 00425188 ?
  
  :00425157 E9E4C40A00 jmp 004D1640 ?
  
  IP地址和端口的程序中
  
  :0042515C 90 nop ?
  
  
  手工更改方法:
  
  查找16進制代碼:39 88 DC 01 00 00 75 08
  
  更改為: E9 E4 C4 0A 00 90
  
  文件偏移為25157h
  
  顯示IP地址和串口的附加程序
  
  :004D1680 803D00174D003A cmp byte ptr [004D1700], 3A ?
  
  字符內存區第一個字符是不是冒號,是就說明沒有IP地址
  
  :004D1687 7509 jne 004D1692 ?
  
  
  :004D1689 66C70500174D003000 mov Word ptr [004D1700], 0030 ?
  
  字符內存區寫上一個"0"
  
  :004D1692 6800174D00 push 004D1700 ?
  
  
  :004D1697 FFB660010000 push dWord ptr [esi+00000160] 告窗口的窗口句柄
  
  :004D169D A1E8714A00 mov eax, dWord ptr [004A71E8] ?
  
  他地方調用SetWindowTextA的地址
  
  :004D16A2 FF10 call dWord ptr [eax] ?
  
  重定位好了的SetWindowTextA的地址
  
  :004D16A4 E9D415F6FF jmp 00432C7D ?
  
  之後
  
  :004D16A9 90 nop ?
  
  對齊好看
  
  :004D16AA 90 nop
  
  :004D16AB 90 nop
  
  :004D16AC 90 nop
  
  :004D16AD 90 nop
  
  :004D16AE 90 nop
  
  :004D16AF 90 nop
  
  wsprintf所用到的模式字符串:
  
  :004D1720 25733A2564 "%s:%d"
  
  
  手工更改方法:
  
  在文件偏移D1680處添加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-B6 60 01 00 00 A1 E8 71
  
  4A 00 FF 10 E9 D4 15 F6- FF 90 90 90 90 90 90 90
  
  
  在文件偏移D1720處添加16進制代碼:
  
  25 73 3A 25 64
  
  保存IP地址和端口的附加程序
  
  :004D1640 8BDC mov ebx, esp ?
  
  針
  
  :004D1642 BC00194D00 mov esp, 004D1900 ?
  
  針到無用的內存區域
  
  :004D1647 50 push eax ?
  
  寄存器
  
  :004D1648 51 push ecx
  
  :004D1649 52 push edx
  
  :004D164A 56 push esi
  
  :004D164B FFB018020000 push dWord ptr [eax+00000218] ?
  
  象端口的地址
  
  :004D1651 FFB014020000 push dWord ptr [eax+00000214] P
  
  地址的字符串指針
  
  :004D1657 6820174D00 push 004D1720 ?
  
  是printf的模式字符
  
  :004D165C 6800174D00 push 004D1700 ?
  
  :004D1661 8B3532CE4900 mov esi, dWord ptr [0049CE32] 他地方調用wsprintfA的地址
  
  :004D1667 FF16 call dWord ptr [esi] ?
  
  重定位好了的wsprintfA的地址
  
  :004D1669 83C410 add esp, 00000010 ?
  
  :004D166C 5E pop esi ?
  
  
  :004D166D 5A pop edx
  
  :004D166E 59 pop ecx
  
  :004D166F 58 pop eax
  
  :004D1670 3988DC010000 cmp dWord ptr [eax+000001DC], ecx ?
  
  原程序00425157處被改掉的有用代碼
  
  :004D1676 8BE3 mov esp, ebx ?
  
  針
  
  :004D1678 E9E03AF5FF jmp 0042515D ?
  
  :004D167D 90 nop
  
  :004D167E 90 nop
  
  :004D167F 90 nop
  
  
  手工更改方法:
  
  在文件偏移D1640處添加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-20 17 4D 00 68 00 17 4D
  
  他地方調用wsprintfA的地址
  
  :004D1667 FF16 call dWord ptr [esi] ?
  
  重定位好了的wsprintfA的地址
  
  :004D1669 83C410 add esp, 00000010 ?
  
  :004D166C 5E pop esi ?
  
  
  :004D166D 5A pop edx
  
  :004D166E 59 pop ecx
  
  :004D166F 58 pop eax
  
  :004D1670 3988DC010000 cmp dWord ptr [eax+000001DC], ecx ?
  
  原程序00425157處被改掉的有用代碼
  
  :004D1676 8BE3 mov esp, ebx ?
  
  針
  
  :004D1678 E9E03AF5FF jmp 0042515D ?
  
  :004D167D 90 nop
  
  :004D167E 90 nop
  
  :004D167F 90 nop
  
  
  手工更改方法:
  
  在文件偏移D1640處添加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-20 17 4D 00 68 00 17 4D
  
  
  消息發送對話框中廣告窗口樣式的更改
  
  更改以前的窗口樣式(style)是50000012h,
  
  WS_CHILDWINDOW|WS_VISIBLE|SS_LEFT|SS_ETCHEDFRAME
  
  更改以後的窗口樣式(style)是50000201h,
  
  WS_CHILDWINDOW|WS_VISIBLE|SS_LEFT|SS_CENTER|SS_CENTERIMAGE
  
  手工更改方法:
  
  在文件偏移141EFCh處把
  
  12 00 00 50
  
  改為 02 01 00 50
  
  
  代碼段段屬性修改
  
  更改以前的代碼段屬性為60000020,CER(包含代碼,可執行,可讀)
  
  更改以後的代碼段屬性為C0000020,CRW(包含代碼,可讀寫和執行)
  
  手工更改方法:
  
  在文件偏移21Ch處把
  
  20 00 00 60
  
  改為 20 00 00 C0
  
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved