翻譯(1) (6千字)
看雪資料發表於2000-07-22
膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊?
膊 ____ __ __ 膊
膊 / _/_ _ __ _ ___ ____/ /____ _/ / 膊
膊 _/ // ' \/ ' \/ _ \/ __/ __/ _ `/ / 膊
膊 /___/_/_/_/_/_/_/\___/_/ \__/\_,_/_/ 膊
膊 ____ __ __ 膊
膊 / __ \___ ___ _______ ___ ___/ /__ ____ / /____膊
膊 / /_/ / -_|_-</ __/ -_) _ \/ _ / _ `/ _ \/ __(_-<膊
膊/_____/\__/___/\__/\__/_//_/\_,_/\_,_/_//_/\__/___/膊
膊 膊
膊 Web: http://www.ImmortalDescendants.com 膊
膊 Author: UmE 膊
膊 Date: 03/13/00 膊
膊 Topic: Re-enabling functions - Cool Edit 2000 膊
膊 Level: Beginner/Intermediate 膊
膊 膊
膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊膊?
介紹:現在有許多軟體是以演示版(有一些功能被禁止)提供給使用者的.多數
情況下,被禁止的功能按鈕是灰色的.一般來說,我們能夠利用EnableMenuItem
這個API函式啟用它們,但是它們被啟用後不能正常工作.在這篇文章中,我將
介紹如何使演示版的軟體正常工作.
所用工具:SoftIce 3.24 或更高版本
試驗軟體:Cool Edit 2000, cool2000.exe, 3420160位元組
讓我們開始吧!!!
步驟1:
當你執行程式時,出現一對話方塊,提示你想啟用那個功能.那意思就是說,你不能
使用軟體的所用功能,但同時也意味著這個程式包含所有被禁止功能的程式,
它是在啟動時,根據你的選擇進行切換的.我們的工作就是使所有的功能都能使用.
如果我們啟用選項3和4,軟體就提供Filters,Noise redction,Amplify,Envelope...
但除了Save功能.我將教你如何在它被禁止的時候啟用它,啟用其他功能的過程與
此相同.
首先,開啟一個檔案,你能看到在File選單中的Save和Save As項是灰色的.
我們想啟用它,因此進入SoftIce(按CTRL+D)並設斷點(bpx enablemenuitem).
EnableMenuItem函式的結構如下:
BOOL EnableMenuItem (
HMENU hMenu // handle to menu resource
UINT uIDEnableItem // menu item to enable, disable or gray
UINT uEnable // menu item flags
);
在ASM中呼叫的格式是:
PUSH uEnable
PUSH uIDEnableItem
PUSH hMenu
CALL [KERNEL32!EnableMenuItem]
對於我們來說,重要的是找到那個啟用選單項的標誌
我們知道:
uEnable=0 選單項被啟用(the item is enabled)
好吧,現在退出SoftIce,點選File選單,馬上你又回到SoftIce.按F11鍵返回到:
:00411580 6A01 push 00000001 <-uEnable flag
:00411582 6875010000 push 00000175
:00411587 56 push esi
:00411588 FFD3 call ebx <- Call EnableMenuItem
這不是我們要找的,因為它傳遞了一個常數給函式
如果你按Ctrl+D,程式將繼續執行EnableMenuItem功能enable或disable各選單項
在這個過程中,請注意EBP暫存器儲存的是uIDEnableItem,直到你看到EBP=047E.
這個ID正好是Save As選單項(你可以用W32Dasm反彙編cool2000.exe並找到此ID,
在列表開始部分的選單資訊區)
當你看到EBP=047E時按F11後程式如下
:004128A5 668B440C1C mov ax, word ptr [esp+ecx+1C]
:004128AA 50 push eax
:004128AB 55 push ebp
:004128AC 56 push esi
:004128AD FF15D0535600 Call dword ptr [005653D0] <-EnableMenuItem
eax(uEnable標誌)的值取決於ESP和ECX.我們只要將"mov ax,word ptr[esp+ecx+1c]"
改為"mov ax,0000"(注意在指令後面加nop,保證與前面指令位元組數相同),這樣程式將
把0傳遞給EnableMenuItem函式.按上面的方法修改後,重新啟動程式,你將看到Save As
選單項已經enable了.但是當你按Save As時,程式自動關閉了.到底發生了什麼事情?
跟我來你會看到!!!
步驟2:現在我們已經啟用了所有選單項,我們希望它們能工作.
正如你知道的:當點選選單項時,程式將發出一個WM_COMMAND給系統,系統將根據相關
的ID處理它.
開啟SoftIce並輸入"hwnd".這條命令將返回所有在桌面上已開視窗的handle.
你可看到下列內容:
Window Handle hQueue Sz QOwner Class Name Window Procedure
我們感興趣的是window如何處理Cool Edit的主視窗.我們想從WM_COMMAND產生的地方
觀察到底發生了什麼.注意下面:
Window Handle hQueue Sz QOwner Class Name Window Procedure
0414(1) 1087 32 COOL2000 COOL2000SS 32CF:0000051E
現在在message WM_COMMAND(it needs also the handel of the window)處設斷點
bmsg 0414 WM_COMMAND
從SoftIce中退出並點選Save As選單項......你將回到SoftIce.
記住我們要找的是處理此ID號的一小段程式碼:我們能在source code中找到,因為
程式設計者不可能修改系統dll使其適應他的程式!
設定下面的斷點:bpx k32thk1632prolog(想了解為什麼?在www.ImmortalDescendants.com
站點可找到相關資料),按Ctrl+D退出SoftIce,但馬上又回來了,按F11鍵,到:
CALL [KERNEL32!K32Thk1632Prolog]
CALL [.....] <-This is very important!!
CALL [KERNEL32!K32Thk1632Epilog]
按F8進入[KERNEL32!K32Thk1632Prolog]後面的call,直到你找到cool2000的程式碼,
現在注意各個暫存器的值,繼續跟蹤直到:
:004C896D 8B8C24EC010000 mov ecx, dword ptr [esp+000001EC]
:004C8974 8B9424E8010000 mov edx, dword ptr [esp+000001E8]
:004C897B 51 push ecx
:004C897C 52 push edx <- 1
:004C897D 57 push edi <- 2
:004C897E 50 push eax <- 3
:004C897F FF15C4545600 Call dword ptr [005654C4] <- 4
1-將edx壓入堆疊(edx=111).這是WM_COMMAND資訊的HEX碼
2-將edi壓入堆疊(edi=047e).這是Save As選單項的ID
3-將eax壓入堆疊(eax=0414).這是cool2000的window handle
4-呼叫SendMessageA函式
這個功能將WM_COMMAND資訊傳送到系統的資訊佇列.下一步這個資訊將被 DefWindowProcA函式
處理.按F8進入SendMessageA函式直到你再次來到cool2000的程式碼,在此我們將找到關鍵點:
:00422900 55 push ebp
:00422901 8BEC mov ebp, esp
:00422903 83E4F8 and esp, FFFFFFF8
:00422906 B854140000 mov eax, 00001454
:0042290B E890FE1100 call 005427A0
:00422910 A124AE5800 mov eax, dword ptr [0058AE24]
:00422915 53 push ebx
:00422916 56 push esi
注意EDI=047E,繼續跟蹤你將發現程式如何使用EDI
從此處我們的ID將與各種常數比較以確定我們選擇的ID.
跟蹤若干行後,發現:
:0042C389 81FF7E040000 cmp edi, 0000047E <-Yeah!! Our ID!!
:0042C38F 0F8738070000 ja 0042CACD
:0042C395 0F840A080000 je 0042CBA5 <-Jump to 0042CBA5
At 0042CBA5 we find:
:0042CBA5 6A01 push 00000001
:0042CBA7 E8C4AB0600 call 00497770
:0042CBAC 83C404 add esp, 00000004
:0042CBAF 85C0 test eax, eax
:0042CBB1 7511 jne 0042CBC4
在0042CBA7的call用於選擇被選的ID是處理還是跳過.
如果eax=0,ID被跳過;eax=1,ID被處理.
因此將jne改為jmp,Save As選單項將恢復功能
希望你能喜歡此教程!
Bye!
UmE
Contact me at: ume15@hotmail.com
相關文章
- docker官方文件翻譯12018-05-01Docker
- Laravel6.X 手冊翻譯2019-10-28Laravel
- 【翻譯】.NET 6 中的 dotnet monitor2021-12-06
- Filecoin Spec 翻譯 —— 【1】概述(下)2020-03-21
- 翻譯:man getopt(1)中文手冊2018-10-08
- 翻譯 | Learning React Without Using React Part 12018-12-20React
- 【翻譯】.NET 5 RC1釋出2020-09-15
- [翻譯] JavaScript函式的6個基本術語2019-04-09JavaScript函式
- 掘金翻譯計劃月報 — 2018 年 6 月2018-07-03
- 【風農翻譯】開始畫畫素畫 #62020-10-19
- 翻譯2020-12-29
- 1.某道翻譯js逆向sign值2024-04-21JS
- 蝴蝶書-task2: 文字推理、摘要、糾錯 transformers實現翻譯 OpenAI翻譯 PyDeepLX翻譯 DeepLpro翻譯2024-04-29ORMOpenAI
- Ubuntu安裝劃詞翻譯軟體Goldendict 單詞翻譯 句子翻譯2021-01-05UbuntuGo
- 如何完成中文翻譯日文線上翻譯2019-09-23
- 【風農翻譯】開始畫畫素畫 #12020-08-05
- MIT 6.824(Spring 2020) Lab1: MapReduce 文件翻譯2022-05-31MITSpring
- Laravel 谷歌翻譯 /Bing 翻譯擴充套件包2019-06-11Laravel谷歌套件
- OpenCV翻譯專案總結二——Mat翻譯2019-07-13OpenCV
- 騰訊互動翻譯的坑爹翻譯2024-12-10
- 使用google翻譯 api 翻譯中文成其他語言2018-08-06GoAPI
- 文件翻譯器怎麼用?如何翻譯Word文件?2019-08-15
- 有道雲詞典--翻譯/螢幕取詞翻譯2020-12-12
- TailWind文件翻譯說明以及每日翻譯進度2021-01-19AI
- 關於es6一篇英文流程請大家翻譯2019-02-16
- 【風農翻譯】畫素寶典 #6 魔法特效、肖像、飛行2019-12-12特效
- 翻譯介面整理2018-11-14
- Python 谷歌翻譯2018-08-14Python谷歌
- 翻譯軟體2019-05-03
- 翻譯|Thinking Statefully2019-04-27ThinkingStatefully
- MPAndroidChart文件翻譯2019-02-19Android
- bulma中文翻譯2024-08-31
- 歌詞翻譯2024-09-13
- socket中文翻譯2024-11-09
- 詞典翻譯 英譯漢2018-07-21
- Arctime怎麼翻譯字幕?Arctime批次翻譯字幕的技巧2020-07-14
- Python 使用白嫖網易翻譯 API 進行翻譯2020-04-11PythonAPI
- Google 谷歌翻譯 Mac 客戶端(Mac翻譯軟體)2022-03-23Go谷歌Mac客戶端
- QT TS檔案翻譯,部分不能正確被翻譯2021-01-02QT