線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:5297
推到 Plurk!
推到 Facebook!

turbo c 內如何讀取 memory 位址?

答題得分者是:aftcast
boyce23
一般會員


發表:2
回覆:6
積分:1
註冊:2008-03-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-03-20 11:01:56 IP:210.243.xxx.xxx 訂閱
請問大家:

現在有個作業需要讀取pc 系統memory位置
而且必須使用turbo c 來讀取像0x000fe0c1
然後把他映出來到螢幕上
我的程式寫法

#include
void main()
{
char far *memory =(char far*)0x000fe0c1;
printf("%c",memory);
}
印出來的值很奇怪 -44(十進制)
這程式主要目的是要讀取bios 版本位置 ,另外我需要在完全dos下執行,所以必須使用turbo c
這方面第一次接觸,很多地方不懂
懇請各位先進,能給小弟指引迷津,弄了一陣子了,還是沒辦法出來
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-03-20 13:37:26 IP:163.28.xxx.xxx 訂閱
所以你是期待會是什麼值?格式?型態?
------
FPGA驗證, FPGA開發平台, http://smims.com
boyce23
一般會員


發表:2
回覆:6
積分:1
註冊:2008-03-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-03-20 13:56:12 IP:210.243.xxx.xxx 訂閱
謝謝您
我想我不確定我這樣讀是對的!

我修改過 位置0x000fe0c1位置,之後設定%x輸出16進制
修改位置後得到的都是一樣的結果

所以我懷疑是程式上沒有讀取正確,上網詢問
編輯記錄
boyce23 重新編輯於 2009-03-20 14:00:33, 註解 無‧
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-03-20 14:04:55 IP:163.28.xxx.xxx 訂閱
你設定16進位值在此位置
用char讀出?
應該只會與16進位中的第一個字元值相同吧?
------
FPGA驗證, FPGA開發平台, http://smims.com
boyce23
一般會員


發表:2
回覆:6
積分:1
註冊:2008-03-06

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-03-20 14:21:45 IP:210.243.xxx.xxx 訂閱
您是說我的程式寫法只能讀取到固定字串的位置?
那這樣子我該用什麼語法,能夠把該位置上memory資料讀取進來

另外我宣告 int i;
i=&memory; 會把memory位置內容給i
然後我在printf("%x",i);
都是一樣的值!
不好意思,懇請指教,謝謝您
編輯記錄
boyce23 重新編輯於 2009-03-20 14:25:25, 註解 無‧
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-03-20 15:16:26 IP:163.28.xxx.xxx 訂閱

[code cpp]
DWORD br;
char *buff;
long offset;
int *ibuff;

buff = new char [65535]; // buffer size
offset = 0x000fe0c1;
ReadProcessMemory(this, (void*)(0x00000000 offset), (void*)&buff[0], 65535, &br);

ibuff = new int [65535];
for(unsigned int i=0;i<65535;i )
{
ibuff[i] = (int)*(buff i);
}
sprintf(msg,"ibuff[0] = [%d]", ibuff[0] );
Memo2->Lines->Add(msg);

delete [] ibuff;
delete [] buff;

[/code]
------
FPGA驗證, FPGA開發平台, http://smims.com
boyce23
一般會員


發表:2
回覆:6
積分:1
註冊:2008-03-06

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-03-20 15:54:48 IP:220.228.xxx.xxx 訂閱
很感謝您幫我跑這段程式,謝謝您樂心回答,讓我了解另一個求解方式
在TURBO C中 不支援ReadProcessMemory 這個函式
是不是有在turbo c 求memory 的方式?
版主很抱歉,因為沒有turco c 版,所以我在 c builder 版尋求解答



編輯記錄
boyce23 重新編輯於 2009-03-20 15:58:29, 註解 無‧
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-03-22 03:27:55 IP:122.120.xxx.xxx 訂閱
我想你對dos很不熟吧? dos時代的記憶體模式和windows3.0以後的windows很不同。dos是segmentation的管理,windows則是flat 方式。

簡單一點講,dos的記憶體表達有二種,一種叫絕對位址,一種叫邏輯位址。當然寫程式時一般都是用第二種。而這二種位址有公式轉換。
邏輯位址是由seg與offset來表示。即 seg:offset ,其中seg與offset都是16位元,也就是2byte。但dos的記憶管理只有20位元並非32位元。於是…
絕對位址(20bit) = seg*16 offset

而你所列出來的位址0x000fe0c1,這是絕對位址吧? 你該把它拆成 0xfe0c 與 0x0001的邏輯位址。然後再放入 far pointer…所以應該是
int i;
char far *memory =(char far*)0xfe0c0001;
for(i=0;i<4;i )
{
printf("X",*memory);
memory ;
}


===================引 用 boyce23 文 章===================
請問大家:

現在有個作業需要讀取pc 系統memory位置
而且必須使用turbo c 來讀取像0x000fe0c1
然後把他映出來到螢幕上
我的程式寫法

#include
void main()
{
char far *memory =(char far*)0x000fe0c1;
printf("%c",memory);
}
印出來的值很奇怪 -44(十進制)
這程式主要目的是要讀取bios 版本位置 ,另外我需要在完全dos下執行,所以必須使用turbo c
這方面第一次接觸,很多地方不懂
懇請各位先進,能給小弟指引迷津,弄了一陣子了,還是沒辦法出來

------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2009-03-23 09:03:14, 註解 無‧
boyce23
一般會員


發表:2
回覆:6
積分:1
註冊:2008-03-06

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-03-22 08:31:07 IP:61.59.xxx.xxx 訂閱
 謝謝兩位先進的熱心回復,讓我的問題得以解決

抓到memory的位址了,另外我對dos真的很不熟 ,
turbo c也第一次用,所以請原諒我厚著臉皮一直丟問題

尋找了很多網站 ,一直不是很了解,後來我跑去 小木偶網站去看

套用debug來看對印的memory 位置,驗證turbo c printf 出來的位置

發現0x00f0e0c1 需除16 分成兩段來看,就如同先進所說的一樣

套用 先進turbo c 程式抓到了memory 位置,另外vc我也有跑過,也可得到ans結果

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