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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.09.2010, 06:25   #1
xRamzeSx
Форумчанин
 
Регистрация: 24.01.2010
Сообщений: 151
По умолчанию Перевод из Байтовых цифр в текст

Здравствуйте, как перевести Байтные цифры в текст, которые считываются из $007...... и $004...... адресов??? При простом считывании получается набор цифр.

Вот код программы:
Код:
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons, ComCtrls, Menus, ExtCtrls,jpeg,
  mmsystem, CheckLst;
 
type
  TfmMain = class(TForm)
    Edit1: TEdit;
    Label1: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
 
  private
    { Private declarations }
  public
    { Public declaratdeclarations }
    procedure MouseClick(button:byte; XY:integer);
  end;
 
var
  fmMain                  :TfmMain;
  wnd1,wnd2               :HWND;
  doScript,isRec          :boolean;
  ptC                     :integer;
  doBreak                 :integer;
  fileNameSave            :string;
  WindowName              :Integer;
  ProcessId               :Integer;
  ThreadId                :Integer;
  Buf                     :PChar;
  HandleWindow            :Integer;
  Write                   :Cardinal;
  WindowTitle             :String = '...';
  PokeValue               :Cardinal= $FFFFFFFF;
  NumberOfBytes           :Integer = 4;
 
implementation
 
uses Unit2;
 
{$R *.DFM}
 
function Find(s: string): hWnd;
var
  Wnd: hWnd;
  buff: array[0..127] of Char;
begin
  Find := 0;
  Wnd := GetWindow(application.Handle, gw_HWndFirst);
  while Wnd <> 0 do
  begin
    if (Wnd <> application.Handle) and
    IsWindowVisible(Wnd) and
    (GetWindow(Wnd, gw_Owner) = 0) and
    (GetWindowText(Wnd, buff, sizeof(buff)) <> 0) then
    begin
      GetWindowText(Wnd, buff, sizeof(buff));
      if pos(s, StrPas(buff)) > 0 then
      begin
        Find := Wnd;
        Break;
      end;
    end;
    Wnd := GetWindow(Wnd, gw_hWndNext);
  end;
end;
 
procedure write_value2(address:cardinal;byte:byte;value:int64);
begin
WindowName := find(windowtitle);
ThreadId := GetWindowThreadProcessId(WindowName,@ProcessId);
HandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);
GetMem(buf,1);
buf^ := Chr(value);
WriteProcessMemory(HandleWindow,ptr(Address),buf,byte,write);
FreeMem(buf);
CloseHandle(HandleWindow);
end;
 
function write_value(Addres:cardinal;ByteType:integer;
var
GetValue:int64):boolean;
var
  PID,PH:cardinal;
  rw:cardinal;
  exec:boolean;
  H:HWND;
begin
try
  h:=find(windowtitle);
  exec:=true;
  if h=0 then
    exec:=false;
  getwindowthreadprocessid(h,PID);
  PH:=openprocess(process_all_access,false,PID);
  if PH=0 then
    exec:=false;
  if writeprocessmemory(PH,ptr(Addres),@GetValue,ByteType,rw)=false then
    exec:=false;
  closehandle(PH);
  result:=exec;
  finally
end;
end;
 
function read_value2(address:cardinal;byte:byte;value:integer):string;
begin
WindowName := find(windowtitle);
ThreadId := GetWindowThreadProcessId(WindowName,@ProcessId);
HandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);
GetMem(buf,1);
buf^ := Chr(value);
ReadProcessMemory(HandleWindow,ptr(Address),buf,byte,write);
CloseHandle(HandleWindow);
result:=buf;
end;
 
function read_value(Addres:cardinal;ByteType:integer;
var
GetValue:int64):boolean;
var
  PID,PH:cardinal;
  rw:cardinal;
  exec:boolean;
  H:HWND;
begin
try
  h:=find(windowtitle);
  exec:=true;
  if h=0 then
    exec:=false;
  getwindowthreadprocessid(h,PID);
  PH:=openprocess(process_all_access,false,PID);
  if PH=0 then
    exec:=false;
  if readprocessmemory(PH,ptr(Addres),@GetValue,ByteType,rw)=false then
    exec:=false;
  closehandle(PH);
  result:=exec;
  finally
end;
end;
 
function read_goto_str(ca:cardinal;en:integer;var hend:cardinal):string;
var
s:string;
c:cardinal;
ch:int64;
begin
  c:=ca;
  s:='';
  repeat
    ch:=0;
    read_value(c,1,ch);
    ch:=ch;
    c:=c+1;
    s:=s+chr(ch);
  until ch<>en;
  result:=s;
  hend:=c-1;
end;
 
function read_str(ca:cardinal;en:integer;var hend:cardinal):string;
var
s:string;
c:cardinal;
ch:int64;
begin
  c:=ca;
  s:='';
  repeat
    ch:=0;
    read_value(c,1,ch);
    ch:=ch;
    c:=c+1;
    if ch<>en then s:=s+chr(ch);
  until ch=en;
  result:=s;
  hend:=c-1;
end;
end.
При использовании процедуры таймера:

Код:
procedure TfmMain.Timer1(Sender: TObject);
var
res:int64;
begin
res:=0;
read_value($49DE9C,4,res);
Label1.Caption:=' '+inttostr;
res:=0;
read_value($49DE57,4,res);
Label2.Caption:=' '+inttostr;
end;
Появляется вот это:
http://s003.radikal.ru/i203/1009/9b/37a3f6ce6903.jpg
xRamzeSx вне форума Ответить с цитированием
Старый 13.09.2010, 11:38   #2
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Где реализация Button1Click и MouseClick?

Что это такое:
Код:
Label1.Caption:=' '+inttostr;
Это не может работать.

Зачем вообще тут таймер?

Откуда взялась ваша картинка? Я вижу на форме только кнопку, эдит и лэйбел.

Что вообще значит:
Цитата:
Перевод из Байтовых цифр в текст
Для получения символа байта используется функция chr. Но это вы и так знаете.

Цитата:
ch:=ch;
тоже интересно

Может вместо GetValue:int64 лучше использовать PChar или PInteger, какой-нибудь?

int64 - 8 байт. А у вас ByteType (который nSize) = 4.

Короче, тут вообще лес какой-то.
read_value2 и write_value2, походу, рулят.
А read_value и write_value - тишина на кладбище ночью.

Последний раз редактировалось Sibedir; 13.09.2010 в 12:10.
Sibedir вне форума Ответить с цитированием
Старый 13.09.2010, 12:05   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Автор, тебе в 16-ричном виде нужно показать число? Функция format с параметром %x
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.09.2010, 12:08   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

или IntToHex(а то многие Format не понимают)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.09.2010, 12:13   #5
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Да не, тут, кажись, надо строку прочитать. Он в int64 пытается закинуть ее содержимое, а потом по IntToStr вывести.
Ну, я так это понял.
Sibedir вне форума Ответить с цитированием
Старый 14.09.2010, 09:03   #6
xRamzeSx
Форумчанин
 
Регистрация: 24.01.2010
Сообщений: 151
По умолчанию

Цитата:
Сообщение от Sibedir Посмотреть сообщение
Где реализация Button1Click и MouseClick?
Зачем? Есть таймер.
Те компоненты, что в исходнике не те, просто потом было изменение:
Код:
type
  TfmMain = class(TForm)
  Label1: TLabel;
  Label2: TLabel;
  Timer1: TTimer;
  procedure Timer1Timer(Sender: TObject);
Цитата:
Сообщение от Sibedir Посмотреть сообщение
Что это такое:
Код:
Label1.Caption:=' '+inttostr;
Это не может работать.
procedure TfmMain.Timer1Timer(Sender: TObject);
var
res:int64;
begin
res:=0;
read_value($49DE9C,4,res);
Label1.Caption:='Привет, ' +inttostr(res);
res:=0;
read_value($49DE57,4,res);
Label2.Caption:='Итем, бот, на которого ты кликнул ПКМ: ' +inttostr(res);

Цитата:
Сообщение от Sibedir Посмотреть сообщение
Зачем вообще тут таймер?
Считывание должно происходить не по клику на кнопке, а автоматически, т.е по таймеру с интервалом 100

Цитата:
Сообщение от Sibedir Посмотреть сообщение
Может вместо GetValue:int64 лучше использовать PChar или PInteger, какой-нибудь?
Не могли бы вы по-подробнее описать?


Цитата:
Сообщение от Sibedir Посмотреть сообщение
read_value2 и write_value2, походу, рулят.
А read_value и write_value - тишина на кладбище ночью.
Каждая из этих функций нужна для своей работы, просто код не совсем полный, я оставил только то, что нужно.

PS: С отображение текста я первый раз сталкиваюсь, и по этому не знаю какую функцию использовать.
xRamzeSx вне форума Ответить с цитированием
Старый 14.09.2010, 10:57   #7
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Остается не совсем понятным, что должна делать функция read_value. Объясните на словах.
Функции read_value2 и write_value2 работают правильно, так как вам надо, я правильно понимаю?
Sibedir вне форума Ответить с цитированием
Старый 14.09.2010, 14:40   #8
xRamzeSx
Форумчанин
 
Регистрация: 24.01.2010
Сообщений: 151
По умолчанию

Цитата:
Сообщение от Sibedir Посмотреть сообщение
Остается не совсем понятным, что должна делать функция read_value. Объясните на словах.
Эта функция считывает значение цифр.
На пример:
Код:
procedure TfmMain.Timer1Timer(Sender: TObject);
var
res:int64;
begin
res:=0;
read_value($49DE9C,4,res);
Label1.Caption:=' ' +inttostr(res);
end;
Но я хочу, чтобы она считывала значение текста. Можно ли её изменить на такой лад?
Цитата:
Сообщение от Sibedir Посмотреть сообщение
Функции read_value2 и write_value2 работают правильно, так как вам надо, я правильно понимаю?
Да, вы всё правильно понимаете.

Последний раз редактировалось xRamzeSx; 14.09.2010 в 14:46.
xRamzeSx вне форума Ответить с цитированием
Старый 14.09.2010, 19:44   #9
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

М-м-м, да. xRamzeSx, меня опять работой подзаволили. Я обязательно постараюсь помочь, только раньше завтрешнего вечера у меня ни чего не получится.

Один вопрос, длина строки известна? Если да, то это значительно все упростит.

Пока даю наводку:
PChar - это указатель на начало строки, которая заканчивается символом #0.
Sibedir вне форума Ответить с цитированием
Старый 15.09.2010, 09:36   #10
xRamzeSx
Форумчанин
 
Регистрация: 24.01.2010
Сообщений: 151
По умолчанию

Цитата:
Сообщение от Sibedir Посмотреть сообщение
М-м-м, да. xRamzeSx, меня опять работой подзаволили. Я обязательно постараюсь помочь, только раньше завтрешнего вечера у меня ни чего не получится.
Если Вас не затруднит, буду очень благодарен.

Цитата:
Сообщение от Sibedir Посмотреть сообщение
Один вопрос, длина строки известна? Если да, то это значительно все упростит.
Мне кажется, что длинна строки около 20-25 символов.
xRamzeSx вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дан файл, содержащий текст, записанный строчными русскими буквами. Получить в др.файле тот же текст, develish151 Microsoft Office Word 4 05.05.2010 13:20
Натуральное число, в записи которого п цифр, называется числом Армстронга, если сумма его цифр, возведенн OTLi4HO Общие вопросы C/C++ 6 14.01.2009 19:48
Как узнать какой текст выделен в текст поле mogul82 JavaScript, Ajax 2 02.11.2008 16:32