Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.06.2016, 15:48   #1
doneto
 
Регистрация: 30.08.2009
Сообщений: 7
Вопрос вопрос delphi -> ReadProcessMemory + Double - как вывести?

15:39 22.06.2016

Всем здраствуйте.
Прошу помощи.
Возник вопрос. пишу своего бота. вижу в AtrMany и CheatEngine 6.4. нужную ячейку. в CheatEngine при отсеивании и поиске указателя вижу вверху combo_box там можно выбрать тип числа -что мы хотим увидеть и при выборе:

4 byte: 2405181686

а типа double - видим то что и должны видеть ( то что в ячейке лежит )..

double: 2774,88

в делфи у меня получается считывыать ТОЛЬКО тип 4byte. ( исходник ниже )

( т.е на форме лежит лейбл куда пишется то что беру из ячейки памяти). и вижу я там число 4 byte: 2405181686
а в ячейке тестовой программы лежит ( double: 2774,88 ) - и если я его меняю, то и в CheatEngine - число тоже меняется, и если я в CheatEngine меняю тип числа на 4byte - то и вижу тоже что и на своей форме в лейбле... возник вопрос ( ищу уже давно ответ ):

как считать данные типа double.
или каким алгоритмом из числа 4byte = 2405181686
получить число типа double: 2774,88

т.е. как правильно считать из памяти число с плавающей точкой типа double.

------- ниже исходинк делфи ( 2006, winxp_sp3)
форма имеет 2 лейбла и один таймер.
вся инфа выводится в 1-й лебл.
--------------
Код:
============ begin source code ============
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Label1: TLabel;
    Label2: TLabel;
    procedure Timer1Timer(Sender: TObject);


  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);

var

hWin: hWnd;     // для поиска хендла окна
ProcId: cardinal; // для поиска  ID процесса
hProc: THandle;

AdressW: dword; // сюда прочитаем адрес из указателя 
Adress: dword;
readwrite: Cardinal;

begin

hWin:=FindWindow(nil, 'Frm_1');

if hWin<>0 then

GetWindowThreadProcessId(hWin, @ProcId);

hProc:= OpenProcess(Process_All_Access, False, ProcId);

AdressW:=$46c8e0; //Адрес // правильный - показывает то что надо
label2.Caption := 'Данные в ячейке $46c8e0 сейчас равны: ';

begin

ReadProcessMemory(hProc, pointer(AdressW), @Adress, sizeof(Adress), readwrite);  // читаем адрес из указателя

ReadProcessMemory(hProc, pointer(Adress+$4d0), @Adress, sizeof(Adress), readwrite);

ReadProcessMemory(hProc, pointer(Adress+$40), @Adress, sizeof(Adress), readwrite);

ReadProcessMemory(hProc, pointer(Adress+$5d0), @Adress, sizeof(Adress), readwrite);

ReadProcessMemory(hProc, pointer(Adress+$6b4), @Adress, sizeof(Adress), readwrite);

ReadProcessMemory(hProc, pointer(Adress+$2fc), @Adress, sizeof(Adress), readwrite);

end;

//label1.Caption:=intToStr(Adress) ;
label1.Caption := FloatToStr(Adress);

CloseHandle(hProc);

end;

end.
============end source code ============
т.е. данный код нормально читает , но число я вижу не в том формате - как в ячейке...
как вывести число в формате Double с точкой.?

спасибо.

Последний раз редактировалось Вадим Мошев; 24.06.2016 в 05:10.
doneto вне форума Ответить с цитированием
Старый 22.06.2016, 16:47   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

а ты не пробовал сделать так
Код:
Adress: dword;
Adress: double;
или другой нужный тип (по размеру и по типу считываемых данных)
Код:
Type	Size in bytes
Real48	6
Single	4
Double	8
Extended	10
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 22.06.2016 в 16:49.
evg_m вне форума Ответить с цитированием
Старый 22.06.2016, 23:30   #3
doneto
 
Регистрация: 30.08.2009
Сообщений: 7
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
а ты не пробовал сделать так
Код:
Adress: dword;
Adress: double;

Спасибо за участие, но этот вариант я пробовал в 1- ю очередь. И либо я не понял как это сделать, либо этот вариант не подошол. Если есть возможность напишите пример реализации кода пожалуйста. Т. К. Код я уже написал выше - если не сложно - укажите как это правильно реализовать. Т.к. именно в этом и состоит вопрос: как это сделать? Если тип сингл, то как будет выглядеть строка вЫвода?

Была: label1.Caption := FloatToStr(Adress);// тип word
А как вывести тип single?

Ибо вместо числа с точкой из ячейки "2774,88"
Выводится число: "2405181686"

И стоит вопрос - как же вывести число в правильном формате?

Последний раз редактировалось doneto; 23.06.2016 в 00:46.
doneto вне форума Ответить с цитированием
Старый 23.06.2016, 00:50   #4
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
А как вывести тип single?
Ты пойми: функции ReadProcessMemory() пофиг на типы данных, она читает просто кусок памяти указанного размера по заданному адресу из контекста указанного процесса в твой буфер. Такшта, можно прочитать значение любого типа и размера (от 1 байта до овер9000 байт), главное - выделить для неё кусок своей памяти. А в -случае с double - это sizeof(double) = 8 байт ().

Код:
var
  buff: double;
begin
  if ReadProcessMemory(hProc, pointer(Adress+$2fc), @buff, sizeof(buff), nil)
    then { в переменной buff твоё число }
    else { анализ GetLastError()}
end;
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 23.06.2016, 10:46   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

для учебы (пока не научишься делать правильно) лучше не крохоборствовать
для КАЖДОЙ из операций чтения памяти выделить СВОЮ переменную и давать ей ПРАВИЛЬНЫЕ типы. Заодно появится возможность и проверить (отследить) переходы адресов. (Вывести ВСЕ адреса использованные в цепочке).

Код:
AdressW: dword; // сюда прочитаем адрес из указателя
Adress1, Adress2, adress3, ...: Pointer; //цепочка адресов для доступа
rest: double; // здесь будет ОКОНЧАТЕЛЬНЫЙ результат
readwrite: Cardinal;

ReadProcessMemory(hProc, pointer(AdressW), @Adress1, sizeof(Adress1), readwrite); // читаем адрес из указателя

ReadProcessMemory(hProc, pointer(Adress1+$4d0), @Adress2, sizeof(Adress1), readwrite);

ReadProcessMemory(hProc, pointer(Adress2+$40), @Adress3, sizeof(Adress3), readwrite);

ReadProcessMemory(hProc, pointer(Adress3+$5d0), @Adress4, sizeof(Adress4), readwrite);

ReadProcessMemory(hProc, pointer(Adress4+$6b4), @Adress5, sizeof(Adress5), readwrite);

ReadProcessMemory(hProc, pointer(Adress5+$2fc), @rest, sizeof(rest), readwrite);
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 23.06.2016 в 14:10.
evg_m вне форума Ответить с цитированием
Старый 24.06.2016, 00:37   #6
doneto
 
Регистрация: 30.08.2009
Сообщений: 7
По умолчанию

Спасибо. Буду пробовать. Пытался понять процедуру ReadProcessMemory winApi MSDN на сайте майкрософта, Но там только скудное описание без примеров, на ангийском языке. А все примеры в сети под целые типы.

Например в примере кот я привел ( котрорый взял из сети и идаптировал путем СаМоТыка в конце написана переменная readwrite.

А в примере min@y™ Цифровой кот
Написано nil
ReadProcessMemory(hProc, pointer(Adress+$2fc), @buff, sizeof(buff), nil)

Спасибо за участие. Если есть возможность дайте ссылку на нормальный хелп по этой процедуре. Что бы хоть примерно понимать какие операторы для каких действий нужны. Спасибо.
doneto вне форума Ответить с цитированием
Старый 24.06.2016, 01:06   #7
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
дайте ссылку на нормальный хелп по этой процедуре
это функция!


И лучшего хэлпа, чем этот, в природе нет! Остальное - высеры для блондинок и чайников или тупой гугол-транслэйт.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 24.06.2016, 23:51   #8
doneto
 
Регистрация: 30.08.2009
Сообщений: 7
Радость

Спасибо. Все получилось. Основываясь на ваших постах видоизменил свой мсходник и все прекрасно прочиталось и вывелось на моей форме в лейбл. Задача почти решена. Т.е. решена, но все же не совсем я понял , как же перевести из 4 байта в double. Цифры есть, а математическую ф-лу для перевода я не нашел( в сети и по форумам).
Но как то же каклькуляторы это делают, значит и формула есть....
Спасибо за помощь.

p.s.
К сожалению не нашел как сказать спасибо, за оказанную помощь. ( т.е. лайк или +). Та что напишу словами: спасибо за помощь.

Последний раз редактировалось doneto; 25.06.2016 в 00:20. Причина: дополнил
doneto вне форума Ответить с цитированием
Старый 25.06.2016, 03:05   #9
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
как же перевести из 4 байта в double.
ну почему 4 байта-то?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 25.06.2016, 11:49   #10
doneto
 
Регистрация: 30.08.2009
Сообщений: 7
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
ну почему 4 байта-то?
Т.к. я кода код снета брал, то мог читать только 4 байта , т.е. целое число. В проге cheatEngene выбирал тип 4 байта и видел число( выше описано), а когда менял его на тип доубл, то видел уже число с точкой - как и в тестовой программе. Сейчас я уже получаю число типа доубл, с точкой, но числа каким- то образом высчитываются...
---------
в CheatEngine при отсеивании и поиске указателя вижу вверху combo_box там можно выбрать тип числа -что мы хотим увидеть и при выборе:

4 byte: 2405181686

а типа double - видим то что и должны видеть ( то что в ячейке лежит )..

double: 2774,88
-------
Сам то код как получить тип доубл из ячеки уже есть. Но что почитать что бы понять как перевести число из 4 байта в доубл , чтобы получилось число 2774,88
Хотя это уже только для знания теории. Практическое применение уже осуществлено.
Переводы между системами счисления не подходят, т.к. при выбоборе типа float,real,я вижу другие числа, хотя тоже с точкой.
Значит 4 байта float, single,real
Отличаются от 8 байтов double
И какой формулой эти числа переводят - вот это вопрос.

Спасибо.
doneto вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос от новичка по ReadProcessMemory Drabadan Общие вопросы Delphi 1 21.03.2014 00:56
Вопрос по ReadProcessMemory Alexey_68 Общие вопросы C/C++ 5 28.03.2013 03:33
File -> double [вопрос] Tahoma Visual C++ 5 02.10.2012 19:13
Как вывести long double на экран при использование компилятора Intel w_cproc_p_11.1.065 под Visual Studio FPU128bit Visual C++ 9 13.05.2010 10:49
Вопрос по setiosflags() и double fs444 Общие вопросы C/C++ 1 25.12.2009 11:37