Доброй ночи... Я научился отправлять пакеты в клиент наконец-то) Теперь хочу узнать как можно записать свои данные... например мне надо в каком-то поле написать текст как мне посоветовали его(текст) надо перевести в массив байт(как это сделать?)... Собственно вот цепочка офсетов по которым надо записать нужный текст:
Не стоит так делать. Нужно действовать так, инжектить строчку не по этому оффсету а по адресу в дополнительно выделенной памяти. А затем в ...+ 13FC поместить адрес заинжекченой строки. Тогда ...+ 13FC + 0 будет наша строка. Почему так? Потому что указатель на строку, находящийся в 13FC, не проинициализирован, когда поле ввода пустое, и будет указывать на ту же область памяти, на которую ссылаются другие пустые поля ввода по умолчанию. Если напрямую туда писать, то мы будем записывать строку ВО ВСЕ поля ввода, которые пусты. Потому и нужно указать конкретно, для определённого поля ввода адрес его строки.
И ещё, лучше не использовать оффсет +74, так как это активное окно, а активное окно может измениться, если вдруг пользователь начал тыкать по окнам в игре. Потому лучше искать адрес конкретного нужного окна по его имени. Загляни сюда
________________
╔═╗
║ ˑ ˑ ╬ ╬
╚═╝
Последний раз редактировалось dwa83; 15.07.2012 в 08:09.
Открываем процесс игры для доступа к его памяти
Выделяем там дополнительно память для хранения нашей строки
В нашей проге обьявляем символьный массив
Копируем этот символьный массив в выделенную в процессе память
Храним у себя указатель на эту строчку, чтобы потом использовать
Можно закрыть процесс, а можно оставить открытым на всё время работы
Цитата:
Сообщение от vladoscom93
например как будет выглядеть код для этой структуры
Код:
меня интересует как по этим структурам перемещаться...
считываем по оффсетам win = GA+18+08+8C - указатель на начало массива окон верхнего уровня(на первый элемент)
в первом элементе по оффсету winstruct = win+8 считываем адрес структуры этого окна
в структуре окна по оффсету winstruct + 4C +0 считываем строку с именем окна
Сравниваем с именем нужного нам окна, например Win_Elf (окно джина)
Если это наше окно, и имя сходится то запоминаем адрес его структуры winstruct
Если это не то окно, то берём следующее окно из массива по оффсету win = win+0
и снова
winstruct = win+8 считываем адрес структуры этого окна
в структуре окна по оффсету winstruct + 4C +0 считываем строку с именем окна
и так в цыкле пока не найдём нужное окно или пока не кончатся окна(win+0 будет указывать на null а не на следующее окно)
Если ничего не нашли, повторяем то же самое с массивом окон нижнего уровня.
После того как мы нашли нужное окно и запомнили адрес его структуры, мы берём в его структуре по оффсету +1C8 массив контролов(кнопки, чекбоксы, поля ввода, лейблы - все в одном массиве), то есть адрес его первого контрола
Control = WinStruct+1C8
Далее можно по оффсету Control +4 - взять указатель на следующий контрол, и так несколько раз в цыкле, пока не доберёмся до нужного(они всегда в одном и том же порядке в отличае от массива окон, потому достаточно знать его положение в массиве а не проверять по имени).
А затем когда мы нужный контрол нашли, считываем адрес его структуры
ControlStruct = Control + 8
После чего например можно в структуре этого контрола считать текст его команды(или в твоём случае адрес его Caption или EditText и подменить на адрес нашей строчки) и заинжектить специальную функцию, которая эту команду выполнит в клиенте, например нажмёт на кнопочку.
________________
╔═╗
║ ˑ ˑ ╬ ╬
╚═╝
Последний раз редактировалось dwa83; 16.07.2012 в 00:12.
После чего например можно в структуре этого контрола считать текст его команды(или в твоём случае адрес его Caption или EditText и подменить на адрес нашей строчки) и заинжектить специальную функцию, которая эту команду выполнит в клиенте, например нажмёт на кнопочку.
По поводу нажатия на кнопку. Можете пожалуйста подсказать, как это осуществить?
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - Совершенный автологин для Perfect World [RUOFF, PWI, Фришек 1.4.4 - 1.4.5]
--------------------------------------------
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - Патч на Горны, Красный (да и любой) чат, Анфриз, Бесконечный зум, Моментальный разгон на полете для RUOFF, PWI и прочих 1.4.6 и фришек 1.4.4, 1.4.5.
--------------------------------------------
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - патчер для серверов 1.4.5 и 1.4.4 работающий с включенной игрой.
--------------------------------------------
А давайте сначала сделаем все что выше, а потом, кто сделает, в виде бонуса получит волшебную функцию.
В таком случаем не могли бы вы мне помочь?
Код:
WriteProcessMemory(hProcess,pString,(void*)login,1 8,NULL);
WriteProcessMemory(hProcess, (void*)buff, pString,4,NULL);
По идее в результате выполнения в поле логина должна оказаться строка, но этого не происходит. Тем не менее если вручную через СЕ записываю по нужному адресу pString то строка отображается.
Чтобы поместить строку в память нужно:
1) Выделить память с помощью функции VirtualAllocEx. Функция возвращает адрес выделенной области.
2) Преобразовать каждый символ строки в число = 1 байту, если это ASCII кодировка или = 2 байтам, если это UNICODE кодировка. Составить из этих байтов массив типа byte, где каждый член массива = 1 байту.
3) Записать этот массив в память с помощью WriteProcessMemory по адресу полученному с помощью VirtualAllocEx.
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - Совершенный автологин для Perfect World [RUOFF, PWI, Фришек 1.4.4 - 1.4.5]
--------------------------------------------
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - Патч на Горны, Красный (да и любой) чат, Анфриз, Бесконечный зум, Моментальный разгон на полете для RUOFF, PWI и прочих 1.4.6 и фришек 1.4.4, 1.4.5.
--------------------------------------------
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - патчер для серверов 1.4.5 и 1.4.4 работающий с включенной игрой.
--------------------------------------------
Чтобы поместить строку в память нужно:
1) Выделить память с помощью функции VirtualAllocEx. Функция возвращает адрес выделенной области.
2) Преобразовать каждый символ строки в число = 1 байту, если это ASCII кодировка или = 2 байтам, если это UNICODE кодировка. Составить из этих байтов массив типа byte, где каждый член массива = 1 байту.
3) Записать этот массив в память с помощью WriteProcessMemory по адресу полученному с помощью VirtualAllocEx.
берём адрес нашей строчки(указатель)
DWORD* pString;
//инжектим строку и помещаем сюда наш адрес, например
AnsiString login="login";
// переписываем в массив в виде юникода
char mass[30]={0};
for (int i=0; i<login.Length(); i++)
mass[i*2]=login[i+1];
// теперь инжектим(процесс уже открыт)
WriteProcessMemory(hProcess,pString,mass,30,NULL); // вместе с лишними нулями
//теперь считаем нужный оффсет в структуре нужного контрола
DWORD addr=GA;
ReadProcessMemory(hProcess, (void*)addr, &addr,4,0);
...
...
тут поиск нужного окна и нахождение адреса структуры winstruct нужного окна
...
// далее найдём нужный контрол по его порядковому номеру в массиве
// Read_32() - немного преобразованная ReadProcessMemory
addr = Read_32(winstruct+0x1C8);
for (int i=0; i<nomctrl; i++) // в цикле добираемся до нужного контрола
addr = Read_32(addr+0x04);
addr = Read_32(addr+0x08);// считываем адрес его структуры
ReadProcessMemory(hProcess, (void*)(addr+0x13FC), (DWORD)pString,4,0); // подменяем указатель на свой
Всё, строка появилась в поле ввода
________________
╔═╗
║ ˑ ˑ ╬ ╬
╚═╝
Последний раз редактировалось dwa83; 16.07.2012 в 17:37.
Нужно сделать функцию которая бы принимала текстовое значение и кодировку, а возвращала адрес записанного в память массива байт в соответствующей кодировке. Код покажешь?
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - Совершенный автологин для Perfect World [RUOFF, PWI, Фришек 1.4.4 - 1.4.5]
--------------------------------------------
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - Патч на Горны, Красный (да и любой) чат, Анфриз, Бесконечный зум, Моментальный разгон на полете для RUOFF, PWI и прочих 1.4.6 и фришек 1.4.4, 1.4.5.
--------------------------------------------
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - патчер для серверов 1.4.5 и 1.4.4 работающий с включенной игрой.
--------------------------------------------
Нужно сделать функцию которая бы принимала текстовое значение и кодировку, а возвращала адрес записанного в память массива байт в соответствующей кодировке. Код покажешь?
да, по указателю пишем указатель, а не так как раньше ты показывал, уже в данные строки писал указатель
Если не получится, попробуй не pString а (void*)(&pString )