Форум программистов, компьютерный форум CyberForum.ru

RAM, чтение и запись в RAM, Pointer ы - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Не компилируется программка http://www.cyberforum.ru/cpp-beginners/thread927823.html
Здравствуйте Учусь программированию. Сейчас прохожу глобальные переменные. Переписал программку из учебника. Когда стал компилировать, то компилятор (Dev-C++4.9.9.2) пишет ошибку. Проверил несколько раз - переписал все точно из книги. Если не в напряг посмотрите плиз. #include <iostream> using namespace std; void func1 (); void func2 (); int count;
C++ В правильном ли направлении я иду? (Разработать программу для составления списка заданий для параллельных процессоров) Есть задачка: Разработать программу для составления списка заданий для параллельных процессоров. Три одинаковых центральных процессора могут выполнять М заданий. Каждое задание может быть выполнено на любом процессоре, и, если задание загружено в процессор, оно находится в нем до полного завершения(т.е. задания не могут прерываться или разделяться между процессорами). При i=1,..,M задание i... http://www.cyberforum.ru/cpp-beginners/thread927804.html
Кодировка VS или конслоь C++
Собственно тока вчера написал "Hello,World !" на с++. Терь по книжке пошли задания , но появилась проблема с кодировкой! Пытаюсь вывести сообщение в консоль , а появляются кроказябры... PS Среда VS2010 , кодеровка в консоле cp1251
C++ нужно найти Глобальные Переменные в .срр файле
у меня вот такая задача Дано много .срр файлов, которые являют собой полноценные программы со своими мейнами. Нужно найти для каждого файла его глобальные переменные. Приветствуются отсылки к каким-нибудь утилитам, которые это умеют делать парсер писать не реально
C++ Вставка листа в дерево http://www.cyberforum.ru/cpp-beginners/thread927753.html
Я тут изучал реализацию двоичного дерева поиска и застопорился на одном моменте: не могу понять зачем при вставке листа( узла ) в дерево используется указатель на указатель на узел. Пробовал сделать через указатель на узел, но ничего не получилось. Подскажите, для чего здесь нужен указатель на указатель? Кусок кода из Tree.h template< typename NODETYPE > void Tree< NODETYPE >::insertNode(...
C++ Ввод данных из файла для решения симплекс метода Доброго времени суток. Помогите пожалуйста, мне надо брать данные из текстового файла, обрабатывать их и выдавать в другой файл. В программе реализована консольная версия и вывод в файл. #include <iostream> #include <fstream> #include <cmath> #include <windows.h> using namespace std; char* Rus(const char* text); char bufRus; подробнее

Показать сообщение отдельно
Misterkat
7 / 7 / 0
Регистрация: 16.11.2012
Сообщений: 83

RAM, чтение и запись в RAM, Pointer ы - C++

24.07.2013, 06:37. Просмотров 1189. Ответов 10
Метки (Все метки)

Так! Начну сразу с проблемы.
Допустим есть приложение "какая-то хрень.exe", а в нем есть переменная допустим "32" с типом integer(int), а проблема заключается в том, что переменная находится каждый раз в разном участке памяти! . Ну ладно, нашел я что такое Pointer - Некий адрес+смещение = нужный адрес! Вроде бы все нишьяГ, но находим снова проблему:
поинтер начинается с адреса, который должен найтись по СУПЕРПУПЕРСЛОЖНОЙФОРМУЛЕ: "какая-то хрень.exe+нулевое смещение = некий адрес". И так, кто еще не понял, вопрос заключается в следующем: как определить начальный адрес приложения? Имею ввиду:
0x00000 - начало озу
... - всякие программы
0x001d0 - начало выделенной озу под "какая-то хрень.exe" - То, что нужно узнать.
...
0xFFFFFF
ЗЫ:На всякий случай кину сорс:
main.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#include <windows.h>
#include <TlHelp32.h>
#include "MemoryManager.h"
#include <gdiplus.h>
 
#pragma comment(lib, "gdiplus.lib")
 
#define ID_BUTTON1 3000
#define ID_BUTTON2 3001
#define ID_BUTTON3 3002
#define ID_EDIT1 2000
 
 
HINSTANCE hInst;
char* szClassName = "ClassOFTheWindow";
char* szWindowName = "Sniper Elite Multiplayer Trainer";
 
WCHAR Health[32];
WCHAR Ammo[32];
WCHAR Grenades[32];
 
 
void GdiPaint(HDC hdc)
{
    Gdiplus::Graphics graphics(hdc);
    Gdiplus::SolidBrush brush(Gdiplus::Color::Chocolate);
    Gdiplus::Pen BrushPen(Gdiplus::Color::Aqua);
    Gdiplus::FontFamily fontFamily(L"Times New Roman");
    Gdiplus::Font font(&fontFamily, 24, Gdiplus::FontStyleRegular, Gdiplus::UnitPixel);
    Gdiplus::PointF HealtTextPos(10.0f, 20.0f);
    Gdiplus::PointF AmmoTextPos(10.0f, 75.0f);
 
    graphics.DrawString(Health, -1, &font, HealtTextPos, &brush);
    graphics.DrawString(Grenades, -1, &font, AmmoTextPos, &brush);
}
 
int RegClass(WNDPROC Proc, LPCTSTR szName)
{
WNDCLASS WindowClass; 
WindowClass.style = CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS; 
WindowClass.cbClsExtra = WindowClass.cbWndExtra = 0; 
WindowClass.lpfnWndProc = Proc; 
WindowClass.hInstance = hInst; 
WindowClass.hIcon = LoadIcon(NULL, IDI_WINLOGO); 
WindowClass.hCursor = LoadCursor(NULL, IDC_ARROW); 
WindowClass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); 
WindowClass.lpszMenuName = (LPCSTR)NULL; 
WindowClass.lpszClassName = szName; 
return RegisterClass(&WindowClass);
}
 
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){
static short cx; 
static short cy; 
static short left; 
static short top;
 
HWND hEdit;
switch(msg)
{
 case WM_CREATE: { 
      
      return 0;
      }
 case WM_PAINT: {
      PAINTSTRUCT ps;
      HDC hdc = BeginPaint(hwnd, &ps);
      GdiPaint(hdc);
      EndPaint(hwnd, &ps);
      
      return 0;
      }
 case WM_MOVE: { 
      left = LOWORD(lParam);
      top = HIWORD(lParam);
      return 0;
      }
 case WM_SIZE: { 
      cx = LOWORD(lParam);
      cy = HIWORD(lParam);
      return 0;
      }
 case WM_COMMAND: { 
      switch(LOWORD(wParam))
      {   
        case ID_BUTTON1: {
             MemoryManager* MM = new MemoryManager("sniperelite.exe");
             DWORD offsets[3] = {0x438, 0x30, 0x328};
             DWORD offsetsAmmo[3] = {0x4c, 0x16c, 0x18};
             DWORD offsetsGrenades[3] = {0x594, 0x174, 0x20};
             
             wsprintfW(Health, L"Proccess ID = %d \nЖизни: %d(0x%X)         ", MM->GetPID(),
                (DWORD)MM->ReadPointer(0x1dc0e28, offsets, 3).toFloat(), MM->ReadPointer(0x1dc0e28, offsets, 3, true).toDword());
             
             wsprintfW(Ammo, L"\nПатроны: %d(0x%X)", MM->ReadPointer(0x1088F4F8, offsetsAmmo, 3).toDword(), MM->ReadPointer(0x1088F4F8, offsetsAmmo, 3, true).toDword());
             InvalidateRect(hwnd, NULL, true);
 
             wsprintfW(Grenades, L"\nЛимонки: %d(0x%X)", MM->ReadPointer(0x100f5830, offsetsGrenades, 3).toDword(), MM->ReadPointer(0x100f5830, offsetsAmmo, 3, true).toDword());
             InvalidateRect(hwnd, NULL, true);
             return 0; 
             }
      }
      return 0;
      }
 case WM_DESTROY: {
      PostQuitMessage(0);
      return 0;
      }
 }
 return DefWindowProc(hwnd, msg, wParam, lParam);
}
 
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
 MSG msg;
 HWND hwnd;
 HWND hButton1;
 Gdiplus::GdiplusStartupInput gdiplusStartupInput;
 ULONG_PTR gdiplusToken;
 if(!RegClass(WndProc, szClassName))
                       return FALSE;
 GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
 hwnd = CreateWindow(szClassName, szWindowName, WS_OVERLAPPEDWINDOW, 0, 0, 400, 200, NULL, NULL, hInst, NULL);
 if(!hwnd)
          return FALSE;
 
 hButton1 = CreateWindow("button", "Обновить", WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON, 100, 125, 100, 25, hwnd, (HMENU)ID_BUTTON1, hInst, NULL);
 
 ShowWindow(hwnd, SW_SHOW);
 UpdateWindow(hwnd);
 
 while(GetMessage(&msg, NULL, 0, 0))
 {
  TranslateMessage(&msg);
  DispatchMessage(&msg);
 }
 Gdiplus::GdiplusShutdown(gdiplusToken);
 return msg.wParam;
}
MemoryManager.h:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#define MAXBUFFER_SIZE 255
class MemoryManager
{
public: 
        MemoryManager(char* pName)
        {
         this->pName = pName;  
         UpdatePID();                  
        }
        ~MemoryManager();
        
        void UpdatePID()
{
      HANDLE SnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
      PROCESSENTRY32 pInfo;
      pInfo.dwSize = sizeof(PROCESSENTRY32);
      
      if(Process32First(SnapShot, &pInfo))
      {
           while(Process32Next(SnapShot, &pInfo))
                   {
                    if(_stricmp(pName, pInfo.szExeFile) == 0)
                    {
                     pID = pInfo.th32ProcessID;
                     CloseHandle(SnapShot);
                     break;
                    }
                   }
      }
 
}
 
MemoryManager& ReadMemory(DWORD adress, DWORD size)
{
      memset(buffer, 0, MAXBUFFER_SIZE);
      DWORD OLDPROTECT = 0;
      
      HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, pID);
      VirtualProtectEx(hProcess, (void*)adress, size, PAGE_EXECUTE_READWRITE, &OLDPROTECT);
      ReadProcessMemory(hProcess, (void*)adress, buffer, size, NULL);
      VirtualProtectEx(hProcess, (void*)adress, size, OLDPROTECT, &OLDPROTECT);
      CloseHandle(hProcess);
      return *this;
}
 
void WriteMemory(DWORD adress, void* content, DWORD size)
{
      DWORD OLDPROTECT = 0;
      
      HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, pID);
      VirtualProtectEx(hProcess, (void*)adress, size, PAGE_EXECUTE_READWRITE, &OLDPROTECT);
      WriteProcessMemory(hProcess, (void*)adress, content, size, NULL);
      VirtualProtectEx(hProcess, (void*)adress, size, OLDPROTECT, &OLDPROTECT);
      CloseHandle(hProcess);
}
 
DWORD toDword()
{
      DWORD buf = 0;
      memcpy(&buf, buffer, sizeof(DWORD));
      return buf;
}
 
MemoryManager& ReadPointer(DWORD adress, DWORD* offset, DWORD nOffsets, bool getAddr = false)
{
        for(int i = 0; i < nOffsets; i++)
       {
       if(i == nOffsets - 1)
            {
             if(getAddr == true)
                {
                 DWORD buff = adress + offset[i];
                 memcpy(buffer, &buff, sizeof(DWORD));
                 return *this;
                }
            }
        adress = ReadMemory(adress + offset[i], sizeof(DWORD)).toDword();
       }
       return *this;
}
 
 
 
char* toStringA()
{
      DWORD len = strlen((char*)buffer);
      static char buff[MAXBUFFER_SIZE];
      memset(buff, 0, MAXBUFFER_SIZE);
      strncpy(buff, (char*)buffer, len);
      return buff;
}
float toFloat()
{
      float buf = 0.f;
      memcpy(&buf, buffer, sizeof(float));
      return buf;
}
DWORD GetPID(){return pID;}
private:
        char* pName;
        DWORD pID;
        byte buffer[MAXBUFFER_SIZE];
};
Добавлено через 6 часов 53 минуты

Не по теме:

Да ну.... Ребята, ну ответьте, пожалуйста. Тема уходит в ж*пу ведь.

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru