Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 504

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!

Не могли бы Вы мне помоч. Мне очень необходима функция, которая способна считывать любое текстовое, числовое значение из Edit'a, например даже эту строку "слово123" и отправлять его в адрес какого либо процесса. То есть по принципу программы CheatEgine или ArtMoney. Есть чатная строка, которая отображает любой текст. Я хочу чтобы при нажатии на Button, происходила точная копия символов из Edit'a в адрес процесса, в чатную строку. Имя процесса и адрес строки известен.

Если Вы мне поможите я буду Вам очень благодарен! Заранее, спасибо. Евгений.

RamzeS Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: RamzeS (статус: Посетитель)
Вопрос отправлен: 15 июля 2011, 07:02
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: min@y™

Короче, вот тебе простейший пример для Блокнота. Только для него!
Изучай, задавай вопросы, если чо. И помни, это только пример.

function TMainForm.FindNotepadEdit: HWND;
var
  hNotepad: HWND;
begin
  // поиск хэндла окна ввода Блокнота
  Result:= 0;
 
  hNotepad:= FindWindow('Notepad', nil);
 
  if hNotepad <> 0
    then Result:= FindWindowEx(hNotepad, 0, 'Edit', nil);
end;
 
procedure TMainForm.AppEventsIdle(Sender: TObject; var Done: Boolean);
begin
  PostButton.Enabled:= Memo.Text <> '';
end;
 
procedure TMainForm.PostButtonClick(Sender: TObject);
var
  hEdit: HWND;
  LineIndex, SymbolIndex: Integer;
begin
  // Постим мессадж
  hEdit:= FindNotepadEdit();
 
  if hEdit = 0
    then begin
           Application.MessageBox(PChar('Блокнот не запущен.'#13#10'Запусти его.'),
                                  PChar('Ошибка'),
                                  MB_OK + MB_ICONERROR);
           Exit;
         end;
 
  if MsgRadioGroup.ItemIndex = 0
    // постим с помощью WM_CHAR
    then for LineIndex:= 0 to Memo.Lines.Count - 1 do
           begin
             for SymbolIndex:= 1 to Length(Memo.Lines[LineIndex]) do // построчно
               SendMessage(hEdit, WM_CHAR, Integer(Memo.Lines[LineIndex][SymbolIndex]), 0); // посимвольно
             SendMessage(hEdit, WM_CHAR, 13, 0); // добавляем символ переноса после каждой строки
           end
 
    // постим с помощью WM_SETTEXT
    else SendMessage(hEdit, WM_SETTEXT, 0, Integer(PChar(Memo.Text)));
end;

Готовый ехе-шник прицепляю к ответу.
К ответу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки ответа)

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 15 июля 2011, 13:14


Мини-форум вопроса

Всего сообщений: 48; последнее сообщение — 16 июля 2011, 21:20; участников в обсуждении: 4.

Страницы: [« Предыдущая] [1] [2] [3] [Следующая »]

Gooddy

Gooddy (статус: 3-ий класс), 15 июля 2011, 11:01 [#21]:

Ладно, даже если можно пренебречь вылетами и перезагрузками, всё равно так напрямую работать с памятью лучше не в delphi, а в c
Чисти код! Чисти код! Чисти код!
min@y™

min@y™ (статус: Доктор наук), 15 июля 2011, 11:01 [#22]:

И, всё-таки, хотелось бы знать, для чего конкретно тебе нужен такой брейнфакинг?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 15 июля 2011, 11:04 [#23]:

Цитата (Gooddy):

всё равно так напрямую работать с памятью лучше не в delphi, а в c

Ты опять за своё? Нафига пишешь то, в чём не шаришь?

Цитата (RamzeS):

Если это чатная строка, какая разница какой там объём, 50 символов там точно можно уместить.

Что такое "чатная" строка?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Gooddy

Gooddy (статус: 3-ий класс), 15 июля 2011, 11:04 [#24]:

Это простой трейнер - урезанный артмани.

Есть кстати "Trainer Creators", так что такого эффекта можно будет добиться и без написания кода. А заодно и надёжно.
Чисти код! Чисти код! Чисти код!
Gooddy

Gooddy (статус: 3-ий класс), 15 июля 2011, 11:08 [#25]:

Вот например прога Cheat32.

Цитата:

Быстрый поисковый механизм. Работает с целыми числами, числами с плавающей запятой и др. Имеет возможность создания автономных трейнеров. Является удобной в использовании.


Godgame

Цитата:

Программа GodGame предназначена для поиска и редактирования параметров в компьютерных играх, для получения бесконечных денег, жизней, патронов и т.п Так-же в программе присутствует удобный Wizzard для создания трейнеров, зделанные в программе трейнеры поддерживают скины, указатели, заморозку и горячии клавиши...


А также:

Magic Trainer Creator

Trainer Creation Kit

Trainer Maker Kit
Чисти код! Чисти код! Чисти код!
RamzeS

RamzeS (статус: Посетитель), 15 июля 2011, 11:09 [#26]:

Вот когда вы пишите сообщение, чтобы его сейчас отправить в окошке, это и есть строка, только узенькая. Я хочу, чтобы в программе можно было набрать любой текст даже тот, что я сейчас паишу, и нажав на кнопку, к примеру, он появляется в этом же окне браузера, там, где я сейчас пишу это сообщение.
Gooddy

Gooddy (статус: 3-ий класс), 15 июля 2011, 11:13 [#27]:

Чисти код! Чисти код! Чисти код!
bugmenot

bugmenot (статус: 3-ий класс), 15 июля 2011, 11:15 [#28]:

Цитата (Gooddy):

Wizzard ... зделанные ... горячии

Это подтверждает мой тезис, что под виндами такое не представляет никакой сложности.

Ключевое: VirtualQuery, ReadProcessMemory
виконання програми розпочинається з того самого мiсця, де призупинилося.

min@y™

min@y™ (статус: Доктор наук), 15 июля 2011, 11:16 [#29]:

Цитата (RamzeS):

Вот когда вы пишите сообщение, чтобы его сейчас отправить в окошке, это и есть строка, только узенькая. Я хочу, чтобы в программе можно было набрать любой текст даже тот, что я сейчас паишу, и нажав на кнопку, к примеру, он появляется в этом же окне браузера, там, где я сейчас пишу это сообщение.

Если автор не предусмотрел разбиение сообщения в чате на абзацы, значит так было надо. Или там ограничение на количество символов?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
RamzeS

RamzeS (статус: Посетитель), 15 июля 2011, 11:17 [#30]:

Максимальное кол-во символов 100, абзацов там нет, только строка.
Всё что у меня получается сделать, это только заменить байтовые значения в процессе.
procedure TfmMain.Button5Click(Sender: TObject);
var
res:int64;
begin
res:={Нужный номер, необходимый для замены};
if ComboBox1.Text=''
then
write_value($49DE8C,4,res);
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;
Последняя функция делает замену строки только байтами. Я хочу сделать то же самое только не с числами, а с текстом. Но у меня получается только 1 символ отправить!
Gooddy

Gooddy (статус: 3-ий класс), 15 июля 2011, 11:29 [#31]:

В целом, нужно поменять int64 на byte, а затем записывать строку посимвольно, ну и в конце ляпнуть #0.
Чисти код! Чисти код! Чисти код!
Gooddy

Gooddy (статус: 3-ий класс), 15 июля 2011, 11:30 [#32]:

Хотя смотря как в процессе строка хранится, может там юникод.
Чисти код! Чисти код! Чисти код!
Gooddy

Gooddy (статус: 3-ий класс), 15 июля 2011, 11:30 [#33]:

А может и не нуль-терминированная строка.
Чисти код! Чисти код! Чисти код!
min@y™

min@y™ (статус: Доктор наук), 15 июля 2011, 11:31 [#34]:

Я ж тебе сказал, выкинь этот код нахрен, он не для этого предназначен, и ты не понимаешь, как он работает. Он предназначен для замены значений только фиксированной длины (в данном случае - 4-байтного целого числа). Строки - это фрагменты динамической памяти переменной длины. И если ты заменишь "привет" на "мама мыла раму", то затрёшь лишних 8 байт, в которых до этого могли находиться важные данные. Это может привести к непредсказуемым результатам, как правило, к краху приложения.

Для выполнения твоей задачи подходит мой код. Однако есть и более быстрый способ - сообщение WM_SETTEXT, если, конечно, окно ввода имеет хэндл, а не отрисовывается автором программы.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Gooddy

Gooddy (статус: 3-ий класс), 15 июля 2011, 11:33 [#35]:

min@y™: есть 0,1% вероятность того, что в этом чате строка всё таки фиксированной длины. Т.к. по словам автора они имеет фиксированный адрес (хотя может это адрес указателя).
Чисти код! Чисти код! Чисти код!
min@y™

min@y™ (статус: Доктор наук), 15 июля 2011, 11:35 [#36]:

Цитата (Gooddy):

В целом, нужно поменять int64 на byte, а затем записывать строку посимвольно, ну и в конце ляпнуть #0.

Это если длина новой строки меньше или равна длине старой.
А аффтару требуется просто набирать сообщения в строке отправки чата стороннего приложения.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Gooddy

Gooddy (статус: 3-ий класс), 15 июля 2011, 11:36 [#37]:

Цитата:

А аффтару требуется просто набирать сообщения в строке отправки чата стороннего приложения.

Тогда единственный нормальный вариант - посылка сообщения в едит.
Чисти код! Чисти код! Чисти код!
RamzeS

RamzeS (статус: Посетитель), 15 июля 2011, 11:36 [#38]:

min@y, не могли бы вы написать полностью код, пожалуйста. Я не понимаю, как воспользоваться тем, что Вы написали. В нем нужно указать адрес, и эдит.
Gooddy

Gooddy (статус: 3-ий класс), 15 июля 2011, 11:37 [#39]:

1. Получаешь хендл окна.
2. Получаешь хендл едита.
3. Посылаешь сообщение об установке текста.
4. ????
5. ПРОФИТ!
Чисти код! Чисти код! Чисти код!
min@y™

min@y™ (статус: Доктор наук), 15 июля 2011, 11:39 [#40]:

Цитата (RamzeS):

не могли бы вы написать полностью код, пожалуйста. Я не понимаю, как воспользоваться тем, что Вы написали. В нем нужно указать адрес, и эдит.

Пример для notepad.exe подойдёт?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Страницы: [« Предыдущая] [1] [2] [3] [Следующая »]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 25 апреля 2026, 21:45
Выполнено за 0.04 сек.