Форум программистов, компьютерный форум, киберфорум
Delphi: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
0 / 0 / 0
Регистрация: 24.07.2013
Сообщений: 21

Почему у меня работает а у других нет?

01.08.2013, 15:48. Показов 2905. Ответов 37
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В крациях: Я сделал русик на онлайн игру через Delphi 7 и у меня все работает и изменяет байтbI а у друга прога сделанная с помощью Delphi 7 вbIдает ошибку или вообще не русиfицирует. Можно ли сделать не программу а .dll или как нибудь через С++, C# сделать русик а не Delphi 7, я много чего перепробbIвал но так и не сработало. У меня все работает на Ура!

Вот код:
Delphi
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
unit Unit2;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
  ProcessId: integer;
  ThreadId: integer;
  HandleWindow: Integer;
  WindowName: integer;
  write: cardinal;
  buf : array[0..1023] of WideChar;
const
  WindowTitle = 'PandoraSaga';
 
  AAddress : Array[1..61] Of Int64 = ($016012F8, $016013F4, $015F35F8, $015F38C8, $015F39A8, $015F3838, $015F3564, $015F3800, $015F3D38, $015F4ABC, $015F5254, $015FA844, $015FD77C, $01647134, $015F4C24, $015F34F4, $015F4B2C, $015F4BC0, $015FF89C, $015F352C, $016470FC, $01648BE4, $0164DEBC, $0164FD8C, $01646EC8, $01647270, $016474C8, $015F5358, $015FDB1C, $098AD2FC, $015FE030, $01651508, $0164B00C, $0164B2A8, $015F4B64, $015FFC1C, $01600EB8, $01600F28, $016021C4, $0160276C, $01602C4C, $016030D4, $01603144, $016031B4, $01603224, $0160440C, $016044EC, $0160468C, $0160759C, $0164689C, $016470C4, $016473C4, $01647884, $0164792C, $0164812C, $01648244, $0164890C, $0164B214, $0164E994, $0164EEEC, $0165108C);
  AString : Array[1..61] Of String = ('Параметры', 'Профиль', 'Сохранить Логин?', 'Подключение...', 'Вход...      ', 'Вы не ввели ваш пароль.    ', 'Войти ', 'Вы не ввели Логин.  ', 'ID/Пароль не действителен. ', 'Назд', 'Назд', 'Назд', 'Назд', 'Назд', 'Подключаемся...', 'Выхд', 'Выхд', 'Выхд из игры.', 'Выхд', 'Авторы ', 'Войти', 'Войти', 'Войти', 'Войти', 'Нет перса', 'Удалить персонаж', 'Удалить персонаж', 'Создать персонажа ', 'Чел. ', 'Воин   ', 'Без наций  ', 'Астир - Тер. Кор-ва ', 'Выход ', 'Выход из акк через %d секунд.', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена');
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button2Click(Sender: TObject);
begin
MessageDlg('Возникли проблемы? --> | Обратись в тему в нашей группе --> | ВКонтакте: ', mtInformation, [mbOK],0 );
end;
 
procedure TForm1.Button1Click(Sender: TObject);
Var
  i : Integer;
begin
  WindowName := FindWindow(nil,WindowTitle);
  If WindowName = 0 then
  begin
    MessageDlg('Запустите сначало игру а потом Русифицируйте!', mtCustom,[mbOK],0);
    WindowName := FindWindow(nil,WindowTitle);
    If WindowName = 0 then Exit;
  end;
  ThreadId := GetWindowThreadProcessId(WindowName ,@ProcessId);
  HandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);
 
  For i:=1 To High(AAddress) Do
  WriteProcessMemory(HandleWindow, Ptr(AAddress[i]),
  StringToWideChar(AString[i],@buf,1024), Length(AString[i])*2+2, write);
  MessageDlg('Игра Русифицирована!', mtCustom,[mbOK],0);
end;
 
end.
Жду вашей помощи. Игра MMORPG, только не говорите что онлайн игрbI нельзя русиfицировать. Все можно. Игра русиfицируется у меня и все отлично а у других не хочет или ошибки прога вbIдает. Весь код вbIше. Если можно как нибудь сделать так чтоб у всех работала то я очень буду благодарен вам.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.08.2013, 15:48
Ответы с готовыми решениями:

пишу программу, компилирую, у меня на компьютере работает, а на других нет
Создаю пустой проект в Visual Studio c++, добавляю файл c++, пишу программу, компилирую, у меня на компьютере работает, а на других нет, в...

работает в IE 6, в других нет почему
Здравствуйте, подскажите почему не работает в других браузерах? Исследование работы таймеров. <html> <head> ...

Почему JS на codepen работает, а у меня нет?
горизонтальный тач слайдер https://codepen.io/rugor/pen/XdKKYb Вроде все правильно, но не работает. Выносил CSS и JS отдельными...

37
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
01.08.2013, 15:58
Цитата Сообщение от rainzek Посмотреть сообщение
у других ..ошибки прога вbIдает
Так прямо и говорит "я, прога, вЫдаю ошибки" ?)
0
Заблокирован
01.08.2013, 18:51
Тебе уже писали - адреса разные. Смотри от чего считаются - может вообще от балды или рандомом - тогда только scan&replace памяти в диапазоне стэка.
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
02.08.2013, 06:52
rainzek, Вот статья, http://habrahabr.ru/post/93437/
в которой упоминается:
цитата
"В свое время у меня возникла задача, требующая модификации значений в памяти другой программы постоянно во время ее работы. Одним из условий было, что программа будет работать и на других машинах, а это значит, что вариант записи в память по заранее определенным адресам не подходил бы: адреса для разных машин будут разные и нужно реализовывать именно поиск адресов в памяти."

В общем, нужно сканировать память игры на других машинах и искать адреса одно из слов, которые ты будешь заменять на русский. А далее от его адреса отталкиваться как от базового и считать все другие адреса. Информации в инете много - вечером попробую склепать код. Правда, по предыдущей ссылке речь идёт о программе на Си, но и на Delphi примеров хватает.

А ты выложи одно или несколько слов на исходном языке в игре, которые нужно искать.
0
0 / 0 / 0
Регистрация: 24.07.2013
Сообщений: 21
03.08.2013, 10:36  [ТС]
Например слова: Connecting..., Logging in, Begin
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
03.08.2013, 14:44
Вот, попробуй такой код (вставь вместо своего):
Кликните здесь для просмотра всего текста
Delphi
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
  TBuf = Array[0..65535] Of Byte;
var
  Form1: TForm1;
  ProcessID, Addr, BytesRead: DWord;
  BazeAddr : Int64;
  HandleWindow: Integer;
  ProcessHandle: THandle;
  Mbi: TMemoryBasicInformation;
  BytesWrite: cardinal;
  buf : array[0..1023] of Char;
  ReadBuf: PChar;
  FindString : String = 'Connecting...';
  AddrString : Int64 = $015F38C8;
const
  WindowTitle = 'PandoraSaga';
 
  AAddress : Array[1..61] Of Int64 = ($016012F8, $016013F4, $015F35F8, $015F38C8,
  $015F39A8, $015F3838, $015F3564, $015F3800, $015F3D38, $015F4ABC, $015F5254,
  $015FA844, $015FD77C, $01647134, $015F4C24, $015F34F4, $015F4B2C, $015F4BC0,
  $015FF89C, $015F352C, $016470FC, $01648BE4, $0164DEBC, $0164FD8C, $01646EC8,
  $01647270, $016474C8, $015F5358, $015FDB1C, $098AD2FC, $015FE030, $01651508,
  $0164B00C, $0164B2A8, $015F4B64, $015FFC1C, $01600EB8, $01600F28, $016021C4,
  $0160276C, $01602C4C, $016030D4, $01603144, $016031B4, $01603224, $0160440C,
  $016044EC, $0160468C, $0160759C, $0164689C, $016470C4, $016473C4, $01647884,
  $0164792C, $0164812C, $01648244, $0164890C, $0164B214, $0164E994, $0164EEEC,
  $0165108C);
  AString : Array[1..61] Of String = ('Параметры', 'Профиль', 'Сохранить Логин?',
  'Подключение...', 'Вход...      ', 'Вы не ввели ваш пароль.    ', 'Войти ',
  'Вы не ввели Логин.  ', 'ID/Пароль не действителен. ', 'Назд', 'Назд', 'Назд',
  'Назд', 'Назд', 'Подключаемся...', 'Выхд', 'Выхд', 'Выхд из игры.', 'Выхд',
  'Авторы ', 'Войти', 'Войти', 'Войти', 'Войти', 'Нет перса', 'Удалить персонаж',
  'Удалить персонаж', 'Создать персонажа ', 'Чел. ', 'Воин   ', 'Без наций  ',
  'Астир - Тер. Кор-ва ', 'Выход ', 'Выход из акк через %d секунд.', 'Отмена',
  'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена',
  'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена',
  'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена',
  'Отмена', 'Отмена');
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  MessageDlg('Возникли проблемы? --> | Обратись в тему в нашей группе --> | ВКонтакте: ', mtInformation, [mbOK],0 );
end;
 
procedure TForm1.Button1Click(Sender: TObject);
Var
  i,j : Integer;
  Finded : Boolean;
begin
  ProcessHandle := FindWindow(nil,WindowTitle);
  If ProcessHandle = 0 then
  begin
    MessageDlg('Запустите сначало игру а потом Русифицируйте!', mtCustom,[mbOK],0);
    ProcessHandle := FindWindow(nil,WindowTitle);
    If ProcessHandle = 0 then Exit;
  end;
  GetWindowThreadProcessId(ProcessHandle ,@ProcessID);
  ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessID);
  //------------------------------------------------------------------
  //Определение базы адресов
  StringToWideChar(FindString,@buf,1024);
  Addr := 0;
  Finded := false;
  try
    while VirtualQueryEx(ProcessHandle, Pointer(Addr), Mbi, SizeOf(Mbi)) <> 0 do
    begin
      if (Mbi.State = MEM_COMMIT) and not ((Mbi.Protect and PAGE_GUARD) = PAGE_GUARD) then
      begin
        GetMem(ReadBuf, Mbi.RegionSize);
        try
        if ReadProcessMemory(ProcessHandle, Mbi.BaseAddress, ReadBuf, Mbi.RegionSize, BytesRead) then
        begin
          for i := 0 to BytesRead - Length(FindString)*2 do
          begin
            Finded:=true;
            for j := i to i+Length(FindString)*2-1 do
            if ReadBuf[j] <> buf[j-i] then break;
            begin
              Finded := false;
              break;
            end;
            if Finded then
            begin
              BazeAddr := Int64(Cardinal(Mbi.BaseAddress) + i)-AddrString;
              break;
            end;
          end;
        end else
        finally
          FreeMem(ReadBuf);
        end;
      end;
      if Finded then break;
      Addr := Addr + Mbi.RegionSize;
    end;
  except
  end;
 
  //------------------------------------------------------------------
  //Замена ...
  Try
    if Finded then
    For i:=1 To High(AAddress) Do
    WriteProcessMemory(ProcessHandle, Ptr(AAddress[i]+BazeAddr),
    StringToWideChar(AString[i],@buf,1024), Length(AString[i])*2+2, BytesWrite);
  finally
    CloseHandle(ProcessHandle);
  end;
 
  MessageDlg('Игра Русифицирована!', mtCustom,[mbOK],0);
end;
 
end.

Сначала проверь на своём компьютере. Если не будет работать у тебя - значит не будет работать и у других. У меня нет опыта работы с памятью другого приложения, поэтому использовал код из примеров в инете. Может где-то чего-то не учёл.
Если будет работать у тебя - должно работать у других. exe-шника достаточно. Хотя гарантировать и не могу.
0
Заблокирован
03.08.2013, 14:49
Ви таки тгавите. Пропатчите на месте ресурсы , где проблема то. Если приложение даёт править свою память и не банит(MMO! (c) ТС) - пофиг на inplace патчер памяти - патч прямо на диске.
0
03.08.2013, 14:58

Не по теме:

Dr_Quake, Я, вроде не новичок в Delphi, но и для меня, уважаемый, ваше сообщение абракодабра. Проще говоря, я ничего не понял. Увы. Может из-за того, что не имею опыта в данном вопросе. А начинающий и подавно не поймёт.
Но, не буду спорить, может для тех, кто будет смотреть тему - это будет достаточно информационный пост.

0
Заблокирован
03.08.2013, 14:59
Одиночка, а при чём тут вообще Delphi? Патчить память или патчить файлы. Это делается чем угодно по любому виду.
1
03.08.2013, 15:11

Не по теме:

Dr_Quake, Может это смешно, но с патчами встречаюсь только на уровне запуска патча при установке каких-то взломанных программ. Теперь, кажется, понял что это значит.
Но сейчас решаю задачу, которую поставил ТС - заменить данные в памяти какой-то игры. Пропатчить её на диске? Может в этом и есть смысл. Только это уже другая задача. И делать это программно не зная тонкостей - запороть на другом компе. А ручками с помощью вспомогательных средств - может ТС такой вариант и подойдёт.

0
Заблокирован
03.08.2013, 15:25
Одиночка, так это вторая часть, я тут подумал - ну basе так base, а если текст в другом модуле(что вероятно 50%), или вообще из файла грузится(вторые 50%) - тогда адреса будут разные вообще без закономерности и так не выведешь, только полным поиском по всей памяти процесса, а надо ещё сначала список секций забрать и ремэпов впридачу.
1
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
03.08.2013, 15:51
Dr_Quake,

Не по теме:

Честно сказать, я в этом очень мелко плаваю. Поэтому отослал ТС в этот раздел. Надеясь, что здесь завсегдатаи более продвинуты в плане расположения программы в памяти и как и с чем её кушать. Но, поскольку никто не взялся реально помочь, а я привык доводить до конца - пришлось самому искать информацию и адаптировать.


Думаю, ТС у себя на компе просто запускал игру и потом свою прогу. И при этом всё нормально получалось. Делаю вывод, что все заменяемые части находились в памяти. Т.е. при аналогичных действиях на другом компе что меняется. Просто игра, возможно, грузится в другое адресное пространство. Исходя из этих предположений я и делал код.

Не по теме:

Если же игра грузится в несколько секций памяти. И заменяемые участки находятся в разных секциях - тогда код работать не будет. Опять же - это мои предположения из информации, полученной чтением по диагонали тем, предложенных при поиске "сканирование памяти другого приложения". Подробностей там было очень мало. Может всё обстоит совсем не так. Возможно стоит поискать "распределение памяти программе" или чего-то подобного. Так, наверное, и сделаю - нужно просвещаться, а то неудобно за невежество.

1
Заблокирован
03.08.2013, 16:04
Одиночка, проще спросить ТС -а что за игра то такая - это 90% паб MMO новой, иначе бы 100% уже давно забанили.
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
03.08.2013, 16:06
А у него там в стартовом топике:
Delphi
1
WindowTitle = 'PandoraSaga';
Это не оно?
1
Заблокирован
03.08.2013, 16:07
Навреное оно. И проверить можно кстати. Только мне пока не до этого будет ещё дня два-три.
0
03.08.2013, 16:14

Не по теме:

А я вообще в играх не варюсь. Да ещё вирус с игрой занести совсем не хочется. У меня антивирус с базами устаревшими просто для галочки стоит. Наверное, не заражаюсь только потому, что не хожу по подозрительным сайтам, да играми не увлекаюсь. Поэтому буду ждать пока ТС у себя проверит. А дальше по результатам.

1
0 / 0 / 0
Регистрация: 24.07.2013
Сообщений: 21
04.08.2013, 16:02  [ТС]
Цитата Сообщение от Одиночка Посмотреть сообщение
Вот, попробуй такой код (вставь вместо своего):
Кликните здесь для просмотра всего текста
Delphi
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
  TBuf = Array[0..65535] Of Byte;
var
  Form1: TForm1;
  ProcessID, Addr, BytesRead: DWord;
  BazeAddr : Int64;
  HandleWindow: Integer;
  ProcessHandle: THandle;
  Mbi: TMemoryBasicInformation;
  BytesWrite: cardinal;
  buf : array[0..1023] of Char;
  ReadBuf: PChar;
  FindString : String = 'Connecting...';
  AddrString : Int64 = $015F38C8;
const
  WindowTitle = 'PandoraSaga';
 
  AAddress : Array[1..61] Of Int64 = ($016012F8, $016013F4, $015F35F8, $015F38C8,
  $015F39A8, $015F3838, $015F3564, $015F3800, $015F3D38, $015F4ABC, $015F5254,
  $015FA844, $015FD77C, $01647134, $015F4C24, $015F34F4, $015F4B2C, $015F4BC0,
  $015FF89C, $015F352C, $016470FC, $01648BE4, $0164DEBC, $0164FD8C, $01646EC8,
  $01647270, $016474C8, $015F5358, $015FDB1C, $098AD2FC, $015FE030, $01651508,
  $0164B00C, $0164B2A8, $015F4B64, $015FFC1C, $01600EB8, $01600F28, $016021C4,
  $0160276C, $01602C4C, $016030D4, $01603144, $016031B4, $01603224, $0160440C,
  $016044EC, $0160468C, $0160759C, $0164689C, $016470C4, $016473C4, $01647884,
  $0164792C, $0164812C, $01648244, $0164890C, $0164B214, $0164E994, $0164EEEC,
  $0165108C);
  AString : Array[1..61] Of String = ('Параметры', 'Профиль', 'Сохранить Логин?',
  'Подключение...', 'Вход...      ', 'Вы не ввели ваш пароль.    ', 'Войти ',
  'Вы не ввели Логин.  ', 'ID/Пароль не действителен. ', 'Назд', 'Назд', 'Назд',
  'Назд', 'Назд', 'Подключаемся...', 'Выхд', 'Выхд', 'Выхд из игры.', 'Выхд',
  'Авторы ', 'Войти', 'Войти', 'Войти', 'Войти', 'Нет перса', 'Удалить персонаж',
  'Удалить персонаж', 'Создать персонажа ', 'Чел. ', 'Воин   ', 'Без наций  ',
  'Астир - Тер. Кор-ва ', 'Выход ', 'Выход из акк через %d секунд.', 'Отмена',
  'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена',
  'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена',
  'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена',
  'Отмена', 'Отмена');
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  MessageDlg('Возникли проблемы? --> | Обратись в тему в нашей группе --> | ВКонтакте: ', mtInformation, [mbOK],0 );
end;
 
procedure TForm1.Button1Click(Sender: TObject);
Var
  i,j : Integer;
  Finded : Boolean;
begin
  ProcessHandle := FindWindow(nil,WindowTitle);
  If ProcessHandle = 0 then
  begin
    MessageDlg('Запустите сначало игру а потом Русифицируйте!', mtCustom,[mbOK],0);
    ProcessHandle := FindWindow(nil,WindowTitle);
    If ProcessHandle = 0 then Exit;
  end;
  GetWindowThreadProcessId(ProcessHandle ,@ProcessID);
  ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessID);
  //------------------------------------------------------------------
  //Определение базы адресов
  StringToWideChar(FindString,@buf,1024);
  Addr := 0;
  Finded := false;
  try
    while VirtualQueryEx(ProcessHandle, Pointer(Addr), Mbi, SizeOf(Mbi)) <> 0 do
    begin
      if (Mbi.State = MEM_COMMIT) and not ((Mbi.Protect and PAGE_GUARD) = PAGE_GUARD) then
      begin
        GetMem(ReadBuf, Mbi.RegionSize);
        try
        if ReadProcessMemory(ProcessHandle, Mbi.BaseAddress, ReadBuf, Mbi.RegionSize, BytesRead) then
        begin
          for i := 0 to BytesRead - Length(FindString)*2 do
          begin
            Finded:=true;
            for j := i to i+Length(FindString)*2-1 do
            if ReadBuf[j] <> buf[j-i] then break;
            begin
              Finded := false;
              break;
            end;
            if Finded then
            begin
              BazeAddr := Int64(Cardinal(Mbi.BaseAddress) + i)-AddrString;
              break;
            end;
          end;
        end else
        finally
          FreeMem(ReadBuf);
        end;
      end;
      if Finded then break;
      Addr := Addr + Mbi.RegionSize;
    end;
  except
  end;
 
  //------------------------------------------------------------------
  //Замена ...
  Try
    if Finded then
    For i:=1 To High(AAddress) Do
    WriteProcessMemory(ProcessHandle, Ptr(AAddress[i]+BazeAddr),
    StringToWideChar(AString[i],@buf,1024), Length(AString[i])*2+2, BytesWrite);
  finally
    CloseHandle(ProcessHandle);
  end;
 
  MessageDlg('Игра Русифицирована!', mtCustom,[mbOK],0);
end;
 
end.

Сначала проверь на своём компьютере. Если не будет работать у тебя - значит не будет работать и у других. У меня нет опыта работы с памятью другого приложения, поэтому использовал код из примеров в инете. Может где-то чего-то не учёл.
Если будет работать у тебя - должно работать у других. exe-шника достаточно. Хотя гарантировать и не могу.
ПbIтался, не работает. Даже надпись ААddress подправлял. Можно как нибудь сделать русик? Даже если не через Delphi 7. Как делать поиск слов и заменить их на свое?
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
04.08.2013, 19:39
Я в предыдущем коде допустил грубую ошибку. Попробуй ещё этот:
Кликните здесь для просмотра всего текста
Delphi
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
  TBuf = Array[0..65535] Of Byte;
var
  Form1: TForm1;
  ProcessID, Addr, BytesRead: DWord;
  BazeAddr : Int64;
  HandleWindow: Integer;
  ProcessHandle: THandle;
  Mbi: TMemoryBasicInformation;
  BytesWrite: cardinal;
  buf : array[0..1023] of Char;
  ReadBuf: PChar;
  FindString : String = 'Connecting...';
  AddrString : Int64 = $015F38C8;
const
  WindowTitle = 'PandoraSaga';
 
  AAddress : Array[1..61] Of Int64 = ($016012F8, $016013F4, $015F35F8, $015F38C8,
  $015F39A8, $015F3838, $015F3564, $015F3800, $015F3D38, $015F4ABC, $015F5254,
  $015FA844, $015FD77C, $01647134, $015F4C24, $015F34F4, $015F4B2C, $015F4BC0,
  $015FF89C, $015F352C, $016470FC, $01648BE4, $0164DEBC, $0164FD8C, $01646EC8,
  $01647270, $016474C8, $015F5358, $015FDB1C, $098AD2FC, $015FE030, $01651508,
  $0164B00C, $0164B2A8, $015F4B64, $015FFC1C, $01600EB8, $01600F28, $016021C4,
  $0160276C, $01602C4C, $016030D4, $01603144, $016031B4, $01603224, $0160440C,
  $016044EC, $0160468C, $0160759C, $0164689C, $016470C4, $016473C4, $01647884,
  $0164792C, $0164812C, $01648244, $0164890C, $0164B214, $0164E994, $0164EEEC,
  $0165108C);
  AString : Array[1..61] Of String = ('Параметры', 'Профиль', 'Сохранить Логин?',
  'Подключение...', 'Вход...      ', 'Вы не ввели ваш пароль.    ', 'Войти ',
  'Вы не ввели Логин.  ', 'ID/Пароль не действителен. ', 'Назд', 'Назд', 'Назд',
  'Назд', 'Назд', 'Подключаемся...', 'Выхд', 'Выхд', 'Выхд из игры.', 'Выхд',
  'Авторы ', 'Войти', 'Войти', 'Войти', 'Войти', 'Нет перса', 'Удалить персонаж',
  'Удалить персонаж', 'Создать персонажа ', 'Чел. ', 'Воин   ', 'Без наций  ',
  'Астир - Тер. Кор-ва ', 'Выход ', 'Выход из акк через %d секунд.', 'Отмена',
  'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена',
  'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена',
  'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена',
  'Отмена', 'Отмена');
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  MessageDlg('Возникли проблемы? --> | Обратись в тему в нашей группе --> | ВКонтакте: ', mtInformation, [mbOK],0 );
end;
 
procedure TForm1.Button1Click(Sender: TObject);
Var
  i,j : Integer;
  Finded : Boolean;
begin
  ProcessHandle := FindWindow(nil,WindowTitle);
  If ProcessHandle = 0 then
  begin
    MessageDlg('Запустите сначало игру а потом Русифицируйте!', mtCustom,[mbOK],0);
    ProcessHandle := FindWindow(nil,WindowTitle);
    If ProcessHandle = 0 then Exit;
  end;
  GetWindowThreadProcessId(ProcessHandle ,@ProcessID);
  ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessID);
  //------------------------------------------------------------------
  //Определение базы адресов
  StringToWideChar(FindString,@buf,1024);
  Addr := 0;
  Finded := false;
  try
    while VirtualQueryEx(ProcessHandle, Pointer(Addr), Mbi, SizeOf(Mbi)) <> 0 do
    begin
      if (Mbi.State = MEM_COMMIT) and not ((Mbi.Protect and PAGE_GUARD) = PAGE_GUARD) then
      begin
        GetMem(ReadBuf, Mbi.RegionSize);
        try
        if ReadProcessMemory(ProcessHandle, Mbi.BaseAddress, ReadBuf, Mbi.RegionSize, BytesRead) then
        begin
          for i := 0 to BytesRead - Length(FindString)*2 do
          begin
            Finded:=true;
            for j := i to i+Length(FindString)*2-1 do
            if ReadBuf[j] <> buf[j-i] then
            begin
              Finded := false;
              break;
            end;
            if Finded then
            begin
              BazeAddr := Int64(Cardinal(Mbi.BaseAddress) + i)-AddrString;
              break;
            end;
          end;
        end else
        finally
          FreeMem(ReadBuf);
        end;
      end;
      if Finded then break;
      Addr := Addr + Mbi.RegionSize;
    end;
  except
  end;
 
  //------------------------------------------------------------------
  //Замена ...
  Try
    if Finded then
    begin
      For i:=1 To High(AAddress) Do
      WriteProcessMemory(ProcessHandle, Ptr(AAddress[i]+BazeAddr),
      StringToWideChar(AString[i],@buf,1024), Length(AString[i])*2+2, BytesWrite);
      MessageDlg('Игра Русифицирована!', mtCustom,[mbOK],0);
    end else
    MessageDlg('Не найдено ключевое слово. Игра Не Русифицирована!', mtCustom,[mbOK],0);
  finally
    CloseHandle(ProcessHandle);
  end;
end;
 
end.

Только ничего не нужно менять. Не будет работать - напишешь сюда.
1
0 / 0 / 0
Регистрация: 24.07.2013
Сообщений: 21
05.08.2013, 08:16  [ТС]
Цитата Сообщение от Одиночка Посмотреть сообщение
Я в предыдущем коде допустил грубую ошибку. Попробуй ещё этот:
Кликните здесь для просмотра всего текста
Delphi
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
  TBuf = Array[0..65535] Of Byte;
var
  Form1: TForm1;
  ProcessID, Addr, BytesRead: DWord;
  BazeAddr : Int64;
  HandleWindow: Integer;
  ProcessHandle: THandle;
  Mbi: TMemoryBasicInformation;
  BytesWrite: cardinal;
  buf : array[0..1023] of Char;
  ReadBuf: PChar;
  FindString : String = 'Connecting...';
  AddrString : Int64 = $015F38C8;
const
  WindowTitle = 'PandoraSaga';
 
  AAddress : Array[1..61] Of Int64 = ($016012F8, $016013F4, $015F35F8, $015F38C8,
  $015F39A8, $015F3838, $015F3564, $015F3800, $015F3D38, $015F4ABC, $015F5254,
  $015FA844, $015FD77C, $01647134, $015F4C24, $015F34F4, $015F4B2C, $015F4BC0,
  $015FF89C, $015F352C, $016470FC, $01648BE4, $0164DEBC, $0164FD8C, $01646EC8,
  $01647270, $016474C8, $015F5358, $015FDB1C, $098AD2FC, $015FE030, $01651508,
  $0164B00C, $0164B2A8, $015F4B64, $015FFC1C, $01600EB8, $01600F28, $016021C4,
  $0160276C, $01602C4C, $016030D4, $01603144, $016031B4, $01603224, $0160440C,
  $016044EC, $0160468C, $0160759C, $0164689C, $016470C4, $016473C4, $01647884,
  $0164792C, $0164812C, $01648244, $0164890C, $0164B214, $0164E994, $0164EEEC,
  $0165108C);
  AString : Array[1..61] Of String = ('Параметры', 'Профиль', 'Сохранить Логин?',
  'Подключение...', 'Вход...      ', 'Вы не ввели ваш пароль.    ', 'Войти ',
  'Вы не ввели Логин.  ', 'ID/Пароль не действителен. ', 'Назд', 'Назд', 'Назд',
  'Назд', 'Назд', 'Подключаемся...', 'Выхд', 'Выхд', 'Выхд из игры.', 'Выхд',
  'Авторы ', 'Войти', 'Войти', 'Войти', 'Войти', 'Нет перса', 'Удалить персонаж',
  'Удалить персонаж', 'Создать персонажа ', 'Чел. ', 'Воин   ', 'Без наций  ',
  'Астир - Тер. Кор-ва ', 'Выход ', 'Выход из акк через %d секунд.', 'Отмена',
  'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена',
  'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена',
  'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена', 'Отмена',
  'Отмена', 'Отмена');
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  MessageDlg('Возникли проблемы? --> | Обратись в тему в нашей группе --> | ВКонтакте: ', mtInformation, [mbOK],0 );
end;
 
procedure TForm1.Button1Click(Sender: TObject);
Var
  i,j : Integer;
  Finded : Boolean;
begin
  ProcessHandle := FindWindow(nil,WindowTitle);
  If ProcessHandle = 0 then
  begin
    MessageDlg('Запустите сначало игру а потом Русифицируйте!', mtCustom,[mbOK],0);
    ProcessHandle := FindWindow(nil,WindowTitle);
    If ProcessHandle = 0 then Exit;
  end;
  GetWindowThreadProcessId(ProcessHandle ,@ProcessID);
  ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessID);
  //------------------------------------------------------------------
  //Определение базы адресов
  StringToWideChar(FindString,@buf,1024);
  Addr := 0;
  Finded := false;
  try
    while VirtualQueryEx(ProcessHandle, Pointer(Addr), Mbi, SizeOf(Mbi)) <> 0 do
    begin
      if (Mbi.State = MEM_COMMIT) and not ((Mbi.Protect and PAGE_GUARD) = PAGE_GUARD) then
      begin
        GetMem(ReadBuf, Mbi.RegionSize);
        try
        if ReadProcessMemory(ProcessHandle, Mbi.BaseAddress, ReadBuf, Mbi.RegionSize, BytesRead) then
        begin
          for i := 0 to BytesRead - Length(FindString)*2 do
          begin
            Finded:=true;
            for j := i to i+Length(FindString)*2-1 do
            if ReadBuf[j] <> buf[j-i] then
            begin
              Finded := false;
              break;
            end;
            if Finded then
            begin
              BazeAddr := Int64(Cardinal(Mbi.BaseAddress) + i)-AddrString;
              break;
            end;
          end;
        end else
        finally
          FreeMem(ReadBuf);
        end;
      end;
      if Finded then break;
      Addr := Addr + Mbi.RegionSize;
    end;
  except
  end;
 
  //------------------------------------------------------------------
  //Замена ...
  Try
    if Finded then
    begin
      For i:=1 To High(AAddress) Do
      WriteProcessMemory(ProcessHandle, Ptr(AAddress[i]+BazeAddr),
      StringToWideChar(AString[i],@buf,1024), Length(AString[i])*2+2, BytesWrite);
      MessageDlg('Игра Русифицирована!', mtCustom,[mbOK],0);
    end else
    MessageDlg('Не найдено ключевое слово. Игра Не Русифицирована!', mtCustom,[mbOK],0);
  finally
    CloseHandle(ProcessHandle);
  end;
end;
 
end.

Только ничего не нужно менять. Не будет работать - напишешь сюда.
Работает но есть проблемbI.
1. В коде есть 2 ошибки
1.1: Combining signed and unsigned types - widened both operands (2 раза)
Вот место в котором он это вbIдает:
Delphi
1
2
for i := 0 to BytesRead - Length(FindString)*2 do // Тут вbIдает первую ошибку Combining signed and unsigned types - widened both operands
BazeAddr := Int64(Cardinal(Mbi.BaseAddress) + i)-AddrString; // Тут вторую.
2. У других игра вbIлетает после установки русика.
3. (Хорошая новость, наверно) Игра у других и у меня русиfицируется но, у меня русиfицируется весь текст вbIше а у других только надпись Connecting... (Стало 'Подключение...'). В крациях: у меня вся игра русиfицируется и она не вbIлетает а других игра вbIлетает и только 1 слово русиfицировалось.

Можешь помочь?
За код - спасибо.
0
angstrom
05.08.2013, 10:45
Цитата Сообщение от rainzek Посмотреть сообщение
В коде есть 2 ошибки
Это не ошибки - предупреждения.
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.08.2013, 10:45
Помогаю со студенческими работами здесь

Почему в мазиле код работает правильно а в других браузерах нет?
Есть файл удаления и файл в котором выводятся картинки .После нажатия кнопки под картинкой выполняется код в файле удаления и происходит...

Почему в одних IDE код работает, а в других нет? (Visual Studio vs DevC++)
Есть простой код, который находит максимальное значение в массиве. Но есть странность одна: 1)На Visual Studio программа работает...

кто может объяснить,почему на моем компе программа работает на других нет?код в Delphi
unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls,...

Помогите! Почему у меня не идёт программа на других компьютерах?

отправка почти у других не работает а у меня робит
IdMessage1-&gt;From-&gt;Name = &quot;rinof1&quot;; // отправитель IdMessage1-&gt;From-&gt;Address = &quot;rinof1-1@mail.ru&quot;; // адресс ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru