i’m having some problem with reading process’s memory, all i get is error 299, sometimes error 5/6, i’m new to memory reading / writing and can use any help.
This is what i have so far :
private void ScanMemory()
{
uint PID;
GetWindowThreadProcessId(GetWindowHandle(), out PID);
label3.Text = "" + (int)PID;
int valueToSearch = 4;
List<int> matchAddresses = new List<int>();
long MaxAddress = 0x7fffffff;
long address = 0;
do
{
MEMORY_BASIC_INFORMATION32 m;
IntPtr Handle = OpenProcess((int)ProcessAccessFlags.All, false, (int)PID);
uint result = VirtualQueryEx((int)Handle, (int)address, out m, (int)Marshal.SizeOf(typeof(MEMORY_BASIC_INFORMATION32)));
if (address == (long)m.BaseAddress + (long)m.RegionSize)
break;
address = (long)m.BaseAddress + (long)m.RegionSize;
SearchIntSizeValue(Handle, (int)m.BaseAddress, (int)m.RegionSize, valueToSearch, matchAddresses);
} while (address <= MaxAddress);
foreach (int res in matchAddresses)
{
listBox1.Items.Add(res);
}
}
public void SearchIntSizeValue(IntPtr hProcess, int startAddress, int endAddress, int valueToSearch, List<int> addresses)
{
byte[] buffer = new byte[4];
IntPtr bytesread;
while (startAddress < endAddress)
{
ReadProcessMemory(hProcess, (IntPtr)startAddress, buffer, 4, out bytesread);
int res = BitConverter.ToInt32(buffer, 0);
if (res == valueToSearch)
{
addresses.Add(startAddress);
}
else
{
int le;
if ((le = Marshal.GetLastWin32Error()) != 0)
{
}
}
startAddress += 4;
}
}
[StructLayout(LayoutKind.Sequential)]
struct MEMORY_BASIC_INFORMATION32
{
public uint BaseAddress;
public uint AllocationBase;
public int AllocationProtect;
public uint RegionSize;
public int State;
public int Protect;
public int lType;
}
i’m reading size of int at the moment, not really working :|, from reading in google, i saw there is this thing with privilege , though, i run vs2010 with Admin rights on windows 7, i hope it’s enough information for you to spot my problme, thanks in advance!
ReadProcessMemory… code error 299
, Помогите справиться с кодом 299
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
Senior Member Рейтинг (т): 10 |
Пытаюсь прочитать память процесса по заранее известному адресу….. HANDLE hQip=0; HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); PROCESSENTRY32 ProcEntry; ProcEntry.dwSize = sizeof(PROCESSENTRY32); Process32First(hSnapShot,&ProcEntry); do { if(lstrcmp(«qip.exe»,ProcEntry.szExeFile)==0) { hQip = OpenProcess(PROCESS_ALL_ACCESS,TRUE,ProcEntry.th32ProcessID); if(hQip==0) return 0; } } while(Process32Next(hSnapShot,&ProcEntry)); if(ReadProcessMemory(hQip,(PVOID)0x006A3AC,n,1000,&d) == 0) { d = GetLastError(); sprintf(n,»%d»,d); MessageBox(HWND_DESKTOP,n,»pass:»,0); } else { MessageBox(HWND_DESKTOP,n,»»,0); } GetLastError() всегда говорит о 299 ошибке: ReadWriteProcessMemory запрос выполнен не полнустью. |
Мальчиш |
|
barberan if (hQip) { if(ReadProcessMemory(hQip,(PVOID)0x006A3AC,n,1000,&d) == 0) { d = GetLastError(); sprintf(n,»%d»,d); MessageBox(HWND_DESKTOP,n,»pass:»,0); } else { MessageBox(HWND_DESKTOP,n,»»,0); } } во вторых адрес 0x006A3AC на разных платформах, системах, при разных условиях может быть разным. Добавлено 26.08.08, 06:52 Добавлено 26.08.08, 06:53 |
leo |
|
Цитата Мальчиш @ 26.08.08, 06:51 во вторых адрес 0x006A3AC на разных платформах, системах, при разных условиях может быть разным.
Во-вторых — верно, а в-третьих — Майкрософт А вот хватает ли размера переменной n для 1000 байт — из приведенного кода не видно |
barberan |
|
Senior Member Рейтинг (т): 10 |
if (hQip) это проверено заранее. |
leo |
|
Ошибка 299 вылезает и в том случае, когда память по адресу вообще не доступна. Проверь число прочитанных байт d — если 0, значит память по данному адресу вообще не выделена — можешь проверить по VirtualQueryEx |
barberan |
|
Senior Member Рейтинг (т): 10 |
С этим разобрался, спасибо. А еще вопрос.. как в памяти процесса найти что-то определнное, и узнать по какому адресу оно лежит ? |
leo |
|
Цитата barberan @ 26.08.08, 16:59 как в памяти процесса найти что-то определнное, и узнать по какому адресу оно лежит ?
Сам понимаешь, вопрос не только не новый, но и достаточно «популярный» |
barberan |
|
Senior Member Рейтинг (т): 10 |
Подскажите, как найти границы адресов процесса? Делаю так: MEMORY_BASIC_INFORMATION mbi; SIZE_T mbi_size = sizeof(mbi); DWORD startaddr=0, //начальный адрес lowaddr, //нижняя граница highaddr; //верхняя граница do { if( VirtualQueryEx(hQip,(LPCVOID)startaddr,&mbi,mbi_size) != sizeof(mbi)) { return 0; } startaddr+=(DWORD)mbi.RegionSize; }while(mbi.State != MEM_COMMIT); lowaddr = mbi.BaseAddress; //типа нашли нижнюю границу процесса. Через отладчик смарел… startaddr сначала +=65536 потом еще +=4096… Получается всего 2 страницы MEM_COMMIT чего быть то и не может. |
B.V. |
|
leo |
|
Цитата barberan @ 27.08.08, 21:11 как найти границы адресов процесса?
Еще как может |
barberan |
|
Senior Member Рейтинг (т): 10 |
Хм.. РАзобрался. А вот еще вопрос… ведь каждый адресс, если верить карте памяти состояит из 16 байт(или как это… — секций чтоли). В каждом байте(секции) хранится 1 символ. Иногда у меня странно считываетются не все 16(я точно не знаю что происходит), но знаючи, что например по данному адрессу «hello,world» я вижу чёта типа «lo,world» или «hello,wor». Что есть что? |
leo |
|
Цитата barberan @ 28.08.08, 20:13 ведь каждый адресс, если верить карте памяти состояит из 16 байт
Не верь глазам своим |
barberan |
|
Senior Member Рейтинг (т): 10 |
а как бы это корректировать по ходу ??? ведь не знаю что увижу, толи леву половинку, толи правую. КАк быть? |
leo |
|
Никак. PS: В дельфиBCB поиск подстроки реализуется легко — выделяем память под AnsiString через SetLength(s,mbi.RegionSize), читаем в строку весь регион и затем ищем подстроку функцией Pos. Такой поиск работает для любых бинарных данных, т.к. диапазон поиска ограничивается явно заданной длиной строки, а не нулевыми символами, которые могут встречаться в произвольных данных. Есть ли нечто подобное в CC++ не знаю. Если нет, то придется организовать ручками: юзать в цикле strstr и перескакивать нулевые символы, пока не дойдем до конца региона |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- Visual C++ / MFC / WTL
- Следующая тема
[ Script execution time: 0,0386 ] [ 16 queries used ] [ Generated: 13.06.23, 10:11 GMT ]
Мой код работает на win7 32bit, но когда я использую EnumProcessModules
, он возвращает false и getlasterror() возвращает код ошибки 299, который заявляет, что программа 32bit, и этот оператор не может работать на 64-битной системе.
Интересно, почему это происходит, и почему система думает, что я работаю на 64-битной ОС?
Код, который я использую:
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);
if (hProcess)
{
HMODULE hMod = NULL;
DWORD cbNeeded = 0;
if (EnumProcessModules(hProcess, &hMod, sizeof(hMod), &cbNeeded))
{
//do something here...
}
}
dwPid — это идентификатор процесса, который я хочу манипулировать.
PS. Эта ошибка возникает только на одной из моих тестовых машин, другие — в порядке. Таким образом, эта проблема может быть связана с конкретной конфигурацией машины или системы?
- Классы состояния
- Коды ответов сервера
- 1xx
- 2xx
- 3xx
- 4xx
- 5xx
HTTP status code — (с англ.) код состояния HTTP; часть первой строки ответа сервера при запросах по протоколу HTTP. Он (код ответа) представляет собой целое число из трёх цифр, первая из которых указывает на класс состояния. За кодом ответа обычно следует, отделённая пробелом, поясняющая фраза на английском языке, которая разъясняет человеку причину именно такого ответа:
200 OK
404 Not Found
500 Internal Server Error
Классы состояния
- 1xx: Informational
- Информационные ответы — запрос от клиента принят, работа продолжается.
- 2xx: Success
- Успех — запрос от клиента принят, понятен и может быть выполнен.
- 3xx: Redirection
- Перенаправление — для выполнения запроса необходимы дальнейшие действия.
- 4xx: Client Error
- Ошибка клиента — запрос составлен неверно или не может быть выполнен.
- 5xx: Server Error
- Ошибка сервера — запрос правильный, но сервер не может его выполнить.
Коды ответов сервера
Номер | Поясняющая фраза | Перевод |
---|---|---|
1xx | Informational | Информационные ответы |
100 | Continue | Продолжить |
101 | Switching Protocols | Переключение протоколов |
102 | Processing | Идёт обработка |
103-199 | Не назначены | |
2xx | Success | Успех |
200 | OK | Хорошо |
201 | Created | Создано |
202 | Accepted | Принято |
203 | Non-Authoritative Information | Информация не авторитетна |
204 | No Content | Нет содержимого |
205 | Reset Content | Сбросить содержимое |
206 | Partial Content | Частичное содержимое |
207 | Multi-Status | Многостатусный |
208 | Already Reported | Уже сообщили |
209-225 | Не назначены | |
226 | IM Used | Использовано IM |
227-299 | Не назначены | |
3xx | Redirection | Перенаправление |
300 | Multiple Choices | Множество выборов |
301 | Moved Permanently | Перемещено навсегда |
302 | Found | Найдено |
303 | See Other | Смотреть другое |
304 | Not Modified | Не изменялось |
305 | Use Proxy | Использовать прокси |
306 | Не используется | |
307 | Temporary Redirect | Временное перенаправление |
308 | Permanent Redirect | Постоянное перенаправление |
309-399 | Не назначены | |
4xx | Client Error | Ошибка клиента |
400 | Bad Request | Плохой, неверный запрос |
401 | Unauthorized | Неавторизован |
402 | Payment Required | Необходима оплата |
403 | Forbidden | Запрещено |
404 | Not Found | Не найдено |
405 | Method Not Allowed | Метод не поддерживается |
406 | Not Acceptable | Неприемлемо |
407 | Proxy Authentication Required | Необходима аутентификация прокси |
408 | Request Timeout | Истекло время ожидания |
409 | Conflict | Конфликт |
410 | Gone | Удален |
411 | Length Required | Необходима длина |
412 | Precondition Failed | Условие ложно |
413 | Payload Too Large | Большая нагрузка |
414 | URI Too Long | URI слишком длинный |
415 | Unsupported Media Type | Неподдерживаемый тип данных |
416 | Range Not Satisfiable | Неприемлемый диапазон |
417 | Expectation Failed | Ожидаемое неприемлемо |
418-420 | Не назначены | |
421 | Misdirected Request | Неверно адресованный запрос |
422 | Unprocessable Entity | Необрабатываемый экземпляр |
423 | Locked | Заблокировано |
424 | Failed Dependency | Невыполненная зависимость |
425 | Не назначен | |
426 | Upgrade Required | Необходимо обновление |
427 | Не назначен | |
428 | Precondition Required | Необходимо предусловие |
429 | Too Many Requests | Слишком много запросов |
430 | Не назначен | |
431 | Request Header Fields Too Large | Поля заголовка запроса слишком большие |
432-450 | Не назначены | |
451 | Unavailable for Legal Reasons | Недоступно по юридическим причинам |
432-499 | Не назначены | |
5xx | Server Error | Ошибка сервера |
500 | Internal Server Error | Внутренняя ошибка сервера |
501 | Not Implemented | Не реализовано |
502 | Bad Gateway | Плохой, ошибочный шлюз |
503 | Service Unavailable | Сервис недоступен |
504 | Gateway Timeout | Шлюз не отвечает |
505 | HTTP Version Not Supported | Версия HTTP не поддерживается |
506 | Variant Also Negotiates | Вариант тоже проводит согласование |
507 | Insufficient Storage | Переполнение хранилища |
508 | Loop Detected | Обнаружена петля |
509 | Не назначен | |
510 | Not Extended | Не расширено |
511 | Network Authentication Required | Требуется сетевая аутентификация |
512-599 | Не назначены |
- HTTP
- Hypertext Transfer Protocol (HTTP) Status Code Registry
- Список кодов состояния HTTP
31.08.2014
DWORD pid;
HWND hForeground = GetForegroundWindow();
GetWindowThreadProcessId(hForeground, &pid);
const int MAX_SIZE = 512;
char buffer[MAX_SIZE];
HANDLE pHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
while (true) {
int l = 10;
cout << l << endl;
if (ReadProcessMemory(pHandle, (LPCVOID)&l, buffer, sizeof(l), 0) == 0 && GetLastError() == 299)
cout << "paging file"<<buffer << endl;
else if (ReadProcessMemory(pHandle, (LPCVOID)&l, buffer, sizeof(l), 0) !=0)
cout << "RAM" << endl;
cout << l << endl;
Sleep(100);
system("CLS");
}
по моей задумке программа должна получать ячейку памяти занимаемую переменной l и если она есть в оперативной памяти то выводится RAM, и соответственно если ее там нет то значит она в файле подкачки. Но почему-то происходит ошибка 299 и buffer не заполняется.