線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3296
推到 Plurk!
推到 Facebook!

螢幕抓字技術揭密

 
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-10-26 03:23:59 IP:210.65.xxx.xxx 未訂閱
此為轉貼資料 螢幕抓字技術揭密 ----------深入WINDOWS內部探險手記 鄭州 馬飛濤 一 公開它! 四通利方和金山詞霸的用戶都曾見識過螢幕抓字技術,滑鼠指哪就翻譯哪個單詞,這個技術看似簡單,其實在WINDOWS系統中實現卻是非常複雜和有趣的。 經 過 半年多的艱辛探索,筆者終於破解了其中的秘密,並在今天決定公開它,這個人 人 都曾見過但是卻鮮有人知的秘密,這個只被幾家軟體公司壟斷從未在公開的報刊資料披露過隻言片語的秘密! 回想這半年多的探索,其中浸潤了多少筆者的苦悶與歡樂,絕望與興奮,挫 折 與收穫,現在都終於有了結果:將螢幕抓字技術的秘密公開,獻給孜孜不倦辛勤 工 作的程式師們。如果這樣做能?國產軟體事業的發展效微薄之力,對筆者來說, 也是一樁快事! 二 初識螢幕抓字 最初知道螢幕抓字, 是在購買了?英漢通?軟體之後。 當時筆者還只是一 個 VISUAL BASIC 的初學者, 對WINDOWS 系統內部的知識瞭解並不多, 認? 在 WINDOWS系統中螢幕抓字的實現應該和DOS系統中的一樣,調用一個DOS 中斷取螢幕 上的字元或直接讀顯示記憶體的內容就可以了。 三 看似很簡單,其實不然 隨著對WINDOWS系統的認識不斷深入,才發現問題並不象想得那?簡單。首先,翻閱了WINODWS應用程式介面(API)中的上千個函數,並沒有發現有一個現成的類似於getWordFromPoint()的函數;根據使用經驗,經過判斷發現螢幕抓字採用的也不是圖像識別技術;翻閱了SDK的聯機文檔中沒有,DDK的聯機文檔中也沒有;顯示卡編程介面的資料則很難獲得,有的也只是CGA到VGA顯存的基本知識。 回想當時坐 在機子前,面對一屏屏的聯機資料(如果是紙,將堆積如山),感覺就是在黑暗中的大海裏航行,沒有方向,沒有燈光,但強烈的興趣緊抓著我,一定要把這個謎解開。 四 選擇合適的編程工具 突然又有了一些新的想法: 可否試著截獲WINDOWS中關於字元的消息呢? DC(設備描述表)到底是什?? WINDOWS的TextOut函數是否將TEXT放在DC的某個單元中? 顯然,用VISUAL BASIC就力不從心了。在DOS中用TURBO C編程筆者還算熟練,因此先嘗試用VISUAL C ,但是奇慢的編譯速度使人難以忍受, 高度抽象的類讓人一頭霧水,開發商務軟體可能還行,但開發這樣一個深入WINDOWS 內部的系統軟 件,望著一堆纏繞不清的類和消息,真有點牛刀宰雞、刺刀耕田的感覺。最後選擇了DELPHI,第一印象是編譯速度真快,在我的祖父型386 機子上編譯一個WINDOWS程式,速度和用TURBO C的速度感覺差不多,真讓人興奮得愛不釋手。 隨著不斷使用,發覺DELPHI真是一個好的快速開發工具,(快速並不意味著簡單粗糙,而是和WINDOWS系統有混然一體良好介面的表現)讓初學者也很容易上手。 調用各種WINDOWS 函數(包括很多未公開的函數)都非常直接迅速,用它來作開發工具,大有刺刀見紅、一劍封喉的痛快感覺。 五 山窮水盡疑無路 隨著對WINDOWS系統瞭解的深入,我逐漸明白了在向螢幕輸出文字時,WINDOWS系統僅僅只是對某個應用程式發送WM_PAINT消息,告訴該應用程式視窗用戶區已經"無效"而需要重畫。具體的"繪製"工作(選擇字體,?色,文字)由應用程式完成。 應用程式在處理WM_PAINT消息時,調用BeginPaint和EndPaint來獲得和釋放設備描述表,調用DrawText、ExtTextOut、 TextOut等函數在設備描述表中"繪製" 文字。 應用程式"繪製"文字, 就象學生(應用程式)奉命(獲得 WM_PAINT消息 ) 用老師(WINDOWS)提供的畫筆(DrawText ExtTextOut TextOut等) 在黑板上畫畫一樣,雖然大家能看到畫的是什?字,但是畫筆作?繪圖工具並不知道畫的是什?。 老師(WINDOWS)不知道學生(應用程式)到底用什?字體,?色,畫哪些文字。 總之 ,WINDOWS並不知道應用程式"繪製"的是什?。"文字"對 WINDOWS 來說只是畫筆留在黑板(螢幕)上的粉筆印,只是繪畫的痕?。"文字"只存在于 應用程式的模組中,對WINDOWS系統是"不可見"的。 到處走投無路,真想掂5000塊錢,跑到"英漢通"公司買回這個秘密。仔細 一 想,錢太少,就是多掂10倍,人家也不一定說。 六 柳暗花明又一村 經過再三考慮,我聯想到在DOS系統中編程,會採取改變中斷向量地址, 設置 新的中斷向量的技術:如果系統調用這個中斷,就會先進入新的中斷服務程式,然後再調用原來的中斷服務程式。那末,在WINDOWS系統中也採取這種技術,使系統如果調用某個函數, 先進入一個跟蹤函數,取得原函數的參數,再調用原來的函數。聽起來是否象病毒傳染和發作?其實很多程式都採用過類似技術。大學畢業設計音效卡時我就用過。至此, 我認識到應該放棄常規的思路, 採取一些技巧, 截獲 TextOut 、 ExtTextOut等函數,使之轉向我的跟蹤函數,在此查看應用程式(學生)的堆疊 中 傳遞給畫筆(TextOut、ExtTextOut等函數)的參數, 從而獲得應用程式要在螢幕 上寫的"文字"。 七 " 螢幕抓字"的實現 1 用SetWindowsHookEx()安裝滑鼠?子MouseProc; 2 在螢幕上移動滑鼠時,系統就會調用滑鼠?子MouseProc; 3 進入MouseProc,獲得滑鼠的座標(x,y), 設置對TextOut()、ExtTextOut()等的跟蹤程式, 用nvalidateRect()告訴系統該點(x,y)"失效"; 4 系統發出WM_PAINT消息,指示該點(x,y)處的應用程式重繪"失效"的區域。 5 負責繪製該點()的應用程式在受到 WM_PAINT 消息後, 就有機會調用 TextOut()、 ExtTextOut()等函數。 6 調用的函數被攔截進入跟蹤程式:設置好了的跟蹤程式截獲了該次調用, 從 應用程式的堆疊中取出 該點(x,y)"文字"的指標; 7 從應用程式的資料段中將"文字"指標的內容取出,即完成了一次"螢幕抓字"; 8 退出跟蹤程式,返回到滑鼠?子MouseProc; 9 在MouseProc中解除對TextOut() ExtTextOut()的跟蹤; 10 退出MouseProc滑鼠?副程式,控制權交給系統。 11 在螢幕上移動滑鼠,開始下一次"螢幕抓字",返回步驟2。 八 前景展望 掌握了"螢幕抓字"的技術秘密,稍加改變,我們就可對WINDOWS 系統中的任意一個函數調用進行動態地攔截、跟蹤、修改和恢復,就可讓WINDOWS 系統中的任意一個函數按我們的設想工作,就可構造自己的外挂漢字平臺,設計改變字體的放大鏡、改變?色的變色鏡,保護視力的軟體視保屏等等。 九 後記 希望此文能?磚引玉,?大家編程時能找到捷徑,開拓出新的思路;對攔截、跟蹤感興趣的朋友也請來信交流切磋,如需DLL 或"抓字"的源代 碼,敬請 與 mafeitao@371.net 聯繫; 如能得到"四通利方"、"金山詞霸"、"英漢通"等公司的教導與指正 , 筆者不勝感激。 -- ※ 來源:.網易虛擬社區 http://club.netease.com.[FROM: 202.103.183.253]
------
**********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好

Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind
8866
中階會員


發表:27
回覆:147
積分:69
註冊:2002-10-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-10-26 09:50:07 IP:61.230.xxx.xxx 未訂閱
引言: 此為轉貼資料 螢幕抓字技術揭密 ----------深入WINDOWS內部探險手記 鄭州 馬飛濤 一 公開它! 四通利方和金山詞霸的用戶都曾見識過螢幕抓字技術,滑鼠指哪就翻譯哪個單詞,這個技術看似簡單,其實在WINDOWS系統中實現卻是非常複雜和有趣的。 經 過 半年多的艱辛探索,筆者終於破解了其中的秘密,並在今天決定公開它,這個人 人 都曾見過但是卻鮮有人知的秘密,這個只被幾家軟體公司壟斷從未在公開的報刊資料披露過隻言片語的秘密! 回想這半年多的探索,其中浸潤了多少筆者的苦悶與歡樂,絕望與興奮,挫 折 與收穫,現在都終於有了結果:將螢幕抓字技術的秘密公開,獻給孜孜不倦辛勤 工 作的程式師們。如果這樣做能?國產軟體事業的發展效微薄之力,對筆者來說, 也是一樁快事! 二 初識螢幕抓字 最初知道螢幕抓字, 是在購買了?英漢通?軟體之後。 當時筆者還只是一 個 VISUAL BASIC 的初學者, 對WINDOWS 系統內部的知識瞭解並不多, 認? 在 WINDOWS系統中螢幕抓字的實現應該和DOS系統中的一樣,調用一個DOS 中斷取螢幕 上的字元或直接讀顯示記憶體的內容就可以了。 三 看似很簡單,其實不然 隨著對WINDOWS系統的認識不斷深入,才發現問題並不象想得那?簡單。首先,翻閱了WINODWS應用程式介面(API)中的上千個函數,並沒有發現有一個現成的類似於getWordFromPoint()的函數;根據使用經驗,經過判斷發現螢幕抓字採用的也不是圖像識別技術;翻閱了SDK的聯機文檔中沒有,DDK的聯機文檔中也沒有;顯示卡編程介面的資料則很難獲得,有的也只是CGA到VGA顯存的基本知識。 回想當時坐 在機子前,面對一屏屏的聯機資料(如果是紙,將堆積如山),感覺就是在黑暗中的大海裏航行,沒有方向,沒有燈光,但強烈的興趣緊抓著我,一定要把這個謎解開。 四 選擇合適的編程工具 突然又有了一些新的想法: 可否試著截獲WINDOWS中關於字元的消息呢? DC(設備描述表)到底是什?? WINDOWS的TextOut函數是否將TEXT放在DC的某個單元中? 顯然,用VISUAL BASIC就力不從心了。在DOS中用TURBO C編程筆者還算熟練,因此先嘗試用VISUAL C ,但是奇慢的編譯速度使人難以忍受, 高度抽象的類讓人一頭霧水,開發商務軟體可能還行,但開發這樣一個深入WINDOWS 內部的系統軟 件,望著一堆纏繞不清的類和消息,真有點牛刀宰雞、刺刀耕田的感覺。最後選擇了DELPHI,第一印象是編譯速度真快,在我的祖父型386 機子上編譯一個WINDOWS程式,速度和用TURBO C的速度感覺差不多,真讓人興奮得愛不釋手。 隨著不斷使用,發覺DELPHI真是一個好的快速開發工具,(快速並不意味著簡單粗糙,而是和WINDOWS系統有混然一體良好介面的表現)讓初學者也很容易上手。 調用各種WINDOWS 函數(包括很多未公開的函數)都非常直接迅速,用它來作開發工具,大有刺刀見紅、一劍封喉的痛快感覺。 五 山窮水盡疑無路 隨著對WINDOWS系統瞭解的深入,我逐漸明白了在向螢幕輸出文字時,WINDOWS系統僅僅只是對某個應用程式發送WM_PAINT消息,告訴該應用程式視窗用戶區已經"無效"而需要重畫。具體的"繪製"工作(選擇字體,?色,文字)由應用程式完成。 應用程式在處理WM_PAINT消息時,調用BeginPaint和EndPaint來獲得和釋放設備描述表,調用DrawText、ExtTextOut、 TextOut等函數在設備描述表中"繪製" 文字。 應用程式"繪製"文字, 就象學生(應用程式)奉命(獲得 WM_PAINT消息 ) 用老師(WINDOWS)提供的畫筆(DrawText ExtTextOut TextOut等) 在黑板上畫畫一樣,雖然大家能看到畫的是什?字,但是畫筆作?繪圖工具並不知道畫的是什?。 老師(WINDOWS)不知道學生(應用程式)到底用什?字體,?色,畫哪些文字。 總之 ,WINDOWS並不知道應用程式"繪製"的是什?。"文字"對 WINDOWS 來說只是畫筆留在黑板(螢幕)上的粉筆印,只是繪畫的痕?。"文字"只存在于 應用程式的模組中,對WINDOWS系統是"不可見"的。 到處走投無路,真想掂5000塊錢,跑到"英漢通"公司買回這個秘密。仔細 一 想,錢太少,就是多掂10倍,人家也不一定說。 六 柳暗花明又一村 經過再三考慮,我聯想到在DOS系統中編程,會採取改變中斷向量地址, 設置 新的中斷向量的技術:如果系統調用這個中斷,就會先進入新的中斷服務程式,然後再調用原來的中斷服務程式。那末,在WINDOWS系統中也採取這種技術,使系統如果調用某個函數, 先進入一個跟蹤函數,取得原函數的參數,再調用原來的函數。聽起來是否象病毒傳染和發作?其實很多程式都採用過類似技術。大學畢業設計音效卡時我就用過。至此, 我認識到應該放棄常規的思路, 採取一些技巧, 截獲 TextOut 、 ExtTextOut等函數,使之轉向我的跟蹤函數,在此查看應用程式(學生)的堆疊 中 傳遞給畫筆(TextOut、ExtTextOut等函數)的參數, 從而獲得應用程式要在螢幕 上寫的"文字"。 七 " 螢幕抓字"的實現 1 用SetWindowsHookEx()安裝滑鼠?子MouseProc; 2 在螢幕上移動滑鼠時,系統就會調用滑鼠?子MouseProc; 3 進入MouseProc,獲得滑鼠的座標(x,y), 設置對TextOut()、ExtTextOut()等的跟蹤程式, 用nvalidateRect()告訴系統該點(x,y)"失效"; 4 系統發出WM_PAINT消息,指示該點(x,y)處的應用程式重繪"失效"的區域。 5 負責繪製該點()的應用程式在受到 WM_PAINT 消息後, 就有機會調用 TextOut()、 ExtTextOut()等函數。 6 調用的函數被攔截進入跟蹤程式:設置好了的跟蹤程式截獲了該次調用, 從 應用程式的堆疊中取出 該點(x,y)"文字"的指標; 7 從應用程式的資料段中將"文字"指標的內容取出,即完成了一次"螢幕抓字"; 8 退出跟蹤程式,返回到滑鼠?子MouseProc; 9 在MouseProc中解除對TextOut() ExtTextOut()的跟蹤; 10 退出MouseProc滑鼠?副程式,控制權交給系統。 11 在螢幕上移動滑鼠,開始下一次"螢幕抓字",返回步驟2。 八 前景展望 掌握了"螢幕抓字"的技術秘密,稍加改變,我們就可對WINDOWS 系統中的任意一個函數調用進行動態地攔截、跟蹤、修改和恢復,就可讓WINDOWS 系統中的任意一個函數按我們的設想工作,就可構造自己的外挂漢字平臺,設計改變字體的放大鏡、改變?色的變色鏡,保護視力的軟體視保屏等等。 九 後記 希望此文能?磚引玉,?大家編程時能找到捷徑,開拓出新的思路;對攔截、跟蹤感興趣的朋友也請來信交流切磋,如需DLL 或"抓字"的源代 碼,敬請 與 mafeitao@371.net 聯繫; 如能得到"四通利方"、"金山詞霸"、"英漢通"等公司的教導與指正 , 筆者不勝感激。 -- ※ 來源:.網易虛擬社區 http://club.netease.com.[FROM: 202.103.183.253]
我記得沒錯的話我是一年前看到此篇文章 . 它所用的技術應該是 API HOOK 此等技術 !!! 不過此篇文章看看是可 , 但進一步好像要付費喔 ("抓字"的源 代碼 , 與 API HOOK 等底層技術 ) !
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-27 13:39:58 IP:218.80.xxx.xxx 未訂閱
我试了很多代码,在win2000/win2003都可以的,在win98下都不能成功拦截API, 主要是VirtualProtect失败,或WriteProcessMemory失败,谁有可行的代码?     久病成良医--多试 千人之诺诺,不如一士之谔谔--兼听
------
江上何人初见月,江月何年初照人
系統時間:2024-05-08 5:57:07
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!