




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、PS:昨天回家搭車時聽了About變速齒輪的工作原理的探討,感覺有點奇怪,于是上網查了下,貌似最有說服力就是這篇,關于利用驅動通過Ring0進行訪問I/O,我感覺采用這種方法的可能性不大,因為沒下載變速齒輪,無法得知他是否采用這種方法。(用了呢種方案出錯率非一般的大,一錯了,隨時死機。) -我是傳說中的分割線- 變速齒輪工作原理解密 絕大部分游戲里面即時都會用到使用的定時器,變速齒輪之所欲可以給游戲加速,就是改變了定時器的性質。 有兩種辦法可以改變系統定時器。 1)API代碼注入,通過注入自己的代碼,使得API跳轉到自己的代碼處運行 計時API函數有GETTICKCOUNT和TIMEGETTI
2、ME,它是windows系統函數,如果可以找到他們的未知,修改成對自己有利的形式,就達到了加速的目的。 下面以GETTICKCOUNT為例進行分析:原本的GETTICKCOUNT匯編: kernel32!gettickcountmovgs,bffcaea18 moveax,gs:00000000 subedx,edx movgs,dx ret 變速齒輪修改后的GETTICKCOUNT匯編: kernel32!gettickcount 這里是關鍵->jmp840500d9(840500d9并不是絕對的) addeax,al addecx+00000000,ah subedx,edx mov
3、gs,dx ret 可以看出變速齒輪修改了gettickcount的代碼,當游戲和程序使用gettickcount時就會自動跳轉到840500d9處執行。 再看?40500d9處的代碼匯編: 840500d9:CLI pushebp movebp,esp pushebx pushec pushedx pushesi pushedi call840500e7 840500e7:popedi xordi,di movesi,edi addesi,00402051 subesi,00401f0b pushesi calledi call84050101 84050101:popedi xordi,d
4、i calledi+0000fef0 call84050110 84050110:subeax,edi+0000ff30 muldword,ptredi+0000ff30 movebx,00100000 divebx addeax,edi+0000fe20 pusheax moveax,00402072 subeax,00401f08 addeax,edi pusheax calledi popeax popedi popesi popedx popecx popebx popebp sil ret 以上正是變速齒輪變速的核心所在。(GETTICKCOUNT返回的是EAX的值你可以對EAX進行
5、跟蹤) 下面說一下變速齒輪掛接API的方法:首先變速齒輪在MMF區(WIN9X/ME)申請一塊內存,把上面的代碼從程序中移到該內存。使用修改描述符的方法從應用程序級跳到核心級,修改GETTICKCOUNT開頭的代碼使之指向申請的內存的首地址實現掛接。 這是普遍采用的一種方式。 2)還有一種方式。從驅動級修改。 在win95/98時代,我們是可以直接操作IO端口的,winNT以后,包括2000,XP系統,當我們試圖操作IO端口,改變硬件設置的時候,系統會拒絕或者引起沖突。事實上在386以后的CPU上,用戶程序都是運行在保護模式下,用戶對IO端口對設備的訪問都要經過操作系統的管理和監督。用戶程序是
6、無法直接對設備操作的。 那么在window下,要訪問設備怎么辦?windows提供了2中辦法: 第一,通過修改EFLAGS寄存器中的特權級別(IOPL)實現 第二,任務狀態段(TSS)中的IO許可映射BIt位 WindowsNT下,只使用了2種等級的特權級,0特權級和3特權級。用戶程序運行在3特權級,設備驅動和系統內核運行在0特權級。只有系統內核程序和設備驅動才被允許直接操作IO端口。所有的用戶程序在訪問IO端口前,都需要得到設備驅動的準入,低信任級別的程序是無法訪問的。 IObit映射就是為了使得那些低信任級別的程序能夠訪問設備IO而設置的。 在NT系統下,直接操作IO端口就有兩種方式,一是
7、,編寫設備驅動,運行在0特權級直接操作IO設備端口。另外一種可行的辦法就是修改IObit映射。 我們建議采用第一種辦法,通過工作在0特權級的驅動訪問IO端口。 這里有寫好的設備驅動,PortTalk.sys,并提供了對外的接口,下面是用c語言寫的,通過這個驅動對IO訪問的一個例子: #include #include #include void_cdeclmain(void unsignedcharvalue; printf("IoExampleforPortTalkV2.0nCopyright2001CraigPeacockn" OpenPortTalk(; outpor
8、tb(0x378,0xFF; value=inportb(0x378; printf("Valuereturned=0x%02Xn",value; outp(0x378,0xAA; value=inp(0x378; printf("Valuereturned=0x%02Xn",value; ClosePortTalk(; 變速齒輪原理 (轉 通過調用門跳到Ring0級代碼段,修改各系統時間相關函數的前8個字節為jmp指令,轉跳到“齒輪”映射到2G之上的代碼,達到截獲對各系統時間相關函數的調用的目的。但同時我的疑惑也更明確了: 1.“齒輪”怎樣建立指向自己
9、映射到2G以上內存的代碼的調用門描述符的; 2.“齒輪”怎樣將自己的代碼映射到2G以上線性地址的; 3.映射到2G之上的代碼是怎樣做到在代碼基址更改的情況仍能正確運行的 帶著這樣的疑問,我正式開始了對“齒輪”反匯編代碼的分析。工具嘛,不用說當 然是Softice for Windows98、W32Dasm,OK,出發啦! 我的“齒輪”版本是0.221 for win98和winme的,內含有兩個文件(變速齒輪.exe 和Hook.dll)。先看看Hook.dll里面有些什么,用W32Dasm將Hook.dll反匯編,看看它的輸出函數: ?ghWnd3PAUHWND_A ?gnHotKey13K
10、A ?gnHotKey23KA ?gnHotKey33KA ?gnHotKey43KA ?nHook3HA ?SetHookYAHPAUHWND_Z ?UnHookYAHXZ 看函數名好象該dll只是安裝鉤子捕獲變速熱鍵的,與我的研究目的沒太大的關系, 跳過去! 再看看變速齒輪.exe的導入函數,timeGetTim、GetTickCount等時間相關的函數都 在里面。嘿,還有CreateFileMappingA和MapViewOfFileEx,看來“齒輪” 是用這兩個函 數創建映射文件的。以下列出幾個關鍵的導入函數: Hook.?gnHotKey13KA Hook.?gnHotKey23KA
11、 Hook.?gnHotKey33KA Hook.?gnHotKey43KA Hook.?SetHookYAHPAUHWND_Z KERNEL32.CreateFileMappingA KERNEL32.GetModuleFileNameA KERNEL32.GetModuleHandleA KERNEL32.GetTickCount KERNEL32.MapViewOfFileEx KERNEL32.QueryPerformanceCounte USER32.KillTimer USER32.SendMessageA USER32.SetTimer WINMM.timeGetTime WIN
12、MM.timeSetEvent 既然“齒輪”截獲了timeGetTime,那我就跟蹤timeGetTime函數的執行情況。 我先寫了個Win32 APP (以下簡稱APP),當左擊客戶區時會調用timeGetTime并將返回的結果輸出至客戶區。運行這個程序,打開“齒輪”,改變當前速度。 Ctrl + D 呼出Softice,bpx timeGetTime ,退出,再左擊APP客戶區,Softice跳 出。哈,果然timeGetTime函數的首指令成了jmp 8xxx 002A ,好F8繼續執行,進入了“ 齒輪”映射到2G線性地址之上的代碼。一路F8下去,發現接著“齒輪”把timeGetTime
13、 首指令恢復,并再次調用timeGetTime,這樣就得到了timeGetTime的正確結果,保存結果。“齒輪”再把timeGetTime首指令又改為jmp 8xxx 002A 。接下來都猜得到“齒輪”要干什么了!沒錯,將得到的返回值修改后返回至調用timeGetTime的程序APP。 我仔細分析了一下,“齒輪”修改返回值的公式如下: 倍數*(返回值-第一次調用timeGetTime的返回值) 修改后的返回值=-+上一次修改后的返回值 100000 公式中“上次修改后的返回值”是自己猜測的未經證實,僅供參考。 代碼分析已經進行一部分了,可我之前的疑問仍未解決,“齒輪”是怎么將代碼映 射的?又是
14、怎么得到修改代碼的權限的? 既然“齒輪”中調用了CreateFileMappingA,我想其安裝調用門,映射代碼的初始 化部分應該就在調用該函數代碼的附近。好,沿著這個思路,呼出Softice,在CreateF ileMappingA處設置斷點,將“齒輪”關閉后再運行。Softice跳出,停在了CreateFile MappingA處,F11回到“齒輪”的代碼。看到了“齒輪”調用CreateFileMappingA的形式 如下: CreateFileMappingA(FF,0,4,0,10000,0; 可見“齒輪”創建了長度為0x10000的映射文件,繼續,“齒輪”接著又調用 MapViewO
15、fFileEx,調用形式如下: MapViewOfFileEx(EDX,2,0,0,0,EAX; /EDX為CreateFileMappingA返回的映射文件句柄 /EAX為申請映射代碼的基址,第一次調用時EAX為0x8000 0000 這里就是關鍵了,“齒輪”要將映射文件映射至基 址為0x8000 0000 的內存空間中,可并不見得Windows就真的允許其映射呀?果然,“齒輪”在在調用之后判斷返回值是否有效,無效則將上次申請的基址加上0x1000,再次調用MapViewOfFileEx,一直循環到成功為止,再將返回的地址保存。 接下來“齒輪”將原“齒輪”exe中的截獲API的代碼逐字節拷貝
16、到映射區域去。至 此,“齒輪”已經將關鍵代碼映射到2G以上線性地址中了。 我再F8,哈哈,和熟悉的SGDT指令打了個照面。“齒輪”保存全局描述符表線性基 址,再用SLDT指令保存局部描述符表索引,計算出LDT基址。接著呢“齒輪”在局部描述表中創建了一個特權等級為0的代碼段指向需要利用Ring0特權修改代碼的“齒輪”自己的代碼,并把局部描述表中索引為2的調用門指向的地址改為“齒輪”映射到高于2G的代碼。 然后“齒輪”依次調用各時間相關的API,保存其返回值留做計算返回時結果用。 “齒輪”又依次調用映射到高于2G的代碼修改各API的首指令。到了這里,“齒輪”的初 始化部分就結束了,只等著還蒙在鼓里
17、的游戲上鉤啦,哈哈! 結束代碼只不過是作些恢復工作罷了,僅僅是初始化代碼的逆過程,所以就不再 贅述(其實是我自己懶得看了,_!. 至此,我對“齒輪”的加速原理已有大致的了解,深刻感受到“齒輪”代碼的精巧, 所以覺得有必要將"齒輪"中所運用到的一些技巧作一個總結: 1.基址無關代碼的編寫 姑且以上面一句話作標題,_。看了“齒輪”的初始化代碼,知道其映射代碼 的基址差不多是隨機的,那么“齒輪”是怎么保證映射后的代碼能正常運行的呢?如果 代碼是完全順序執行的倒沒什么問題,但如果要調用自己映射代碼中的子程序呢?呵呵,就只有運行時計算出子程序的入口地址并調用了,不過還是要先得到映射代
18、碼所在的地址才行。“齒輪”簡單地用兩條指令就得到當前正在執行的指令的地址,具體如下(地址為假設的): 0:0 call 5 0:5 pop esi 現在esi中的值就是5了,哈哈! 這里的call用的是近調用,整條指令為E800000000,即為調用下一條指令.所進行 的操作只不過是把下一條指令的地址入棧而已.再pop將返回地址(即pop指令本身的地址取出. 2.修改調用門,生成jmp指令,修改代碼 這些都是高度依賴于CPU的操作,技巧性也很強,主要是鉆了操作系統的漏洞。比如“齒輪”就是用SGDT,SLDT獲得全局和局部描述符表基址來安裝調用門,通過訪問調用門來獲取RING0權限作一些平時不為
19、系統所允許的操作;而CIH病毒是用SIDT獲得中 斷描述符表基址安裝中斷門然后出發軟中斷獲取RING0權限的,原理都是一樣的。這些在水木上討論過很多遍,大家都很熟悉,所以也就不敢班門弄斧,寫到此為止。 3.64K代碼編寫 由調用CreateFileMappingA函數參數可知“齒輪”只映射10000(64K)大小的 區域,所以其映射在2G之上的代碼和數據決不能大于64K。我想作者之所以選擇64K為映射區域的大小,可能是與調用子程序或數據時容易計算地址有關。在映射代碼的任意一處得到當前指令地址之后將其低16位置0即可得到映射代碼的基地址,再加上子程序入口或數據的偏移即可求得其絕對地址。 我的評論
20、: 一句話:佩服“齒輪”的作者王榮先生。 “齒輪”的代碼表現他對windows運行機制的深刻理解以及深厚的匯編功底還有豐 富的想象力。對我來說“齒輪”仿佛就是一件精美的藝術品,每個細處都很值得玩味一 番,所以我才在看過“齒輪”代碼之后有了把我的分析過程用筆寫下來的沖動。但同時 我又不得不承認“齒輪”的功能的實現是依靠其高度技巧化的代碼實現的,換句話說就 是這種的方法局限性實在是太大了。不就是截獲API嘛,用的著這么麻煩嗎? 為了證實自己的想法,我在Codeguru上直接找了個HOOK API 的代碼,該代碼是通過安裝WH_CBT類型全局鉤子在所有入DLL的進程中修改進程PE映像的輸入節達到截獲
21、API的(這種方法在windows核心編程中有詳細說明)。把代碼稍做修改,就能工作了(在星際爭霸下試過,可以改變游戲速度)。盡管只在98下試過,但我覺得肯定也能在2000下用,因為代碼中只用了一兩句匯編指令,而且整個程序都是在RING3下運行的,沒有作出什么出軌的舉動。當然這種方法也有缺點,就是對用Loadlibrary加載WINMM.dll再用GetProcAddress獲取timeGetTime地址的API調用不起作用(原因在windows核心編程中有說明)。 我打算在將測試用程序稍稍完善后再公布源代碼,屆時歡迎大家下載。 我的感謝: 在我徹底弄清“齒輪”的代碼之后,已經是第三天的上午了,
22、無奈自己才疏學淺, 全不像手記的作者只花了一個晚上就弄清楚,我可是花了一個上午、兩個下午、兩個晚上才結束了戰斗,實在是慚愧呀。 自己之所以能自得其樂地堅持了兩天多,是與寢室兄弟小強的支持分不開的。窮 困潦倒的我在這幾天不知道總共抽了他多少支煙,無以為報,只有在這里說一聲謝謝了!另外還要感謝sunlie非常地閱讀本文,指出了原文中的錯誤并提出了非常寶貴的意見! 最后要說的就是個人水平有限,文中難免出現錯誤 ,歡迎大家討論!_ 附A: 使用工具:Softice for Windows98,W32Dasm,VisualC+ 6.0 操作系統:Window98 2nd 分析目標:變速齒輪 for 98
23、me 版本:0.221 參考書籍或文章: 80x86匯編語言程序設計教程 楊季文等編著 清華大學出版社 windows剖析-初始化篇及內核篇 清華大學出版社 虛擬設備驅動程序開發 intel 32位系統軟件編程 80x86指令參考手冊 “變速齒輪”研究手記 0167:00401CE0 MOV EBP-0C,ECX ;保存 0167:00401CE3 MOV EAX,EBP-30 0167:00401CE6 MOV ECX,EBP-0C 0167:00401CE9 MOV EAX+00000370,ECX 0167:00401CEF MOV EDX,EBP-30 0167:00401CF2 MO
24、V EAX,EDX+0000036C 0167:00401CF8 MOV ECX,EBP-0C 0167:00401CFB MOV EAX+0000FE00,ECX ;將LDT線性基址保存至映射代碼中 0167:00401D01 MOV AX,CS ;得到當前代碼段描述符號 0167:00401D04 AND AX,FFF8 0167:00401D08 MOV EBP-10,AX 0167:00401D0C MOV EDX,EBP-10 0167:00401D0F AND EDX,0000FFFF ;EDX為代碼段描述符在LDT中的偏移量 0167:00401D15 MOV EAX,EBP-3
25、0 0167:00401D18 MOV ECX,EAX+00000370 ;ECX此時為LDT線性基址 0167:00401D1E MOV EAX,EBP-30 0167:00401D21 MOV EAX,EAX+00000370 ;EAX此時為LDT線性基址 0167:00401D27 MOV ESI,EDX+ECX 0167:00401D2A MOV EAX+08,ESI 0167:00401D2D MOV ECX,EDX+ECX+04 ;以上將當前代碼段描述符復制到 0167:00401D31 MOV EAX+0C,ECX ;LDT第1項 0167:00401D34 MOV EDX,EB
26、P-30 0167:00401D37 MOV EAX,EDX+00000370 0167:00401D3D MOV CL,EAX+0D 0167:00401D40 AND CL,9F 0167:00401D43 MOV EDX,EBP-30 0167:00401D46 MOV EAX,EDX+00000370 0167:00401D4C MOV EAX+0D,CL ;以上修改LDT第1項的DPL為0,則當由調用門轉到該段代碼時即獲得RING0權限 0167:00401D4F MOV EAX,EBP-0C 0167:00401D52 ADD EAX,10 ;獲得LDT中索引為2的調用門地址 01
27、67:00401D55 MOV EBX,0040213B 0167:00401D5A MOV EAX,EBX 0167:00401D5C MOV EAX+04,EBX 0167:00401D5F MOV WORD PTR EAX+02,000C 0167:00401D65 MOV WORD PTR EAX+04,EC00 ;調用門修改完畢 0167:00401D6B MOV ECX,EBP-08 0167:00401D6E MOV EDX,WINMM!timeGetTime 0167:00401D74 MOV ECX+0000FEE0 ;EDX;保存timeGetTime入口地址 .省略部分依
28、次保存GetTickCount,GetMessageTime,timeSetEvent,SetTimer, timeGetSystemTime,QueryPerformanceCounter入口地址 0167:00401DD2 MOV ECX,EBP-08 0167:00401DD5 MOV EAX,WINMM!timeGetTime 0167:00401DDA MOV EBX,EAX 0167:00401DDC MOV ECX+0000FE40,EBX 0167:00401DE2 MOV EBX,EAX+04 0167:00401DE5 MOV ECX+0000FE44,EBX ;保存tim
29、eGetTime函數前8個字節指令 .省略部分依次保存GetTickCount,GetMessageTime,timeSetEvent, timeGetSystemTime , QueryPerformanceCounter前8個字節指令 0167:00401E6D MOV BYTE PTR ECX+0000FE90,E9 0167:00401E74 MOV EAX,00402165 0167:00401E79 SUB EAX,0040213B ;EAX為截獲代碼在映射代碼中的偏移 0167:00401E7E ADD EAX,ECX ;計算出截獲代碼的線性入口地址 0167:00401E80
30、SUB EAX,WINMM!timeGetTime 0167:00401E86 SUB EAX,05 ;JMP指令總長5個字節 0167:00401E89 MOV ECX+0000FE91,EAX ;計算生成從timeGetTime跳到截獲代碼的JMP指令并保存 .省略部分依次計算并生成GetTickCount,GetMessageTime,timeSetEvent, timeGetSystemTime , QueryPerformanceCounter跳到截獲代碼的JMP指令 并保存 0167:00401F58 CLI ;關閉中斷,謹防修改代碼時發生意外 0167:00401F59 MOV
31、EAX,004021F3 ; 0167:00401F5E SUB EAX,0040213B;計算子程序在映射代碼中的偏移 0167:00401F63 ADD EAX,EBP-08 ;EAX=8xxx 00B8 0167:00401F66 PUSH EAX ;傳入參數EAX為修改timeGetTime代碼的 ;子程序入口地址 0167:00401F67 MOV EAX,EBP-08 ;調用8xxx 0000 0167:00401F6A CALL EAX ;返回時timeGetTime首指令被更改 .省略部分依次修改GetTickCount,GetMessageTime,timeSetEvent,
32、 timeGetSystemTime , QueryPerformanceCounter函數的首指令 0167:00401FF SETI ;設置中斷,初始化代碼結束 二、截獲時間函數部分(以timeGetTime為例子,代碼以跟蹤順序列出) timeGetTime JMP 832A 002A ;這是timeGetTime被修改后的首指令 0167:832A 002A CLI ;此時esp=40BF2C,即游戲程序中調用timeGetTime函數的下一條指令 .(6個)各寄存器分別入棧 且MOV EBP,ESP 0167:832A 0033 CALL 832A 0038 ;將當前EIP入棧(即下
33、一條指令的地址) 0167:832A 0038 POP EDI ;取出當前指令地址 XOR DI , DI MOV ESI , EDI ;將64K內存首地址賦給ESI ;此時ESI=EDI=832A 0000 ADD ESI , 0040 2102 SUB ESI , 0040 213B ;求出映射代碼首地址 PUSH ESI 0167:832A 004B CALL EDI ;ESI為傳進的參數 ;返回時已經將timeGetTime代碼還原 0167:832A 004D CALL 832A 0052 ; 0167:832A 0052 POP EDI XOR DI ,DI ;故技重施 CALL
34、EDI + 0000FEED;調用原timeGetTime函數 SUB EAX,EDI + 0000 FF30 ;減去第一次調用timeGetTime的結果 MUL DWORD PTR EDI+0000 FE30 ;乘以用戶所指定的倍數 MOV EBX ,00100000 DIV EBX ;除以常數100000 ADD EAX ,EDI+ 0000FE20 MOV EAX,004021F3 SUB EAX,0040213B ADD EAX,EDI ;以上指令為修改timeGetTime函數返回值 PUSH EAX ;EAX為傳進的參數 CALL EDI ;返回時又將timeGetTime首指令
35、換成JMP .恢復各寄存器的值,EAX中為修改后的返回值 RET ;此時ESP=40BF2C,執行RET將返回到游戲中去 ; 0167:832A 0000 CALL 832A 0005 0167:832A 0005 POP EDI XOR DI ,DI ;老套了撒_ MOV ESI ,EDI+0000 FE00 ;此地址保存著LDT的線性基址 MOV EAX,ESP+04 MOV ESI +10,AX SHR EAX,10 MOV ESI+16,AX ;以上代碼將LDT中索引為2的調用門描述符的偏移改為傳入的參數 . MOV EAX,0000 0F00 CALL EAX ;調用子程序修改tim
36、eGetTime代碼 0167:832A 0027 RET 4 ;彈出參數,返回 ; 0167:832A F000 CALL 0014:00000000 RET 0 ; 000C:832A 0097 CALL 832A 009C 000C:832A 009C POP EDI MOV EAX,EDI+0000 FE40 MOV EBX,EDI+0000 FEE0 MOV EBX,EAX MOV EAX,EDI+0000 FE44 MOV EBX+04,EAX RETF 注:EDI+0000 FE40起前8個字節為原timeGetTime函數的指令 EDI+0000 FEE0保存著timeGetT
37、ime函數的入口地址 以上即恢復timeGetTime前8個字節的代碼 ; 000C:832A 00B8 CALL 832A 00BD 000C:832A 00BD POP EDI XOR DI ,DI . MOV EAX,EDI+0000 FE90 MOV EBX,EDI+0000 FEE0 MOV EBX,EAX MOV EAX,EDI+0000FE94 MOV EBX+04,EAX RETF 注:EDI+0000 FE90 起前8個字節保存著JMP 832A 002A 指令 是由“齒輪”初始化部分代碼計算出來的,以上代碼將JMP 832A 002A 寫入timeGetTime函數 附B:
38、 “齒輪”關鍵代碼完全注釋 一、初始化部分(從"齒輪"調用CreateFileMappingA函數開始分析 0167:00401B0E PUSH 00 0167:00401B10 PUSH 00010000 0167:00401B15 PUSH 00 0167:00401B17 PUSH 04 0167:00401B19 PUSH 00 0167:00401B1B PUSH FF 0167:00401B1D CALL KERNEL32!CreateFileMappingA ;調用CreateFileMappingA ; 調用形式如右:CreateFileMappingA(F
39、F,0,4,0,10000,0 0167:00401B23 MOV ECX,EBP-30 0167:00401B26 MOV ECX+00000368,EAX 0167:00401B2C MOV DWORD PTR EBP-14,80000000 0167:00401B33 JMP 00401B41 0167:00401B35 MOV EDX,EBP-14 0167:00401B38 ADD EDX,00010000 ;申請基址加0x10000 0167:00401B3E MOV EBP-14,EDX 0167:00401B41 MOV EAX,EBP-14 0167:00401B44 PUS
40、H EAX ;映射文件基址 0167:00401B45 PUSH 00 ;映射的字節數 0167:00401B47 PUSH 00 ;文件偏移低32位 0167:00401B49 PUSH 00 ;文件偏移高32位 0167:00401B4B PUSH 02 ;訪問模式 0167:00401B4D MOV ECX,EBP-30 0167:00401B50 MOV EDX,ECX+00000368 0167:00401B56 PUSH EDX ;CreateFileMappingA返回的映射文件句柄 0167:00401B57 CALL KERNEL32!MapViewOfFileEx ; 調用
41、形式如右:MapViewOfFileEx(EDX,2,0,0,0,EAX 0167:00401B5D MOV ECX,EBP-30 ;EBP-30為即將映射到2G之上 0167:00401B60 MOV ECX+0000036C,EAX ; 的代碼的數據域的起始地址 0167:00401B66 MOV EDX,EBP-30 0167:00401B69 CMP DWORD PTR EDX+0000036C,00 ;檢查MapViewOfFileEx 0167:00401B70 JZ 00401B74 ;返回值,若為0則繼續調 0167:00401B72 JMP 00401B76 ;調用MapVi
42、ewOfFileEx 0167:00401B74 JMP 00401B35 ;直至成功為止 0167:00401B76 MOV EAX,EBP-30 0167:00401B79 MOV ECX,EAX+0000036C 0167:00401B7F MOV EBP-08,ECX ;映射文件起始地址存入EBP-08 0167:00401B82 CALL WINMM!timeGetTime 0167:00401B88 MOV EBP-14,EAX ;將初次調用timeGetTime 0167:00401BA0 MOV ECX,EBP-08 ;的返回值保存到EBP-14 0167:00401BA3 M
43、OV EDX,EBP-14 ;以及映射文件基址+FF30處 0167:00401BA6 MOV ECX+0000FF30,EDX .省略的代碼類似的保存調用初次GetTickCount,QueryPerformanceCounter的返回值 0167:00401BED MOV DWORD PTR EBP-14, 00000000 0167:00401BF4 MOV EDX,EBP-30 0167:00401BF7 MOV EAX,EDX+0000036C 0167:00401BFD MOV ECX,EBP-14 0167:00401C00 MOV BYTE PTR ECX+EAX+0000F0
44、00,9A ;9a為遠調用的指令碼 0167:00401C08 MOV EDX,EBP-14 0167:00401C0B ADD EDX,01 0167:00401C0E MOV EBP-14,EDX 0167:00401C11 MOV EAX,EBP-14 0167:00401C14 ADD EAX,04 0167:00401C17 MOV EBP-14,EAX 0167:00401C1A MOV ECX,EBP-30 0167:00401C1D MOV EDX,ECX+0000036C 0167:00401C23 MOV EAX,EBP-14 0167:00401C26 MOV BYTE PTR EAX+EDX+0000F000,14 ;14為調用門描述符的索引 0167:00401C2E MOV ECX,EBP-14 0167:00401C31 ADD ECX,01 0167:00401C34 MOV EBP-14,ECX 0167:00401C37 MOV EDX,EBP-30 0167:0040
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 貝米錢包協議書
- 畢業實習第三方協議書
- 營銷保密協議書
- 綜合調解協議書
- 政府養殖場合同協議書
- 終止清算協議書
- 發動機買賣合同協議書
- 花苗訂購協議書
- 紋繡賠償協議書
- 稻草購買協議書
- 2025-2030新型鋼材產業市場深度調研及前景趨勢與投資研究報告
- 新媒體國企面試題及答案
- 2025年5G網絡在無人機領域的應用可行性研究報告
- 央企華潤集團杭州片區年度品牌傳播策略案
- 工業用地開發項目成本分析與資金籌措方案
- 2025-2030年中國正丁醇行業市場現狀供需分析及投資評估規劃分析研究報告
- (人教2024版)英語七年級下冊Unit7.4 Section B 1a-2d課件(新教材)
- 2025年廣東嘉城建設集團有限公司及其下屬公司招聘筆試參考題庫含答案解析
- 新藥研究與開發技術 課件3.新藥的工藝與質量研究
- 2025-2030中國基礎設施行業市場前景趨勢及競爭格局與投資研究報告
- 2025年統編版一年級(下)期末語文試題(含答案)
評論
0/150
提交評論