?? csdn_文檔中心_屏幕取詞核心內幕.htm
字號:
<P class=MsoNormal
style="MARGIN-LEFT: 35.4pt; TEXT-INDENT: -21.25pt; mso-list: l26 level1 lfo26; tab-stops: list 35.4pt"><SPAN
style="FONT: 7pt 'Times New Roman'"><SPAN lang=EN-US
style="FONT-FAMILY: Symbol"></SPAN></SPAN><SPAN
lang=EN-US>32</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">位代碼與</SPAN><SPAN
lang=EN-US>16</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">位代碼的數據交換</SPAN></P>
<P class=MsoNormal
style="MARGIN-LEFT: 35.4pt; TEXT-INDENT: -21.25pt; mso-list: l26 level1 lfo26; tab-stops: list 35.4pt"><SPAN
style="FONT: 7pt 'Times New Roman'"><SPAN lang=EN-US
style="FONT-FAMILY: Symbol"> </SPAN></SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">動態修改</SPAN><SPAN
lang=EN-US>Windows</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">內核</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US> </SPAN><SPAN lang=EN-US
style="FONT-SIZE: 12pt; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: 黑體">1.<SPAN
style="FONT: 7pt 'Times New Roman'"> </SPAN></SPAN><SPAN
lang=EN-US
style="FONT-SIZE: 12pt; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: 黑體">32bit</SPAN><SPAN
style="FONT-FAMILY: 黑體; FONT-SIZE: 12pt; mso-ascii-font-family: Arial; mso-bidi-font-size: 10.0pt">到</SPAN><SPAN
lang=EN-US
style="FONT-SIZE: 12pt; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: 黑體">16bit</SPAN><SPAN
style="FONT-FAMILY: 黑體; FONT-SIZE: 12pt; mso-ascii-font-family: Arial; mso-bidi-font-size: 10.0pt">的形式替換(</SPAN><SPAN
lang=EN-US
style="FONT-SIZE: 12pt; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: 黑體">Thunk</SPAN><SPAN
style="FONT-FAMILY: 黑體; FONT-SIZE: 12pt; mso-ascii-font-family: Arial; mso-bidi-font-size: 10.0pt">)</SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 18pt"><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">形式替換是指那些允許從</SPAN><SPAN
lang=EN-US>16</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">位代碼調用</SPAN><SPAN
lang=EN-US>32</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">位代碼或從</SPAN><SPAN
lang=EN-US>32</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">位代碼調用</SPAN><SPAN
lang=EN-US>16</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">位代碼的技術。形式替換用于解決試圖在同一操作系統或同一可執行程序上使</SPAN><SPAN
lang=EN-US>16</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">位代碼與</SPAN><SPAN
lang=EN-US>32</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">位代碼同時并存的問題,即</SPAN><SPAN
lang=EN-US>16</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">位代碼與</SPAN><SPAN
lang=EN-US>32</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">位代碼的混合編程技術。早期的</SPAN><SPAN
lang=EN-US>DOS</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">程序及</SPAN><SPAN
lang=EN-US>Window3.x</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">上的應用程序均為</SPAN><SPAN
lang=EN-US>16</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">位程序,</SPAN><SPAN
lang=EN-US>Windows95</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">及</SPAN><SPAN
lang=EN-US>Windows NT</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">雖然也可運行舊的</SPAN><SPAN
lang=EN-US>16</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">位程序,但它們的主流發展方向是</SPAN><SPAN
lang=EN-US>32</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">位應用程序。與</SPAN><SPAN
lang=EN-US>Windows NT</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">不同的是,</SPAN><SPAN
lang=EN-US>Windows95</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">不是一個“純”</SPAN><SPAN
lang=EN-US>32</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">位操作系統,為了兼有令人滿意的速度和與舊的</SPAN><SPAN
lang=EN-US>16</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">位程序的良好兼容性,其內核本身就是一個</SPAN><SPAN
lang=EN-US>16</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">位與</SPAN><SPAN
lang=EN-US>32</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">位的混合體,因此也為編程者使用形式替換提供了便利。</SPAN><SPAN
lang=EN-US>Microsoft</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">為編寫形式替換程序提供了通用的接口及工具,但因</SPAN><SPAN
lang=EN-US>LTW32</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">中的形式替換并不復雜,所以使用了一些編程技巧,而避免了使用</SPAN><SPAN
lang=EN-US>Microsoft</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">復雜的開發工具。</SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 18pt"><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">形式替換中最主要的問題有兩點:①</SPAN><SPAN
lang=EN-US>16</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">位與</SPAN><SPAN
lang=EN-US>32</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">位數據類型尺寸的變化,如</SPAN><SPAN
lang=EN-US>16</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">位代碼到</SPAN><SPAN
lang=EN-US>32</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">位代碼的一個重要變化是整型數</SPAN><SPAN
lang=EN-US>int</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">的長度加倍了</SPAN>
<SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">;②是堆棧操作時,</SPAN><SPAN
lang=EN-US>16</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">位模式使用</SPAN><SPAN
lang=EN-US>SS:SP</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">堆棧指針控制棧頂,而在</SPAN><SPAN
lang=EN-US>32</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">位模式中使用</SPAN><SPAN
lang=EN-US>ESP</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">寄存器作堆棧指針控制棧頂。</SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 18pt"><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">在</SPAN><SPAN
lang=EN-US>LTW32</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">中,屏幕抓詞功能由</SPAN><SPAN
lang=EN-US>16</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">位</SPAN><SPAN
lang=EN-US>DLL</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">實現,因而只需實現</SPAN><SPAN
lang=EN-US>32</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">位到</SPAN><SPAN
lang=EN-US>16</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">位的形式替換,為</SPAN><SPAN
lang=EN-US>32</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">位代碼提供</SPAN><SPAN
lang=EN-US>16</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">位</SPAN><SPAN
lang=EN-US>DLL</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">的調用接口。</SPAN><SPAN
lang=EN-US>CALL FWORD PTR</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">是</SPAN><SPAN
lang=EN-US>32</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">位匯編代碼的一種調用方法,它可讓</SPAN><SPAN
lang=EN-US>32</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">位代碼調用到</SPAN><SPAN
lang=EN-US>16</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">位代碼。作為實現的關鍵,控制</SPAN><SPAN
lang=EN-US>16</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">位側與</SPAN><SPAN
lang=EN-US>32</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">位側各自的堆棧是編程的要點。</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 18pt"><U><SPAN lang=EN-US
style="FONT-FAMILY: 黑體">32位側的調用代碼:</SPAN></U></P>
<P class=MsoNormal style="MARGIN-LEFT: 18pt"><SPAN
lang=EN-US>_asm{</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 18pt"><SPAN lang=EN-US><SPAN
style="mso-tab-count: 2">
</SPAN>pusha</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 18pt"><SPAN lang=EN-US><SPAN
style="mso-tab-count: 2">
</SPAN>call fword ptr [func16bit]<SPAN style="mso-tab-count: 1">
</SPAN>/* func16bit</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">是</SPAN><SPAN
lang=EN-US>16</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">位被調用者的</SPAN><SPAN
lang=EN-US>48</SPAN><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: Arial">位地址</SPAN><SPAN
lang=EN-US> */</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 18pt"><SPAN lang=EN-US><SPAN
style="mso-tab-count: 2">
</SPAN>popa</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 18pt"><SPAN
lang=EN-US>}</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 18pt"><U><SPAN lang=EN-US
style="FONT-FAMILY: 黑體">16位側的調用代碼:</SPAN></U></P>
<P class=MsoNormal style="MARGIN-LEFT: 18pt"><SPAN lang=EN-US>int
dummy;</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 18pt"><SPAN lang=EN-US>static
char stack[8192];<SPAN style="mso-tab-count: 2">
</SPAN></SPAN><SPAN lang=EN-US
style="FONT-SIZE: 9pt; mso-bidi-font-size: 10.0pt">/* 16</SPAN><SPAN
style="FONT-FAMILY: 宋體; FONT-SIZE: 9pt; mso-ascii-font-family: Arial; mso-bidi-font-size: 10.0pt">位代碼的臨時堆棧</SPAN><SPAN
lang=EN-US style="FONT-SIZE: 9pt; mso-bidi-font-size: 10.0pt">
*/</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 18pt"><SPAN lang=EN-US>static
WORD stack_seg;</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 18pt"><SPAN lang=EN-US>static
WORD prev_seg;</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 18pt"><SPAN lang=EN-US>static
DWORD prev_ofs;</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 18pt"><SPAN lang=EN-US>static
WORD prev_ds;<SPAN style="mso-tab-count: 1"> </SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 18pt"><SPAN
lang=EN-US>_asm{</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 18pt"><SPAN lang=EN-US><SPAN
style="mso-tab-count: 2">
</SPAN>push ax;</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 18pt"><SPAN lang=EN-US><SPAN
style="mso-tab-count: 2">
</SPAN>push bx;</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 18pt"><SPAN lang=EN-US><SPAN
style="mso-tab-count: 2">
</SPAN>mov ax, ds;</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 18pt"><SPAN lang=EN-US><SPAN
style="mso-tab-count: 2">
</SPAN>mov bx, seg dummy;</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 18pt"><SPAN lang=EN-US><SPAN
style="mso-tab-count: 2">
</SPAN>mov ds, bx;</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 18pt"><SPAN lang=EN-US><SPAN
style="mso-tab-count: 2">
</SPAN>mov stack_seg, bx;</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 18pt"><SPAN lang=EN-US><SPAN
style="mso-tab-count: 2">
</SPAN>mov prev_ds, ax;</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 18pt"><SPAN lang=EN-US><SPAN
style="mso-tab-count: 2">
</SPAN>pop bx;</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 18pt"><SPAN lang=EN-US><SPAN
style="mso-tab-count: 2">
</SPAN>pop ax;</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 18pt"><SPAN lang=EN-US><SPAN
style="mso-tab-count: 2">
</SPAN>mov prev_seg, ss;</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 18pt"><SPAN lang=EN-US><SPAN
style="mso-tab-count: 2">
</SPAN>mov dword ptr prev_ofs, esp;<SPAN style="mso-tab-count: 1">
</SPAN></SPAN><SPAN lang=EN-US
style="FONT-SIZE: 9pt; mso-bidi-font-size: 10.0pt">/* </SPAN><SPAN
style="FONT-FAMILY: 宋體; FONT-SIZE: 9pt; mso-ascii-font-family: Arial; mso-bidi-font-size: 10.0pt">保存</SPAN><SPAN
lang=EN-US
style="FONT-SIZE: 9pt; mso-bidi-font-size: 10.0pt">32</SPAN><SPAN
style="FONT-FAMILY: 宋體; FONT-SIZE: 9pt; mso-ascii-font-family: Arial; mso-bidi-font-size: 10.0pt">位堆棧指針</SPAN><SPAN
lang=EN-US style="FONT-SIZE: 9pt; mso-bidi-font-size: 10.0pt">
*/</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 18pt"><SPAN lang=EN-US><SPAN
style="mso-tab-count: 2">
</SPAN>mov ss, stack_seg;</SPAN></P>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -