亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 鼠標屏幕取詞 原理.txt

?? C++技巧集合 此集合包含很多關于C++變成的技巧,是一個非常不錯的資料集合
?? TXT
?? 第 1 頁 / 共 2 頁
字號:
作者:獨孤九劍
email: mikaiyue@sina.com
日期:6/21/2001 10:21:49 AM
鼠標屏幕取詞 原理
“鼠標屏幕取詞”技術是在電子字典中得到廣泛地應用的,如四通利方和金山詞霸等軟件,這個技術看似簡單,其實在windows系統中實現卻是非常復雜的,總的來說有兩種實現方式: 
第一種:采用截獲對部分gdi的api調用來實現,如textout,textouta等。 
第二種:對每個設備上下文(dc)做一分copy,并跟蹤所有修改上下文(dc)的操作。 
第二種方法更強大,但兼容性不好,而第一種方法使用的截獲windowsapi的調用,這項技術的強大可能遠遠超出了您的想象,毫不夸張的說,利用windowsapi攔截技術,你可以改造整個操作系統,事實上很多外掛式windows中文平臺就是這么實現的!而這項技術也正是這篇文章的主題。 
截windowsapi的調用,具體的說來也可以分為兩種方法: 
第一種方法通過直接改寫winapi 在內存中的映像,嵌入匯編代碼,使之被調用時跳轉到指定的地址運行來截獲;第二種方法則改寫iat(import address table 輸入地址表),重定向winapi函數的調用來實現對winapi的截獲。 
第一種方法的實現較為繁瑣,而且在win95、98下面更有難度,這是因為雖然微軟說win16的api只是為了兼容性才保留下來,程序員應該盡可能地調用32位的api,實際上根本就不是這樣!win 9x內部的大部分32位api經過變換調用了同名的16位api,也就是說我們需要在攔截的函數中嵌入16位匯編代碼! 
我們將要介紹的是第二種攔截方法,這種方法在win95、98和nt下面運行都比較穩定,兼容性較好。由于需要用到關于windows虛擬內存的管理、打破進程邊界墻、向應用程序的進程空間中注入代碼、pe(portable executable)文件格式和iat(輸入地址表)等較底層的知識,所以我們先對涉及到的這些知識大概地做一個介紹,最后會給出攔截部分的關鍵代碼。 
先說windows虛擬內存的管理。windows9x給每一個進程分配了4gb的地址空間,對于nt來說,這個數字是2gb,系統保留了2gb到 4gb之間的地址空間禁止進程訪問,而在win9x中,2gb到4gb這部分虛擬地址空間實際上是由所有的win32進程所共享的,這部分地址空間加載了共享win32 dll、內存映射文件和vxd、內存管理器和文件系統碼,win9x中這部分對于每一個進程都是可見的,這也是win9x操作系統不夠健壯的原因。win9x中為16位操作系統保留了0到4mb的地址空間,而在4mb到2gb之間也就是win32進程私有的地址空間,由于 每個進程的地址空間都是相對獨立的,也就是說,如果程序想截獲其它進程中的api調用,就必須打破進程邊界墻,向其它的進程中注入截獲api調用的代碼,這項工作我們交給鉤子函數(setwindowshookex)來完成,關于如何創建一個包含系統鉤子的動態鏈接庫,《電腦高手雜志》在第?期已經有過專題介紹了,這里就不贅述了。所有系統鉤子的函數必須要在動態庫里,這樣的話,當進程隱式或顯式調用一個動態庫里的函數時,系統會把這個動態庫映射到這個進程的虛擬地址空間里,這使得dll成為進程的一部分,以這個進程的身份執行,使用這個進程的堆棧,也就是說動態鏈接庫中的代碼被鉤子函數注入了其它gui進程的地址空間(非gui進程,鉤子函數就無能為力了), 
當包含鉤子的dll注入其它進程后,就可以取得映射到這個進程虛擬內存里的各個模塊(exe和dll)的基地址,如: 
hmodule hmodule=getmodulehandle(“mypro.exe”); 
在mfc程序中,我們可以用afxgetinstancehandle()函數來得到模塊的基地址。exe和dll被映射到虛擬內存空間的什么地方是由它們的基地址決定的。它們的基地址是在鏈接時由鏈接器決定的。當你新建一個win32工程時,vc++鏈接器使用缺省的基地址0x00400000。可以通過鏈接器的base選項改變模塊的基地址。exe通常被映射到虛擬內存的0x00400000處,dll也隨之有不同的基地址,通常被映射到不同進程 
的相同的虛擬地址空間處。 
系統將exe和dll原封不動映射到虛擬內存空間中,它們在內存中的結構與磁盤上的靜態文件結構是一樣的。即pe (portable executable) 文件格式。我們得到了進程模塊的基地址以后,就可以根據pe文件的格式窮舉這個模塊的image_import_descriptor數組,看看進程空間中是否引入了我們需要截獲的函數所在的動態鏈接庫,比如需要截獲“textouta”,就必須檢查“gdi32.dll”是否被引入了。說到這里,我們有必要介紹一下pe文件的格式,如右圖,這是pe文件格式的大致框圖,最前面是文件頭,我們不必理會,從pe file optional header后面開始,就是文件中各個段的說明,說明后面才是真正的段數據,而實際上我們關心的只有一個段,那就是“.idata”段,這個段中包含了所有的引入函數信息,還有iat(import address table)的rva(relative virtual address)地址。 
說到這里,截獲windowsapi的整個原理就要真相大白了。實際上所有進程對給定的api函數的調用總是通過pe文件的一個地方來轉移的,這就是一個該模塊(可以是exe或dll)的“.idata”段中的iat輸入地址表(import address table)。在那里有所有本模塊調用的其它dll的函數名及地址。對其它dll的函數調用實際上只是跳轉到輸入地址表,由輸入地址表再跳轉到dll真正的函數入口。 

具體來說,我們將通過image_import_descriptor數組來訪問“.idata”段中引入的dll的信息,然后通過image_thunk_data數組來針對一個被引入的dll訪問該dll中被引入的每個函數的信息,找到我們需要截獲的函數的跳轉地址,然后改成我們自己的函數的地址……具體的做法在后面的關鍵代碼中會有詳細的講解。 
講了這么多原理,現在讓我們回到“鼠標屏幕取詞”的專題上來。除了api函數的截獲,要實現“鼠標屏幕取詞”,還需要做一些其它的工作,簡單的說來,可以把一個完整的取詞過程歸納成以下幾個步驟: 
1. 安裝鼠標鉤子,通過鉤子函數獲得鼠標消息。 
使用到的api函數:setwindowshookex 
2. 得到鼠標的當前位置,向鼠標下的窗口發重畫消息,讓它調用系統函數重畫窗口。 
使用到的api函數:windowfrompoint,screentoclient,invalidaterect 
3. 截獲對系統函數的調用,取得參數,也就是我們要取的詞。 
對于大多數的windows應用程序來說,如果要取詞,我們需要截獲的是“gdi32.dll”中的“textouta”函數。 
我們先仿照textouta函數寫一個自己的mytextouta函數,如: 
bool winapi mytextouta(hdc hdc, int nxstart, int nystart, lpcstr lpszstring,int cbstring) 
{ 
// 這里進行輸出lpszstring的處理 
// 然后調用正版的textouta函數 
} 
把這個函數放在安裝了鉤子的動態連接庫中,然后調用我們最后給出的hookimportfunction函數來截獲進程 
對textouta函數的調用,跳轉到我們的mytextouta函數,完成對輸出字符串的捕捉。hookimportfunction的 
用法: 
hookfuncdesc hd; 
proc porigfuns; 
hd.szfunc="textouta"; 
hd.pproc=(proc)mytextouta; 
hookimportfunction (afxgetinstancehandle(),"gdi32.dll",&hd,porigfuns); 
下面給出了hookimportfunction的源代碼,相信詳盡的注釋一定不會讓您覺得理解截獲到底是怎么實現的 
很難,ok,let’s go: 

///////////////////////////////////////////// begin /////////////////////////////////////////////////////////////// 
#include <crtdbg.h> 

// 這里定義了一個產生指針的宏 
#define makeptr(cast, ptr, addvalue) (cast)((dword)(ptr)+(dword)(addvalue)) 

// 定義了hookfuncdesc結構,我們用這個結構作為參數傳給hookimportfunction函數 
typedef struct tag_hookfuncdesc 
{ 
lpcstr szfunc; // the name of the function to hook. 
proc pproc; // the procedure to blast in. 
} hookfuncdesc , * lphookfuncdesc; 

// 這個函數監測當前系統是否是windownt 
bool isnt(); 

// 這個函數得到hmodule -- 即我們需要截獲的函數所在的dll模塊的引入描述符(import descriptor) 
pimage_import_descriptor getnamedimportdescriptor(hmodule hmodule, lpcstr szimportmodule); 

// 我們的主函數 
bool hookimportfunction(hmodule hmodule, lpcstr szimportmodule, 
lphookfuncdesc pahookfunc, proc* paorigfuncs) 
{ 
/////////////////////// 下面的代碼檢測參數的有效性 //////////////////////////// 
_assert(szimportmodule); 
_assert(!isbadreadptr(pahookfunc, sizeof(hookfuncdesc))); 
#ifdef _debug 
if (paorigfuncs) _assert(!isbadwriteptr(paorigfuncs, sizeof(proc))); 
_assert(pahookfunc.szfunc); 
_assert(*pahookfunc.szfunc != '\0'); 
_assert(!isbadcodeptr(pahookfunc.pproc)); 
#endif 
if ((szimportmodule == null) || (isbadreadptr(pahookfunc, sizeof(hookfuncdesc)))) 
{ 
_assert(false); 
setlasterrorex(error_invalid_parameter, sle_error); 
return false; 
} 
////////////////////////////////////////////////////////////////////////////// 

// 監測當前模塊是否是在2gb虛擬內存空間之上 
// 這部分的地址內存是屬于win32進程共享的 
if (!isnt() && ((dword)hmodule >= 0x80000000)) 
{ 
_assert(false); 
setlasterrorex(error_invalid_handle, sle_error); 
return false; 
} 
// 清零 
if (paorigfuncs) memset(paorigfuncs, null, sizeof(proc)); 

// 調用getnamedimportdescriptor()函數,來得到hmodule -- 即我們需要 
// 截獲的函數所在的dll模塊的引入描述符(import descriptor) 
pimage_import_descriptor pimportdesc = getnamedimportdescriptor(hmodule, szimportmodule); 
if (pimportdesc == null) 
return false; // 若為空,則模塊未被當前進程所引入 

// 從dll模塊中得到原始的thunk信息,因為pimportdesc->firstthunk數組中的原始信息已經 
// 在應用程序引入該dll時覆蓋上了所有的引入信息,所以我們需要通過取得pimportdesc->originalfirstthunk 
// 指針來訪問引入函數名等信息 
pimage_thunk_data porigthunk = makeptr(pimage_thunk_data, hmodule, 
pimportdesc->originalfirstthunk); 

// 從pimportdesc->firstthunk得到image_thunk_data數組的指針,由于這里在dll被引入時已經填充了 
// 所有的引入信息,所以真正的截獲實際上正是在這里進行的 
pimage_thunk_data prealthunk = makeptr(pimage_thunk_data, hmodule, pimportdesc->firstthunk); 

// 窮舉image_thunk_data數組,尋找我們需要截獲的函數,這是最關鍵的部分! 
while (porigthunk->u1.function) 
{ 
// 只尋找那些按函數名而不是序號引入的函數 
if (image_ordinal_flag != (porigthunk->u1.ordinal & image_ordinal_flag)) 
{ 
// 得到引入函數的函數名 
pimage_import_by_name pbyname = makeptr(pimage_import_by_name, hmodule, 
porigthunk->u1.addressofdata); 

// 如果函數名以null開始,跳過,繼續下一個函數 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久狠狠亚洲综合| 亚洲午夜三级在线| 欧美三级日韩在线| 99国产一区二区三精品乱码| 国产精品日日摸夜夜摸av| 日韩欧美一区在线观看| 欧美做爰猛烈大尺度电影无法无天| 国产一本一道久久香蕉| 日韩av高清在线观看| 一区二区久久久久久| 在线看不卡av| 91福利小视频| 欧美色综合网站| 欧美色精品在线视频| 日韩一级片在线播放| 国产三级精品三级| 亚洲视频在线一区观看| 亚洲第一综合色| 精品一区二区三区在线观看国产| 国产精品一区免费视频| 色婷婷综合久久久久中文一区二区| 在线看日本不卡| 欧美精品一区二区三区高清aⅴ| 国产亚洲欧洲997久久综合| 日韩一区在线播放| 午夜欧美一区二区三区在线播放| 久久 天天综合| 91欧美激情一区二区三区成人| 欧美喷水一区二区| 国产亚洲成aⅴ人片在线观看| 一区二区三区欧美日| 裸体在线国模精品偷拍| av日韩在线网站| 欧美一区二区三区影视| 亚洲视频在线一区| 久久99久久99精品免视看婷婷| 不卡的av在线| 精品国产免费人成电影在线观看四季 | 欧美日韩卡一卡二| 精品精品国产高清一毛片一天堂| 中文字幕佐山爱一区二区免费| 美国一区二区三区在线播放| 色欧美88888久久久久久影院| 久久久久久久久久美女| 亚洲成人资源网| 99久久精品国产毛片| 欧美一卡二卡三卡| 综合激情成人伊人| 国产精品综合久久| 欧美一区二区福利在线| 一区二区三区小说| eeuss国产一区二区三区| 精品伦理精品一区| 五月婷婷欧美视频| 欧洲精品一区二区| 亚洲老妇xxxxxx| 97久久人人超碰| 亚洲国产精品精华液2区45| 韩国精品久久久| 69堂精品视频| 午夜影院久久久| 欧洲生活片亚洲生活在线观看| 国产精品麻豆网站| 成人免费三级在线| 欧美激情艳妇裸体舞| 国产伦理精品不卡| 国产午夜精品福利| 国产精品自拍av| 中文字幕乱码久久午夜不卡| 国产精品亚洲专一区二区三区| 久久影视一区二区| 国模无码大尺度一区二区三区| 精品久久人人做人人爽| 久久91精品国产91久久小草| 精品国产乱码久久久久久牛牛| 狠狠色丁香久久婷婷综| 国产亚洲精久久久久久| 国产大片一区二区| 国产精品福利av| 91亚洲精品乱码久久久久久蜜桃| 亚洲免费观看在线观看| 欧美亚洲综合久久| 天堂av在线一区| 精品国一区二区三区| 国产99久久久国产精品潘金| 国产精品久久一卡二卡| 99久久伊人网影院| 亚洲综合在线观看视频| 欧美福利视频一区| 美女一区二区三区| 日本一区二区视频在线观看| 91视视频在线直接观看在线看网页在线看| 亚洲欧美在线观看| 69堂国产成人免费视频| 国产精品456露脸| 亚洲品质自拍视频网站| 欧美日韩成人综合天天影院| 免费成人av在线| 久久久久9999亚洲精品| 色综合久久中文字幕| 免费在线观看日韩欧美| 久久精品欧美一区二区三区麻豆| 成人性生交大片免费看在线播放| 一区二区三区欧美| 久久嫩草精品久久久精品一| 99精品视频一区| 美女脱光内衣内裤视频久久网站| 中文字幕不卡在线播放| 欧洲精品中文字幕| 麻豆中文一区二区| 依依成人综合视频| 精品嫩草影院久久| 欧美少妇bbb| 成人国产精品视频| 另类小说欧美激情| 一个色综合av| 国产无遮挡一区二区三区毛片日本| 在线观看成人小视频| 国产成a人亚洲精品| 手机精品视频在线观看| 18成人在线观看| 国产人成一区二区三区影院| 欧美电影在线免费观看| 波多野结衣精品在线| 久久狠狠亚洲综合| 五月天国产精品| 亚洲欧美乱综合| 国产欧美日韩卡一| 日韩欧美成人激情| 91福利在线导航| 91视频在线看| 成人丝袜视频网| 国产一区在线不卡| 欧美aaaaa成人免费观看视频| 一区二区欧美在线观看| 18欧美亚洲精品| 国产精品初高中害羞小美女文| 国产视频亚洲色图| 精品国产青草久久久久福利| 7777精品伊人久久久大香线蕉| 欧美视频在线播放| 在线精品亚洲一区二区不卡| 色婷婷精品大视频在线蜜桃视频| av激情综合网| 成人动漫一区二区三区| 成人a区在线观看| av一区二区三区在线| 成人黄色小视频| 99在线精品免费| 99久久精品免费| 91国在线观看| 欧美三级电影一区| 欧美日韩在线不卡| 日韩一区二区三区在线视频| 日韩一卡二卡三卡国产欧美| 日韩一卡二卡三卡| 久久久www成人免费无遮挡大片| 久久亚洲精精品中文字幕早川悠里 | 欧美日韩一区二区三区四区| 欧美日本乱大交xxxxx| 日韩欧美一区二区在线视频| 日韩精品一区国产麻豆| 久久精品一区二区三区av| 欧美韩日一区二区三区| 中文字幕日韩一区二区| 亚洲激情五月婷婷| 青青草视频一区| 国产老女人精品毛片久久| 暴力调教一区二区三区| 欧美曰成人黄网| 7777精品伊人久久久大香线蕉的| 日韩女优视频免费观看| 日本一区二区视频在线| 尤物av一区二区| 免费av成人在线| 国产成人精品影视| 欧美亚一区二区| 2019国产精品| 一区二区三区四区激情| 久久99在线观看| 91性感美女视频| 51精品秘密在线观看| 国产精品天干天干在观线| 亚洲欧美色一区| 婷婷激情综合网| 成人国产精品免费| 日韩一二在线观看| 亚洲视频免费在线| 蜜乳av一区二区三区| 91女神在线视频| 久久夜色精品一区| 日日夜夜一区二区| 国产成人亚洲精品青草天美| 欧亚洲嫩模精品一区三区| 久久久精品国产99久久精品芒果| 亚洲午夜私人影院| 不卡一卡二卡三乱码免费网站| 日韩一级大片在线| 亚洲福中文字幕伊人影院| 岛国精品在线观看|