全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3772
推到 Plurk!
推到 Facebook!

截取其它 program 裡 (MfcGridCtrl)Grid cell text 的資料

答題得分者是:hotswin
smartboss
初階會員


發表:19
回覆:93
積分:42
註冊:2004-12-29

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-12-30 21:36:41 IP:218.170.xxx.xxx 訂閱
各位前輩們好,我最近被指派寫一支程式需去監控別的程式裡 Grid (MfcGridCtrl) 的 cell text 的資料,只是從國內找到國外看了許多sample 但是仍未找到真正的解答,能否請有做過這部份程式的前輩,提出來指點一下,謝謝,以下則是我找到的網頁參考資料。
http://delphi.ktop.com.tw/board.php?cid=168&fid=914&tid=93969
http://delphi.ktop.com.tw/board.php?cid=30&fid=66&tid=82164
http://delphi.ktop.com.tw/board.php?cid=168&fid=914&tid=30792 <---這篇滿仔細的但仍無解答,並請問 control id 功能為何,我能否由該 id 而得到 grid 裡的 cell text?
http://delphi.ktop.com.tw/board.php?cid=31&fid=79&tid=30620
http://delphi.ktop.com.tw/board.php?cid=30&fid=72&tid=20123
http://www.autoitscript.com/forum/index.php?showtopic=43386
http://www.codeproject.com/KB/miscctrl/gridctrl.aspx?display=PrintAll&fid=18&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=176&select=1935654
目前我的做法是先以抓到正確 component HWND 值為主,因此我借用 m$ 提供的工具 Spy 來取得 HWND 值,接下來由該值取得 rect 值,與style and control id 值,確定由這三個值來確定我確實是有trace 到該grid,然我用過了 ListBox 的 LB_GETTEXT ,與ComboBox 的CB_GETLBTEXT ,透過 sentmessage 去試,當然是如同前面 search 的文章所述一樣它並非給 grid 使用因此完全失敗,因此 po 文請教是否有前輩們有這部份的相關經驗者,請指導一下,謝謝。
smartboss
初階會員


發表:19
回覆:93
積分:42
註冊:2004-12-29

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-01-16 10:25:23 IP:115.81.xxx.xxx 訂閱
各位大家好 po 文至今己半個月,目前並沒有進一步的解答,但是由該站上的 lu 前輩那得我找到一些線索可供使用,雖說不是很 smart 但目前我也只會只能這樣做。
一、先將來源資料的process 置頂
二、由於我抓得到該 grid 的 rect 範圍,於是我將該範圍抓取下來到自己的process 裡當 resource。
三、再借由以下這篇文章的解決方式對該圖進行文字的分析判斷而取得所要數據。
http://delphi.ktop.com.tw/board.php?cid=30&fid=74&tid=47300

P.S. 這個方法的缺點不少,如果各位對精確度要求很高者,恐怕就不能用這種方法,例如該方法中的「圖像文字分析」錯誤率並不低,再則由 rect 抓下來的圖形,是由螢幕直接抓取而來的,因些你的來源程式就得一直置頂,而不能被其他程式給覆蓋到,所以並不是一個很實用的方法,如果有前輩們有發現更好用的解法時希望能提供給小弟參考,謝謝大家。
編輯記錄
smartboss 重新編輯於 2009-01-16 10:30:29, 註解 無‧
lu
高階會員


發表:11
回覆:189
積分:195
註冊:2003-11-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-01-16 10:50:05 IP:203.73.xxx.xxx 訂閱
被點名了~~  
這個題目一開始我想到的方法基本上是區分為兩種情況
1. 該 Grid 每個cell 裡面都是類似TEdit or TLabel 的文字
2. 該 Grid 每個cell 裡面都是用DrawText 所畫出來的『圖』

第一種情況利用WINDOWS的API(GetWindowText)就可以輕易的文字抓到,但是第2種就比較麻煩了

而這個題目,我的第一時間的直覺就是,那個資料應該是『圖』而不是文字
至於為什麼有這樣的直覺~~不要問我,那是爬過一些VCL的SOURCE CODE後的反應

如果是圖,我的基本構想是,利用該程式的HANDLE再去抓到DC,再從DC去抓圖,圖抓到後,再丟去給OCR辨識

不過這只是初步構想而已,真的要實現還有很遠的路要走,而且可不可行我也不知

至於指導~~大家只是互相討論啦,每個人會的東西都不同,要互相激盪才有火花啦
hotswin
中階會員


發表:72
回覆:92
積分:52
註冊:2003-11-06

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-01-16 23:36:16 IP:220.134.xxx.xxx 訂閱
如果是我,我會採用抓記憶体的位址資料
------
http://xinjier.0424617287.com/gift/
禮贈品
smartboss
初階會員


發表:19
回覆:93
積分:42
註冊:2004-12-29

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-01-17 11:59:59 IP:218.170.xxx.xxx 訂閱
hotswin 兄您好,
我也曾想過使用該種方法,但是我實在不知從何著手,去記憶體中抓取該 Grid Cell 中的資料,再一問題是該 grid list 的資料筆數有時多有時少,這時我該如何由記憶體去取得正確的資料? 希望能多聽取前輩的建議、與指教。


===================引 用 hotswin 文 章===================
如果是我,我會採用抓記憶体的位址資料
hotswin
中階會員


發表:72
回覆:92
積分:52
註冊:2003-11-06

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-01-17 17:36:03 IP:220.134.xxx.xxx 訂閱
如果是要從何下手,最簡單的方式就是你去搜尋遊戲破解
[人物基址] 應該可以符合你的需求。
基本上你畫面上看到的文字,除非是圖片,不然都可以
在記憶体位址找到。包括筆數等各種值。

===================引 用 smartboss 文 章===================
hotswin 兄您好,
我也曾想過使用該種方法,但是我實在不知從何著手,去記憶體中抓取該 Grid Cell 中的資料,再一問題是該 grid list 的資料筆數有時多有時少,這時我該如何由記憶體去取得正確的資料? 希望能多聽取前輩的建議、與指教。


===================引 用 hotswin 文 章===================
如果是我,我會採用抓記憶体的位址資料
------
http://xinjier.0424617287.com/gift/
禮贈品
smartboss
初階會員


發表:19
回覆:93
積分:42
註冊:2004-12-29

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-01-21 11:27:21 IP:59.124.xxx.xxx 訂閱
hotswin 兄您好,
我想您提供的辦法是一定可行的,但重點在於當您正式要抓取一個 Grid cell 格裡的資料位址前,是否一定得透過某些抓位址的工具,如 game master、or 您介紹的 ut 等工具程式才能真正取得「該grid cell 裡我們想要取得的資料的記憶體位址」?
那這樣我每次一執行起我自己監控程式時,我得告知它被監控程式的 grid cell 的資料記憶體位址位址才能做到監控的能力,或者有其它的做法,能否請您指點一下?
===================引 用 hotswin 文 章===================
如果是要從何下手,最簡單的方式就是你去搜尋遊戲破解
[人物基址] 應該可以符合你的需求。
基本上你畫面上看到的文字,除非是圖片,不然都可以
在記憶体位址找到。包括筆數等各種值。

===================引 用 smartboss 文 章===================
hotswin 兄您好,
我也曾想過使用該種方法,但是我實在不知從何著手,去記憶體中抓取該 Grid Cell 中的資料,再一問題是該 grid list 的資料筆數有時多有時少,這時我該如何由記憶體去取得正確的資料? 希望能多聽取前輩的建議、與指教。


===================引 用 hotswin 文 章===================
如果是我,我會採用抓記憶体的位址資料
hotswin
中階會員


發表:72
回覆:92
積分:52
註冊:2003-11-06

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-01-22 14:00:59 IP:220.134.xxx.xxx 訂閱
有一款 CHEAT Engine(CE)  是不錯的工具,網路上也有教學影片去找看看吧。
至於要監控 資料變化 ,可以做一項Polling 的動作,去讀取記憶体就可達成了
祝你好運。

===================引 用 smartboss 文 章===================
hotswin 兄您好,
我想您提供的辦法是一定可行的,但重點在於當您正式要抓取一個 Grid cell 格裡的資料位址前,是否一定得透過某些抓位址的工具,如 game master、or 您介紹的 ut 等工具程式才能真正取得「該grid cell 裡我們想要取得的資料的記憶體位址」?
那這樣我每次一執行起我自己監控程式時,我得告知它被監控程式的 grid cell 的資料記憶體位址位址才能做到監控的能力,或者有其它的做法,能否請您指點一下?
===================引 用 hotswin 文 章===================
如果是要從何下手,最簡單的方式就是你去搜尋遊戲破解
[人物基址] 應該可以符合你的需求。
基本上你畫面上看到的文字,除非是圖片,不然都可以
在記憶体位址找到。包括筆數等各種值。

===================引 用 smartboss 文 章===================
hotswin 兄您好,
我也曾想過使用該種方法,但是我實在不知從何著手,去記憶體中抓取該 Grid Cell 中的資料,再一問題是該 grid list 的資料筆數有時多有時少,這時我該如何由記憶體去取得正確的資料? 希望能多聽取前輩的建議、與指教。


===================引 用 hotswin 文 章===================
如果是我,我會採用抓記憶体的位址資料
------
http://xinjier.0424617287.com/gift/
禮贈品
taishyang
站務副站長


發表:377
回覆:5485
積分:4552
註冊:2002-10-08

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-01-22 14:20:28 IP:118.169.xxx.xxx 訂閱
這讓我想到之前看到的踩地雷外掛的文章
http://delphi.ktop.com.tw/board.php?cid=31&fid=79&tid=90336
其中bugmans前輩提供一個連結
http://www.codeproject.com/KB/trace/minememoryreader.aspx
利用反組譯工具Olly debugger找出地雷的相關資訊
smartboss
初階會員


發表:19
回覆:93
積分:42
註冊:2004-12-29

發送簡訊給我
#10 引用回覆 回覆 發表時間:2009-01-22 17:22:45 IP:59.124.xxx.xxx 訂閱
hotswin 兄您好,
我想您的意思我能明白,我也有親身去download 該程式來測試,但或許是我表達的不是很清楚讓您誤會了,因此我在次表達一次我的情況:
>>有一款 CHEAT Engine(CE) 是不錯的工具,網路上也有教學影片去找看看吧。
他的功能與 game master 是一樣功能的,再則我要抓的資料並非 game 裡的生命值或者是財務值,我的來源資料變更的速度是非常快且即時的從 hardware 端傳到我的來源程式裡,或許您可以想像一下像股票即時交易那種程式一樣,他的數值變化恐怕一秒內就有數次之多,如果使用這樣的工具或許來不及抓到目地值,目地值己經又改變了。
再則另一問題乃在於我是開發監控端程式,而來源端的資料位址是必需在我的program一啟動時我的監控程式就必需得知,由此我的program從何主動取得來源程式的資料位址,也就說我的program本身必需具有計算出來源資料位址的能力,而不是借有其它程式或是人工方式讓我的program取得來源資料位址。


===================引 用 hotswin 文 章===================
有一款 CHEAT Engine(CE) 是不錯的工具,網路上也有教學影片去找看看吧。
至於要監控 資料變化 ,可以做一項Polling 的動作,去讀取記憶体就可達成了
祝你好運。

===================引 用 smartboss 文 章===================
hotswin 兄您好,
我想您提供的辦法是一定可行的,但重點在於當您正式要抓取一個 Grid cell 格裡的資料位址前,是否一定得透過某些抓位址的工具,如 game master、or 您介紹的 ut 等工具程式才能真正取得「該grid cell 裡我們想要取得的資料的記憶體位址」?
那這樣我每次一執行起我自己監控程式時,我得告知它被監控程式的 grid cell 的資料記憶體位址位址才能做到監控的能力,或者有其它的做法,能否請您指點一下?
===================引 用 hotswin 文 章===================
如果是要從何下手,最簡單的方式就是你去搜尋遊戲破解
[人物基址] 應該可以符合你的需求。
基本上你畫面上看到的文字,除非是圖片,不然都可以
在記憶体位址找到。包括筆數等各種值。

===================引 用 smartboss 文 章===================
hotswin 兄您好,
我也曾想過使用該種方法,但是我實在不知從何著手,去記憶體中抓取該 Grid Cell 中的資料,再一問題是該 grid list 的資料筆數有時多有時少,這時我該如何由記憶體去取得正確的資料? 希望能多聽取前輩的建議、與指教。


===================引 用 hotswin 文 章===================
如果是我,我會採用抓記憶体的位址資料
hotswin
中階會員


發表:72
回覆:92
積分:52
註冊:2003-11-06

發送簡訊給我
#11 引用回覆 回覆 發表時間:2009-01-22 21:13:34 IP:220.134.xxx.xxx 訂閱
最直接的方法是你去分析網路封包的數據,應該適合你的監控需求
那麼你需要研究的是如何hook socket的相關技術,
如果你要監控的軟件是丫三級的人寫的話,運氣好沒有加密,那麼就不用研究加解密封包。
若是需要加解密破解的話,那麼你可以試看看使用Ollydbg或是SoftIce來追蹤解密函式取得
你想要的數據。
若是你要研究加解密,可以試著去破解軟件註冊碼開始。基本上都是去分析程式中某函式的變化。
你需要一些組合語言的概念。

===================引 用 smartboss 文 章===================
hotswin 兄您好,
我想您的意思我能明白,我也有親身去download 該程式來測試,但或許是我表達的不是很清楚讓您誤會了,因此我在次表達一次我的情況:
>>有一款 CHEAT Engine(CE) 是不錯的工具,網路上也有教學影片去找看看吧。
他的功能與 game master 是一樣功能的,再則我要抓的資料並非 game 裡的生命值或者是財務值,我的來源資料變更的速度是非常快且即時的從 hardware 端傳到我的來源程式裡,或許您可以想像一下像股票即時交易那種程式一樣,他的數值變化恐怕一秒內就有數次之多,如果使用這樣的工具或許來不及抓到目地值,目地值己經又改變了。
再則另一問題乃在於我是開發監控端程式,而來源端的資料位址是必需在我的program一啟動時我的監控程式就必需得知,由此我的program從何主動取得來源程式的資料位址,也就說我的program本身必需具有計算出來源資料位址的能力,而不是借有其它程式或是人工方式讓我的program取得來源資料位址。


===================引 用 hotswin 文 章===================
有一款 CHEAT Engine(CE) 是不錯的工具,網路上也有教學影片去找看看吧。
至於要監控 資料變化 ,可以做一項Polling 的動作,去讀取記憶体就可達成了
祝你好運。

===================引 用 smartboss 文 章===================
hotswin 兄您好,
我想您提供的辦法是一定可行的,但重點在於當您正式要抓取一個 Grid cell 格裡的資料位址前,是否一定得透過某些抓位址的工具,如 game master、or 您介紹的 ut 等工具程式才能真正取得「該grid cell 裡我們想要取得的資料的記憶體位址」?
那這樣我每次一執行起我自己監控程式時,我得告知它被監控程式的 grid cell 的資料記憶體位址位址才能做到監控的能力,或者有其它的做法,能否請您指點一下?
===================引 用 hotswin 文 章===================
如果是要從何下手,最簡單的方式就是你去搜尋遊戲破解
[人物基址] 應該可以符合你的需求。
基本上你畫面上看到的文字,除非是圖片,不然都可以
在記憶体位址找到。包括筆數等各種值。

===================引 用 smartboss 文 章===================
hotswin 兄您好,
我也曾想過使用該種方法,但是我實在不知從何著手,去記憶體中抓取該 Grid Cell 中的資料,再一問題是該 grid list 的資料筆數有時多有時少,這時我該如何由記憶體去取得正確的資料? 希望能多聽取前輩的建議、與指教。


===================引 用 hotswin 文 章===================
如果是我,我會採用抓記憶体的位址資料
------
http://xinjier.0424617287.com/gift/
禮贈品
smartboss
初階會員


發表:19
回覆:93
積分:42
註冊:2004-12-29

發送簡訊給我
#12 引用回覆 回覆 發表時間:2009-01-24 23:11:23 IP:123.99.xxx.xxx 訂閱
taishyang 兄您好,
我following 您以下這個範例,並剪下部份程式碼,將我覺得奇怪的部份拿出來請教前輩,
這讓我想到之前看到的踩地雷外掛的文章
http://delphi.ktop.com.tw/board.php?cid=31&fid=79&tid=90336

我將這個 sample 裡 hook 部份的code 截取了 hack 那部份的function 出來應用,並透過 hotswin 兄 介紹的 ce 工具去取得我想 trace 的那個grid cell 的資料位址,再如以下這段程式碼,置入資料位址並將記憶體資料讀出。
[code cpp]
GetWindowThreadProcessId(hWnd,&ProcessId);
hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,ProcessId);
dwBaseAddress = 0x01005330;
ReadProcessMemory(hProcess,(void*)dwBaseAddress ,&dwBombCount,sizeof(DWORD),NULL);

[/code]
其中 dwBaseAddress 的位址是我抓到來源程式某 grid cell 的資料位址,到目前並無異議,但是問出來了,我發現當我關掉再重新啟動我的來源資料程式時,我發現上次ce 所抓到的 dwBaseAddress 值己經失效,也就是說,上一次來源程式關畢前的 dwBaseAddress 位址,與我這次重新開啟來源程式之後的 dwBaseAddress 位址是不一樣的,為了證明這事,我重新再使用 ce 再將我要的grid cell 資料再抓取一次,也確實證明他的資料位址與前次開啟時是不同的,請問像這樣的問題是怎產生的,而又有辦法克服嗎?是因為那個 grid component 是動態產生的關係造成嗎?


===================引 用 taishyang 文 章===================
這讓我想到之前看到的踩地雷外掛的文章
http://delphi.ktop.com.tw/board.php?cid=31&fid=79&tid=90336
其中bugmans前輩提供一個連結
http://www.codeproject.com/KB/trace/minememoryreader.aspx
利用反組譯工具Olly debugger找出地雷的相關資訊
smartboss
初階會員


發表:19
回覆:93
積分:42
註冊:2004-12-29

發送簡訊給我
#13 引用回覆 回覆 發表時間:2009-02-20 09:49:09 IP:115.82.xxx.xxx 訂閱
真是不好意思,該題托了將近兩個月了還未給分,我想我最後這次提問的問題我將他開另一個主題再發問一次好了,並在此謝謝 lu 兄, hotswin 兄, 與 taishyng 兄的指導~~
新的發問將放在如下位址
http://delphi.ktop.com.tw/board.php?cid=168&fid=914&tid=97267

而我想這次的主題主要是由 hotswin 做了初步的引導而讓這個問題了有初步的解決方案,因此我先在此感謝 hotswin 兄。雖後繼問題尚未釐清,但依一個主題一個結案原則先將該案結了再問下個主題。


系統時間:2017-10-22 7:04:48
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!