如何編譯ssdt
A. DSDT和SSDT聯合編譯發生如下錯誤,該如何處理,求教
發生如下錯誤
B. SSDT 編譯報錯 大神們能給我解決下么
SSDT 編譯報錯
IP地址錯誤修復: 1、右擊網上鄰居,屬性; 2、右擊本地連接,屬性。選中「Internet協議TCP/IP」,屬性。 3、裡面會有兩個選項「自動獲取IP地址」和「使用下面的IP地址」,選中「使用下面的IP地址」,然後在下面的框里輸入IP、子網、網關和DNS就可以了。
需要win 7 sp1系統和ie10或者IE11.
Win7上安裝vs2015 RC(候選發布版)失敗完美解決方法,包含了Win7 SP1下載地址,IE10下載地址,IE11下載地址,在windows 7 操作系統上安裝Visual Studio 2015,發生下面的錯誤:
解決方案:
可以手動安裝目錄packages\Patch 下根據操作系統32,64 位系統安裝對應的補丁:
安裝完成補丁KB2999226,就可以正常的安裝Visual Studio 2015
失敗條件1:
Windows NT版本為6.3,且WindowsBuildNumber < 9600,則不能安裝。NT6.3是指windows 8.1系統或Windows Server 2012 R2,6.x是內核版本。如果是這個操作系統版本,且build版本號低於9600,則不能安裝。
失敗條件2:
兼容模式未開啟,如果系統不是最新系統,則需要開啟兼容模式,否則無法安裝。
失敗條件3:
操作系統是Win7以上版本,或者是Win7版本並且SP包大於等於1的其他情況,則無法安裝。這個表示,如果是Win7,則必須安裝SP1及以上版本的補丁包。如果你的Win7沒有安裝補丁包,請先安裝,否則無法安裝VS2015.如果是更高版本的操作系統,那麼就不存在這個問題。
C. 易語言怎麼編寫遠程式控制制啊像灰鴿子的那種!最好有源代碼!
gh0st遠控軟體採用驅動級RESSDT過主動,svchost參數啟動,替換系統服務的方式工作的,工作方式較為先進,美中不足的部分是沒有進行驅動級或用戶級隱藏,當然這部分可以添加進去。編碼利用了VC的編程環境。
一、環境配置
編譯環境一定要配置好:DDK+SDK+VC6,DDK用來編譯sys文件的,SDK+VC6是用來編譯工程的,配置部分比較簡單,網上有很多資料,這里不再詳述,有興趣的朋友也可以查看DDK和SDK的相關幫助。
二、特徵碼定位簡述
殺毒軟體查殺木馬的原理基本是根據特徵查殺的,被查殺的部分我們稱之為特徵碼,所以我們可以利用特徵碼定位工具MyCLL定位出病毒的特徵碼位置,定位工具原理是將被掃描木馬分塊,利用分段填充的方式,匹配殺軟的特徵值,找到殺軟查殺病毒的位置。
定位出特徵碼,如何反向找到源碼中的對應位置呢?請看下面分析,
三、二進制文件與源碼定位之map文件利用
map文件是二進制和源碼之間對應的一個映射文件。
我們假設根據第三步我們定位出了病毒的特徵碼:
病毒名稱 特徵碼位置 內存地址
svchost.dll 000038AA_00000002 100044AA
svchost.dll 00005F98_00000002
第一步設置VC編譯環境生成Map文件。
在 VC 中,點擊菜單「Project -> Settings」選項頁(或按下 Alt+F7),選擇 C/C++ 選項卡,並在最下面的 Project Options 裡面輸入:/Zd ,然後要點擊 Link 選項卡,選中「Generate mapfile」復選框,並在最下面的 Project Options 裡面輸入:/mapinfo:lines,表示生成 MAP 文件時,加入行信息。設置完成。
第二步編譯VC工程,設置活動工程編譯即可,這個不用說明。這個步驟完成後,在release(或debug)目錄,多了一個.map文件(比如svchost.map)。
第三步打開map文件(用UE或文本編輯器打開都行),形式如下:
(begin)
Timestamp is 488fcef2 (Wed Jul 30 10:16:18 2008)
Preferred load address is 10000000
---------------------------------------------------------------------------1----(為方便說明,wrw添加)
Start Length Name Class
0001:00000000 00010a50H .text CODE
0001:00010a50 00000485H .text$x CODE
0002:00000000 000004c8H .idata$5 DATA
......
0003:00000010 00000004H .CRT$XIZ DATA
0003:00000020 00001a50H .data DATA
0003:00001a70 00000688H .bss DATA
0004:00000000 000000a8H .rsrc$01 DATA
0004:000000b0 00000cf0H .rsrc$02 DATA
----------------------------------------------------------------------------2---(為方便說明,wrw添加)
Address Publics by Value Rva+Base Lib:Object
0001:00000000 ??0CAudio@@QAE@XZ 10001000 f Audio.obj
0001:000000d0 ??_GCAudio@@UAEPAXI@Z 100010d0 f i Audio.obj
0001:000000d0 ??_ECAudio@@UAEPAXI@Z 100010d0 f i Audio.obj
0001:000000f0 ??1CAudio@@UAE@XZ 100010f0 f Audio.obj
0001:000001e0 ?getRecordBuffer@CAudio@@QAEPAEPAK@Z 100011e0 f Audio.obj
0001:00000240 ?playBuffer@CAudio@@QAE_NPAEK@Z 10001240 f Audio.obj
0001:000002c0 ?InitializeWaveIn@CAudio@@AAE_NXZ 100012c0 f Audio.obj
......
0001:00003310 ?SendToken@CFileManager@@AAEHE@Z 10004310 f FileManager.obj
0001:00003320 ?UploadToRemote@CFileManager@@AAE_NPAE@Z 10004320 f FileManager.obj
0001:00003440 ?FixedUploadList@CFileManager@@AAE_NPBD@Z 10004440 f FileManager.obj
0001:00003670 ?StopTransfer@CFileManager@@AAEXXZ 10004670 f FileManager.obj
0001:00003730 ?CreateLocalRecvFile@CFileManager@@AAEXPAE@Z 10004730 f FileManager.obj
......
----------------------------------------------------------------------------3---(為方便說明,wrw添加)
Line numbers for .\Release\FileManager.obj(E:\vtmp\gh0st3src\Server\svchost\common\FileManager.cpp) segment .text
17 0001:00002630 20 0001:0000267f 21 0001:00002698 24 0001:000026d0
25 0001:000026f8 26 0001:0000273c 29 0001:000027d0 33 0001:000027ee
77 0001:000027f8 36 0001:000027fb 37 0001:00002803 77 0001:0000280d
......
532 0001:0000340f 534 0001:00003414 537 0001:00003428 540 0001:00003440
546 0001:0000345d 547 0001:00003487 548 0001:00003490 549 0001:00003492
551 0001:0000349e 552 0001:000034b8 553 0001:000034cb 554 0001:000034d4
558 0001:000034de 560 0001:000034e9 563 0001:000034ee 564 0001:00003506
......
(end)
我們看下,定位svchost.dll 的第一個特徵碼內存地址為:100044AA,在第2塊中,我們可以找到RVA+BASE與之很接近的是
0001:00003440 ?FixedUploadList@CFileManager@@AAE_NPBD@Z 10004440 f FileManager.obj
這樣我們可以定位到FileManager.cpp中的FixedUploadList函數,是不是范圍縮小了?
下面我們再縮小代碼行
利用這個公式:特徵碼行偏移 = 特徵碼地址(Crash Address)- 基地址(ImageBase Address)- 0x1000
看起來好像很難,其實很簡單,我們將100044AA去掉內存基址10000000,再減1000,因為PE很多從1000開始,可以得到代碼偏移地址為34AA。到第3塊中找對應的代碼行。
偏移地址34AA在(551 0001:0000349e 552 0001:000034b8 )中間,也就是551行和552行中間,我們到源程序中查找第551行:
wsprintf(lpszFilter, "%s%s*.*", lpPathName, lpszSlash);
這樣就定位出源代碼了,要怎麼修改就怎麼修改它就可以了。
四、實戰免殺
A、卡巴免殺
首次編譯後,先做卡巴的免殺。卡巴殺sys文件和dll,當然也就殺包裝它們的install.exe,最後卡巴還殺生成的sever,我這里說殺生成好的server不是和前面的特徵碼重疊的地方,而是殺配置信息。
第一步、sys免殺
sys重新編譯後,增加了輸入表的函數,同時系統不同,造成很多地方不同於原特徵,順利通過卡巴、金山、小紅傘等殺軟。
第二步、svchost.dll免殺
特徵碼定位MultiByteToWideChar和"gh0st update"兩個位置。這里是通過第3步map文件得出的。
卡巴怕加花指令, 這個函數MultiByteToWideChar的調用上,可以在這個函數前面隨便加幾句無效語句就可以通過卡巴殺軟。
字元串調用"gh0st update" ,這個是用於更新用的 ,如果不要在線更新,直接把這個語句所在代碼塊刪除;嘿嘿,其實搜索工程替換這個字元串為其他的字元串就可以了^_^,這個方法同時可以過金山殺軟。
第三步、server免殺
卡巴定位在最後的配置信息,採取跳轉顯然是不行的,採用加花的辦法,在寫入AAAAAA配置信息之前,隨便寫些東西,就可以做server免殺。
卡巴免殺完成!
B、Avast免殺
最新的avast殺軟再查殺1下,殺install.exe和svchost.dll(也就是殺生成的文件和其中的資源文件),接著做它的源碼免殺。
定位在特徵字元串%02d/%02d/%02d和「SYSTEM\CurrentControlSet\Services\%s」兩個地方。
解決方案:
1、svchost.dll的特徵碼定位在鍵盤記錄KeyboardManager.cpp文件中的SaveInfo(char *lpBuffer)函數。特徵字元串%02d/%02d/%02d,也就是我們看到鍵盤記錄的日期,修改之,修改的方法很多,將其改為[%d/%d/%d %d:%d:%d] ,編譯即可通過avast殺軟。
2、install的特徵碼定位在「SYSTEM\CurrentControlSet\Services\%s」,對應文件是install.cpp里的InstallService函數,修改大小寫,編譯即可通過免殺。
五、添加垃圾代碼的小方法
垃圾代碼要移動特徵碼所在的位置,不要跑到堆棧中了,這樣的代碼沒有用。可以採取添加for循環,做計數,簡單統計,採用局部變數,不改變後面的邏輯為宜。
添加輸出表的方法:
有殺輸出表的,可以在生成的svchost.dll上添加空函數 ,但是每次編譯都要修改1次資源 ,其實我們在源碼上添加如下語句:
extern "C" __declspec(dllexport) bool JustTempFun();//聲明
……
extern "C" __declspec(dllexport) bool JustTempFun() //實現
{
return false;
}
編譯後,輸出表就被改變了,有的殺軟就可做到代碼免殺。
六、gh0st自動生成6to4ex.dll的修改
看到好多站友提問自動生成6to4ex.dll的問題,有熱心站友也提出了自己的見解 ,我感覺有些人提出的解決方案不完全正確,有可能造成剛入手人誤解,我根據自己的理解說明1下。
gh0st服務端是通svchost -netsvcs啟動的,所以程序要利用netsvcs 服務,服務端也就是根據netsvcs生成的,故不能說服務端生成是隨機的,相對於大多數系統來講,基本是固定的,下面看分析。
查看install.cpp裡面的InstallService()方法,首先遍歷HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft\Windows NT\CurrentVersion\Svchost中的服務項,查找到一個服務後,程序採取替換服務的方法,將原服務刪除,然後生成對應服務項+ ex.dll的文件替換原服務,6to4服務一般排在第一位,6to4服務是一種自動構造隧道的方式,作用在於只需要一個全球惟一的IPv4地址便可使得整個站點獲得IPv6 的連接,這個服務對一般人來講,基本閑置,所以我們的程序就把6to4服務給替換掉,同時在windows\system32\目錄下生成 6to4ex.dll,以後啟動就是6to4ex了,如果把這個服務跳過去,就依次向下生成Ias、Iprip等服務啦,如果netsvcs項沒有可以替換的服務,則程序將自己添加1個服務,名稱就是由 AddsvchostService()方法產生的netsvcs_0x%d。
這樣說不知道關心服務名稱的明白了不?
這個不能說是技術問題,但是小技巧問題可以從這里產生,我不知道其他人的360是怎麼過的,但是我覺得可以提示1下的是,如果是360默認系統安全的服務,它肯定不會報不安全,替換閑置的系統安全的服務則通過360的效果要好的多
本文來自: 華夏黑客同盟論壇 本文詳細地址:http://bbs.77169.com/read.php?tid=255676
D. SSDT HOOK 問題
都什麼年代了還hook ssdt ???
E. 如何在windbg調試驅動時下斷點需要在源程序修改嗎
1.編譯好你的驅動,假設名為ShowSSDT.sys,並把驅動符號文件ShowSSDT.pdb發送到MySysSymbols文件夾下(之前設定的自己的調試符號文件夾)
2.啟動虛擬機,選擇調試方式進入系統
3.在Windbg中按下Ctrl+Break,輸入bu ShowSSDT!DriverEntry(設置斷點)回車確認然後輸入g命令繼續執行
4.把ShowSSDT.sys拖到虛擬機中(也可以通過網上鄰居將驅動文件復制過去\\192.168.1.22\C$),在虛擬機系統中啟動InstDrv,載入此驅動(也可以使用SRVINSTW.EXE將驅動作為服務安裝到系統,然後使用net start 驅動名或是 net stop 驅動名)
5.回到Windbg窗口,如果一切正常的話,你會看到已經中斷在ShowSSDT.sys的入口代碼處了
接下來,要單步還是要下斷點、要繼續執行什麼的,就全由你來作主了~~
F9設置斷點,在按一次則取消斷點
F10單步前進,即單步執行,遇到函數(call指令),不會進入函數內部,而是繼續函數返回後的工作
F11單步進入,即單步執行,遇到函數(call指令),則進入函數內部繼續單步執行
Debug->Break中斷調試(只有在中斷的情況下才能設置斷點)
F. 求助如何修改DSDT來禁用獨顯
基本原理
在電腦開機時(對應_INI method)和睡眠喚醒時(對應_WAK method)調用關閉Nvidia獨顯的Method。
這個網站http://hybrid-graphics-linux.tuxfamily.org/index.php?title=ACPI_calls總結了關閉Nvidia顯卡的常見methods,還列舉了一些機型的具體情況,大家可以去看看,弄清楚自己電腦關閉顯卡的method究竟是哪個,然後結合這個帖子來修改DSDT.
正如上面那個網站所示,關閉Nvidia獨顯一般有兩種方法:一、使用 _DSM + _PS3;二、直接用_OFF(或者DOFF,SGOF等等,有些機型是不同的);
雖然上面那個網站一般都是直接調用OFF()函數來關閉獨顯的,但個人覺得如果有_DSM和_PS3的話,先使用方法一比較好,因為方法二可能會有一些影響,比如CPU變頻的問題。(具體請看參考帖子[教程] 解決Optimus 和CPU Turbo 變頻沖突)。
具體方法
很多人喜歡把SSDT的顯卡部分移到DSDT中然後添加關閉獨顯的代碼,並且開機DropOEMSSDT只用DSDT。但是我個人覺得這樣子很麻煩,首先在移動過程中可能會產生錯誤,而且Drop掉SSDT後,DSDT中的那些External variables,methods就無法access了,因此DSDT中用到這些Objects,Methods的地方就會產生問題。如果Drop SSDT的目的是為了使用clover和變色龍的Generate P-States和C-States的話,clover可以只Drop掉有CPU信息的SSDT,變色龍可以把除有CPU信息的其他SSDT放在Extra目錄下再DropSSDT,所以我認為完全沒有必要花時間來移動顯卡部分或者其他東西。如果DSDT和SSDT要相互調用對方的函數,那就在definition block那裡加上External就好了。(如果新人看不懂這一段就跳過吧)說了那麼多廢話,終於開始了。
注意,在修改DSDT和SSDT之前,可以用這個帖子介紹的方法先生成dsl文件,可以減少錯誤,還有其他錯誤自己爬帖解決。不過如果你某個DSDT或SSDT有錯誤不能解決但你不需要再把它編譯成AML文件的話,可以不用管它。
方法一:搜索函數
首先在DSDT和SSDT中搜索找到要用的函數_WAK,_INI,_PS3,_DSM。_WAK一般只有一個。_INI可能有很多個,最好用\_SB.PCI0下或\_SB.PCI0.PEG0.PEGP的。_PS3隻有一個,如果沒有的話看方法二。_DSM會有很多個,一定要用\_SB.PCI0.PEG0.PEGP下的,如果\_SB.PCI0.PEG0.PEGP下沒有,搜索看看Device(GFX0)下有沒有,如果都沒有就看方法二.(注意,以下步驟是默認你DSDT的相關methods為一般情況,若有不同需根據你自己的DSDT做相應更改)
方法一:在_WAK之前新建一個Method PINI()
Method(PINI,0,NotSerialized)
{
\_SB.PCI0.PEG0.PEGP._DSM(Buffer(0x10)
{
/*0000*/0xF8,0xD8,0x86,0xA4,0xDA,0x0B,0x1B,0x47,
/*0008*/0xA7,0x2B,0x60,0x42,0xA6,0xB5,0xBE,0xE0
},0x0100,0x1A,Buffer(0x04)
{
0x01,0x00,0x00,0x03
})
\_SB.PCI0.PEG0.PEGP._PS3()
}
Method(_WAK,1,Serialized)
{
PINI()
......
}
[。。。省略。。。]
Method(_INI,0,NotSerialized)
{
PINI()
.......
}
ErrorObjectdoesnotexist(PINI)
External(PINI,MethodObj)
DefinitionBlock("acpi_dsdt.aml","DSDT",1,"LENOVO","CB-01",0x00000001)
{
External(_SB_.PCI0.PAUD.PUAM,MethodObj)//Warning:UnresolvedMethod,guessing0arguments(maybeincorrect,seewarningabove)
External(_SB_.PCI0.XHC_.DUAM,MethodObj)//Warning:UnresolvedMethod,guessing0arguments(maybeincorrect,seewarningabove)
External(_SB_.TPM_.PTS_,MethodObj)//Warning:UnresolvedMethod,guessing1arguments(maybeincorrect,seewarningabove)
External(_PR_.CFGD,FieldUnitObj)
External(_PR_.CPU0._PPC,IntObj)
External(_PR_.CPU0._PSS,PkgObj)
External(PINI,MethodObj)
External(_SB_.PCI0.PEG0.PEGP._PS3,MethodObj)
External(_SB_.PCI0.PEG0.PEGP._DSM,MethodObj)
Method(_WAK,1,Serialized)
{
\_SB.PCI0.PEG0.PEGP._OFF()
......
}
[。。。省略。。。]
Method(_INI,0,NotSerialized)
{
\_SB.PCI0.PEG0.PEGP._OFF()
.......
}
方法一:在_WAK和適當的_INI中調用PINI()
_WAK和_INI可能不在同一個DSDT或SSDT中,沒有關系
方法一:編譯錯誤
如果有類似以下的錯誤
在DefinitionBlock(在DSDT和SSDT的最上面)加上以下代碼
方法一:錯誤修正示範:
如果錯誤提示Object does not exist (\_SB.PCI0.PEG0.PEGP._PS3)
在DefinitionBlock加上
如果錯誤提示Object does not exist (\_SB.PCI0.PEG0.PEGP._DSM)
在DefinitionBlock加上
方法一:保存編譯
沒有錯誤了,編譯,save AML,把修改了的DSDT.aml, SSDT.aml和其他所以沒有修改的SSDT*.aml放在Extra目錄(變色龍),或patched文件夾(Clover),這樣的話要DropSSDT。開機,幸運的話,Nvidia顯卡應該被屏蔽了。
方法二:沒有_PS3函數
如果沒有_PS3函數,或者使用上面的方法沒效果,那就試試這個方法吧。
在_WAK和適當的_INI裡面加入\_SB.PCI0.PEG0.PEGP._OFF()
方法二:編譯錯誤
如果編譯時有錯誤,像方法一的4中那樣解決錯誤即可。
方法二:編譯保存
沒有錯誤了,編譯,save AML,把修改了的DSDT.aml, SSDT.aml和其他所以沒有修改的SSDT*.aml放在Extra目錄(變色龍),或patched文件夾(Clover),這樣的話要DropSSDT。開機,幸運的話,Nvidia顯卡應該被屏蔽了。
查看是否生效
如何查看是否成功屏蔽Nvidia獨顯:打開「系統信息」→「圖形卡/顯示器」,若只有Intel顯卡的信息就證明屏蔽成功。若成功了就支持一下吧!
G. 想請問一下clover提取的DSDT和SSDT如何命名才能載入
不同的電腦,要根據實際情況選擇補丁。修改、編譯好的,就是放到那個文件夾。就可以載入DSDT。要載入SSDT,就還需要參數。
DSDT是主板BIOS中ACPI的一個表。什麼是ACPI呢,它是BIOS的一個高級功能模塊。
它是The Differentiated System Description Table的簡寫。字面上就可以知道它是一個描述系統不同信息的表。
包含了所有除基本系統以外所有不同設備的信息,也就是每台計算機設備的基本系統是相同的,而不相同的設備用DSDT來描述。
DSDT表代碼為ACPI Machine Language (AML)。
Mac OS X不完整支持ACPI規范,僅支持它的子集DSDT。
用戶通過修改DSDT可以得到更好的硬體支持。最簡單的理解就是DSDT是描述硬體的。mac的驅動是被動驅動,需要讓系統知道存在這個硬體且知道硬體位置。
修改DSDT的主要目的就是讓mac系統識別存在這個硬體並告訴mac系統你的硬體位置,以便讓mac系統內置的驅動來驅動硬體工作。
H. QQ的離開狀態判斷用vc++如何實現
這個問題比較簡單,有兩種實現方法
第一種方法准確度非常高
但復雜,第二種方法
准確度稍微低,但簡單
=========================第一種方法=============================
這種方法對於QQ2013比較復雜,我先說一下對於QQ2013的處理方法
QQ2013有QQProtect.sys驅動保護,但這個驅動也是白痴,很容易過的
新建一個sys驅動工程,驅動大致內容:獲取SSDT表位置->>獲取當前SSDT的NtOpenProcess位置(因為QQProtect.sys只是HOOK了SSDT,所以SSDT當前的函數地址就是QQProtect.sys的地址)->>獲取系統真實的NtOpenProcess位置,假地址與系統真地址差異比較並計算出要jmp多少,修改QQProtect.sys前5個位元組
jmp到系統真地址NtOpenProcess即可
編譯驅動->>載入我們自己寫的驅動~
5.
CE打開QQ.exe進程,
6.先把QQ改成在線狀態,搜索【位元組】未知內存數值模式
7.把QQ改成離開
搜索【變化的數值】,循環往復,不斷搜變化的數值,最後得出幾個地址
8.再雙擊地址,地址到CE下面的框框了,右鍵
查找什麼改寫此地址,
9.然後隨便更改一下QQ狀態(目的是觸發CE),此時CE出現幾句匯編指令
10.不要看其他指令,只看mov開頭的,然後搜索那句mov的相對應寄存器值,循環往復(可能有多重偏移)
不斷的
最後找到基址。
這種方法准確度相當高,不易受干擾,在你的VC++程序裡面,加個時鍾,每秒ReadProcessMemory(基址+偏移),讀取內存,判斷一下
是不是離開狀態的數值
即可。
=======================第二種方法===============================
把QQ任務欄的圖標移動到可見(針對Win7會自動隱藏托盤圖標)
截取QQ任務欄圖標的離開狀態圖片(注意
要截兩張
一張男QQ
一張女QQ)例如
VC++工程裡面,獲取屏幕HDC,加個時鍾,每秒在剛獲取的HDC裡面識圖(找圖、可模糊找圖)【注意不可以把獲取屏幕HDC代碼加到時鍾裡面否則會耗盡系統資源】時鍾把圖找到了
就表示已經是在離開狀態了,最後
記得釋放屏幕的HDC
這種方法可能會受屏幕多方面干擾,如右下角彈廣告窗等.但使用容易
I. QQ的離開狀態判斷用vc++如何實現
這個問題比較簡單,有兩種實現方法
第一種方法准確度非常高 但復雜,第二種方法 准確度稍微低,但簡單
=========================第一種方法=============================
這種方法對於QQ2013比較復雜,我先說一下對於QQ2013的處理方法
QQ2013有QQProtect.sys驅動保護,但這個驅動也是白痴,很容易過的
新建一個sys驅動工程,驅動大致內容:獲取SSDT表位置->>獲取當前SSDT的NtOpenProcess位置(因為QQProtect.sys只是HOOK了SSDT,所以SSDT當前的函數地址就是QQProtect.sys的地址)->>獲取系統真實的NtOpenProcess位置,假地址與系統真地址差異比較並計算出要jmp多少,修改QQProtect.sys前5個位元組 jmp到系統真地址NtOpenProcess即可
編譯驅動->>載入我們自己寫的驅動~
5. CE打開QQ.exe進程,
6.先把QQ改成在線狀態,搜索【位元組】未知內存數值模式
7.把QQ改成離開 搜索【變化的數值】,循環往復,不斷搜變化的數值,最後得出幾個地址
8.再雙擊地址,地址到CE下面的框框了,右鍵 查找什麼改寫此地址,
9.然後隨便更改一下QQ狀態(目的是觸發CE),此時CE出現幾句匯編指令
10.不要看其他指令,只看mov開頭的,然後搜索那句mov的相對應寄存器值,循環往復(可能有多重偏移) 不斷的 最後找到基址。
這種方法准確度相當高,不易受干擾,在你的VC++程序裡面,加個時鍾,每秒ReadProcessMemory(基址+偏移),讀取內存,判斷一下 是不是離開狀態的數值 即可。
=======================第二種方法===============================
把QQ任務欄的圖標移動到可見(針對Win7會自動隱藏托盤圖標)
截取QQ任務欄圖標的離開狀態圖片(注意 要截兩張 一張男QQ 一張女QQ)例如
VC++工程裡面,獲取屏幕HDC,加個時鍾,每秒在剛獲取的HDC裡面識圖(找圖、可模糊找圖)【注意不可以把獲取屏幕HDC代碼加到時鍾裡面否則會耗盡系統資源】時鍾把圖找到了 就表示已經是在離開狀態了,最後 記得釋放屏幕的HDC
這種方法可能會受屏幕多方面干擾,如右下角彈廣告窗等.但使用容易