Консультация № 49597
19.07.2006, 17:35
0.00 руб.
0 2 2
Здравствуйте эксперты .
Появился вопрос !
Вопрос:
Как допустим DWORD перевести в ASCII ,,,???,,,
Или так почему моя программа выдаёт что-то что я видеть вообше не собирался =)
Код на Visual C++
#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
FILE *f;
char zt[80];
char ds[80];
char buf[1];
HANDLE fg;
HWND hWnd;
DWORD pid;
DWORD adress=0x00000000;
DWORD adrss=0xFFFFFFFF;
DWORD lin=0x00000000;
///////////////////////////////////////////
cout<<"Enter name Window: "<<endl;
cin >> zt;
hWnd = FindWindow(0,zt);
if (hWnd=0){
cout << "Error... "<<endl;
}
GetWindowThreadProcessId(hWnd,&pid);
fg = OpenProcess(PROCESS_ALL_ACCESS|PROCESS_VM_READ,FALSE,pid);
if (fg=0){
cout <<"Error #2"<<endl;
}
///////////////////////////////////////
cout << "Enter file name: "<<endl;
cin >> ds;
f=fopen(ds,"wb+");
while(adress<adrss){
ReadProcessMemory(fg,&lin,&buf,1,NULL);

////////////////////////
if (buf!=0){
fwrite(&buf,1,15,f);
}
///////////////////////
lin++;
//////////////////////
}


return 0;
}
//////////////////////////////////////////////

Что хранится в памяти процесса тоесть окна или программки !
И не в Hex а в ASCII . Или ещё в чём нибудь чтобы было понятно !
Ну в коде всё понятно подскажите где я допустил ошибку !
Спасибо за внимание !

Обсуждение

Неизвестный
19.07.2006, 18:08
общий
это ответ
Здравствуйте, Tamashev Denis M!

Насколько я понял, Вы пытаетесь процесть всю доступную память процесса и вывести ее в отдельный файл. Если так, то проблема не в переводе DWORD в ASC...

Я бы переделал цикл так (см. Приложение).
1. Обратите внимание, что lin и так содержит адрес области памяти, поэтому применение & меняет логику программы. Точно также buf является указателем на область памяти, содержащей 1 символ.
2. Нужно проверять результат ReadProcessMemory - если ошибка, он равен 0.
3. Раз Вы считали из памяти 1 символ, то и выводить в файл нужно один символ.

Приложение:
f=fopen(ds,"wb+");for(lin=0;lin<adrss;lin++) if(ReadProcessMemory(fg,(LPCVOID)lin,buf,1,NULL)) fwrite(buf,1,1,f);return 0;
Неизвестный
22.07.2006, 04:58
общий
это ответ
Здравствуйте, Tamashev Denis M!
Здавствуй, хоть мой вариант и не возвращает правильного результата, хочу сказать, что у тебя здесь неск. ошибок: Во первых - все проверки, которые ты выполняешь на NULL, сделаны не правильно - НЕ равно нулю ( = 0) а (== 0). Тогда у тебя будут выскакивать ошибки на экране.
Во-вторых - проверь ответ от ReadProcessMemory. В нём говорилось если что, "неверный дескриптор", который получался от FindWindow и GetWindowThreadProcessId.
Ну и последнее, что я заметил - это то, что функция FindWindow работает с именем КЛАССА тоже, а ты его опускаешь. Я с помощью winsighta получил имя например некоторого окна, и имя его заголовка, но программа перестала выдавать ошибки, но всё-равно почему-то память не копировала. Не знаю, почему, может быть не было к ней доступа. Попробуй, если что - пиши. Ниже мой вариант (я переделал его для своег Borland C++ 5.02, если что в вижуале может что-нибудь не сработать)

Приложение:
int _tmain(int argc, _TCHAR* argv[]){ FILE *f; char zt[80]; char ds[80]; char buf[16]; HANDLE fg; HWND hWnd; DWORD pid; DWORD adress=0x00100000; DWORD adrss=0x00400000; DWORD lin=adress; /////////////////////////////////////////// cout<<"Enter name Window: "<<endl; cin >> zt; hWnd = FindWindow("ml_online_window",zt); if (hWnd == NULL) { cerr << "Error can‘t get window "<<endl; cin.get(); exit(-1); } GetWindowThreadProcessId(hWnd,&pid); fg = OpenProcess(PROCESS_ALL_ACCESS | PROCESS_VM_READ, FALSE, pid); if (fg == NULL) { cerr <<"Can‘t Get Descriptor" << endl; cin.get(); exit(-1); } /////////////////////////////////////// cout << "Enter file name: "<<endl; cin >> ds; f=fopen(ds,"wb+"); while(adress<adrss) { if (ReadProcessMemory(fg,&lin,buf, 16,NULL) == 0) { cerr << endl << "Error occured! GetLastError() == " << GetLastError() << endl << "Error message is: "; char errorMsg[256]; char errorMsg2[256]; FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language (LPTSTR) errorMsg, 256, NULL); CharToOem(errorMsg, errorMsg2); cerr << errorMsg2 << endl; cin.get(); break; } cout << lin << endl; //////////////////////// /////////////////////// fwrite(&buf,1,15,f); lin++; ////////////////////// } return 0;}
Форма ответа