 |
Функция определения названия предмета - Разработка ПО для Perfect World - Бюро разработчиков Zhyk.Ru: создание ботов, снифферов и прочих программ для Perfect World |
20.01.2012, 23:04
|
#1
|
|
|
|
Пехотинец
|
 Регистрация: 17.05.2010
 Сообщений: 53
 Популярность: 204
 Сказал(а) спасибо: 11
Поблагодарили 15 раз(а) в 6 сообщениях
|
Функция определения названия предмета
Думаю кому нибудь пригодится
jmpptr = ba+1c+34+CAC+С+[(0-31(40))*4]
itemtype = ba+1c+34+CAC+С+[(0-31(40))*4]+4
Возвращает название в string
сама функция
Код:
function ItemName(hprocess,jumpptr:dword;itemType:integer):string;
var
buf32: array [0 .. 32] of WideChar;
bytescount,ipbuf:dword;
begin
case itemType of
//34 книги одевать
26: begin //яйца
ReadProcessMemory(hProcess, ptr(jumpptr+item1_26_ofs), @ipbuf, sizeof(ipbuf), BytesCount);
ReadProcessMemory(hProcess, ptr(ipbuf+item2_26_ofs), @buf32, sizeof(buf32), BytesCount);
Result:=buf32;
end;
0, 3: begin //0-шмот 3-бижа
ReadProcessMemory(hProcess, ptr(jumpptr+item1_0_3_ofs), @ipbuf, sizeof(ipbuf), BytesCount);
ReadProcessMemory(hProcess, ptr(ipbuf+item2_0_3_ofs), @buf32, sizeof(buf32), BytesCount);
Result:=buf32;
end;
2: begin //strella
ReadProcessMemory(hProcess, ptr(jumpptr+item1_2_ofs), @ipbuf, sizeof(ipbuf), BytesCount);
ReadProcessMemory(hProcess, ptr(ipbuf+item2_2_ofs), @buf32, sizeof(buf32), BytesCount);
Result:=buf32;
end;
4: begin //4-соски
ReadProcessMemory(hProcess, ptr(jumpptr+item1_4_ofs), @ipbuf, sizeof(ipbuf), BytesCount);
ReadProcessMemory(hProcess, ptr(ipbuf+item2_4_ofs), @buf32, sizeof(buf32), BytesCount);
Result:=buf32;
end;
34: begin //34-книги
ReadProcessMemory(hProcess, ptr(jumpptr+item1_34_ofs), @ipbuf, sizeof(ipbuf), BytesCount);
ReadProcessMemory(hProcess, ptr(ipbuf+item2_34_ofs), @buf32, sizeof(buf32), BytesCount);
Result:=buf32;
end;
5, 10, 13, 16, 19, 20, 27, 31, 32, 38, 40, 46: //31-apteka 32-shar drakona 27-korm 40-краситель 5-батарейки 19-алый,сундук(ПКМ) 20-призы, почти весь шоп,хх,сведения, кровь, осколок(миража), вино, гипы, горн,бао,феня, молоток
begin
ReadProcessMemory(hProcess, ptr(jumpptr+item1_5_46_ofs), @ipbuf, sizeof(ipbuf), BytesCount);
ReadProcessMemory(hProcess, ptr(ipbuf+item2_5_46_ofs), @buf32, sizeof(buf32), BytesCount);
Result:=buf32;
end;
6: begin //стиль
ReadProcessMemory(hProcess, ptr(jumpptr+item1_6_ofs), @ipbuf, sizeof(ipbuf), BytesCount);
ReadProcessMemory(hProcess, ptr(ipbuf+item2_6_ofs), @buf32, sizeof(buf32), BytesCount);
Result:=buf32;
end;
7: begin
ReadProcessMemory(hProcess, ptr(jumpptr+item1_7_ofs), @ipbuf, sizeof(ipbuf), BytesCount);
ReadProcessMemory(hProcess, ptr(ipbuf+item2_7_ofs), @buf32, sizeof(buf32), BytesCount);
Result:=buf32;
end;
8, 9, 22, 23: begin //9- хлеб, банки 8-дк, ресы, трава, формы, рупор, главы
ReadProcessMemory(hProcess, ptr(jumpptr+item1_8_23_ofs), @ipbuf, sizeof(ipbuf), BytesCount);
ReadProcessMemory(hProcess, ptr(ipbuf+item2_8_23_ofs), @buf32, sizeof(buf32), BytesCount);
Result:=buf32;
end;
15: begin //оружее
ReadProcessMemory(hProcess, ptr(jumpptr+item1_15_ofs), @ipbuf, sizeof(ipbuf), BytesCount);
ReadProcessMemory(hProcess, ptr(ipbuf+item2_15_ofs), @buf32, sizeof(buf32), BytesCount);
Result:=buf32;
end;
17,11: begin //17-камни 11-скилы
ReadProcessMemory(hProcess, ptr(jumpptr+item1_17_ofs), @ipbuf, sizeof(ipbuf), BytesCount);
ReadProcessMemory(hProcess, ptr(ipbuf+item2_17_ofs), @buf32, sizeof(buf32), BytesCount);
Result:=buf32;
end;
18: begin
ReadProcessMemory(hProcess, ptr(jumpptr+item1_18_ofs), @ipbuf, sizeof(ipbuf), BytesCount);
ReadProcessMemory(hProcess, ptr(ipbuf+item2_18_ofs), @buf32, sizeof(buf32), BytesCount);
Result:=buf32;
end;
36: begin
ReadProcessMemory(hProcess, ptr(jumpptr+item1_36_37_ofs), @ipbuf, sizeof(ipbuf), BytesCount);
ReadProcessMemory(hProcess, ptr(ipbuf+item2_36_37_ofs), @buf32, sizeof(buf32), BytesCount);
Result:=buf32;
end;
37: begin //хиры
ReadProcessMemory(hProcess, ptr(jumpptr+item1_37_ofs), @ipbuf, sizeof(ipbuf), BytesCount);
ReadProcessMemory(hProcess, ptr(ipbuf+item2_37_ofs), @buf32, sizeof(buf32), BytesCount);
Result:=buf32;
end;
43: begin //гпб
ReadProcessMemory(hProcess, ptr(jumpptr+item1_43_ofs), @ipbuf, sizeof(ipbuf), BytesCount);
ReadProcessMemory(hProcess, ptr(ipbuf+item2_43_ofs), @buf32, sizeof(buf32), BytesCount);
Result:=buf32;
end;
41: begin //джины
ReadProcessMemory(hProcess, ptr(jumpptr+item1_41_ofs), @ipbuf, sizeof(ipbuf), BytesCount);
ReadProcessMemory(hProcess, ptr(ipbuf+item2_41_ofs), @buf32, sizeof(buf32), BytesCount);
Result:=buf32;
end;
else
result:='N\A';
end;
end;
офсеты для функции
Код:
item1_26_ofs=$a0
item2_26_ofs=$4
item1_41_ofs=$10c
item2_41_ofs=$4
item1_0_3_ofs=$E0
item2_0_3_ofs=$C
item1_2_ofs=$C8
item2_2_ofs=$4
item1_4_ofs=$B4
item2_4_ofs=$8
item1_34_ofs=$B4
item2_34_ofs=$4
item1_5_46_ofs=$4C
item2_5_46_ofs=$4
item1_6_ofs=$D0
item2_6_ofs=$C
item1_7_ofs=$D0
item2_7_ofs=$4
item1_8_23_ofs=$54
item2_8_23_ofs=$C
item1_15_ofs=$E8
item2_15_ofs=$C
item1_17_ofs= $4C
item2_17_ofs=$8
item1_18_ofs=$C4
item2_18_ofs=$4
item1_36_37_ofs=$B8
item2_36_37_ofs=$4
item1_43_ofs=$54
item2_43_ofs=$4
item1_37_ofs=$BC
item2_37_ofs=$4
Если помог, не откажусь от спасибки.
________________
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
|
|
|
3 пользователя(ей) сказали cпасибо:
|
|
27.03.2012, 17:45
|
#2
|
|
|
|
Пехотинец
|
 Регистрация: 16.09.2010
 Сообщений: 94
 Популярность: 73
 Сказал(а) спасибо: 5
Поблагодарили 21 раз(а) в 5 сообщениях
|
Re: Функция определения названия предмета
Кто может помочь найти офсеты для итемов id 39 и 50 ?
Спасибо заранее
|
|
|
18.04.2012, 15:26
|
#3
|
|
|
|
Пехотинец
|
 Регистрация: 19.01.2011
 Сообщений: 57
 Популярность: 280
 Сказал(а) спасибо: 3
Поблагодарили 35 раз(а) в 9 сообщениях
|
Re: Функция определения названия предмета
и как? работает твоя функция правильно? 32 символа как-то много, он не только название выводит, но и часть описания, нужно или по одному символу считывать пока не встретишь "\r" или считать строку и вырезать всё до \r
|
|
|
11.05.2012, 07:30
|
#4
|
|
|
|
Пехотинец
|
 Регистрация: 17.05.2010
 Сообщений: 53
 Популярность: 204
 Сказал(а) спасибо: 11
Поблагодарили 15 раз(а) в 6 сообщениях
|
Re: Функция определения названия предмета
________________
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
|
|
|
14.05.2012, 01:12
|
#5
|
|
|
|
Пехотинец
|
 Регистрация: 01.08.2011
 Сообщений: 70
 Популярность: 24
 Сказал(а) спасибо: 45
Поблагодарили 7 раз(а) в 7 сообщениях
|
Re: Функция определения названия предмета
А как быть со специальными символами вроде звёзночки перед названием пухи/шмота/бижи? Данную функцию не пробовал, но делаю подобным образом и вместо звёздочки выводит знак вопроса, например "?Шлем Демон Страж".
|
|
|
14.05.2012, 03:25
|
#6
|
|
|
|
Сержант
|
 Регистрация: 11.12.2010
 Сообщений: 110
 Популярность: 541
 Сказал(а) спасибо: 5
Поблагодарили 66 раз(а) в 39 сообщениях
|
Re: Функция определения названия предмета
ktulx, попробуй поставить шрифт, взятый из папки с игрой. В нём есть звёздочки.
Это если выводишь в какой-нибудь Label или Edit. А если в файл, то тут, наверное, ничего не поделаешь.
________________
Принимаю реквесты на статьи, программы. Всё будет запилено в лучшем виде :3
|
|
|
14.05.2012, 03:32
|
#7
|
|
|
|
Пехотинец
|
 Регистрация: 01.08.2011
 Сообщений: 70
 Популярность: 24
 Сказал(а) спасибо: 45
Поблагодарили 7 раз(а) в 7 сообщениях
|
Re: Функция определения названия предмета
BritishColonist, вывожу в листбокс. Попробую со шрифтом похимичить. До этого не доводилось )
|
|
|
14.05.2012, 13:34
|
#8
|
|
|
|
Разведчик
|
 Регистрация: 17.09.2009
 Сообщений: 46
 Популярность: 1187
 Сказал(а) спасибо: 8
Поблагодарили 50 раз(а) в 13 сообщениях
|
Re: Функция определения названия предмета
Эммм.... Вообще-то названия предметов (включая звёздочки и пр.) хранятся в уникоде, поэтому:
а) логично хранить их в WideString
б) использовать версию дельфей, понимающую уникод
в) в Windows XP вас спасёт только шрифт из комплекта игры, в 7-ке даже Verdana нормально показывает звёздочки.
|
|
|
14.05.2012, 18:38
|
#9
|
|
|
|
Пехотинец
|
 Регистрация: 01.08.2011
 Сообщений: 70
 Популярность: 24
 Сказал(а) спасибо: 45
Поблагодарили 7 раз(а) в 7 сообщениях
|
Re: Функция определения названия предмета
vogel, Винда седьмая, с русскими буквами проблем нет, это разве не юникод?
Вообще у меня что-то странное происходит. Висела на кнопке вот такая штука
тык
Код:
var
A,B,nob:DWORD;
count,x:Integer;
item_name:array [0 .. 32] of WCHAR;
begin
ReadProcessMemory (hProcess, Pointer($A57ACC), @A, sizeof(A), NoB);
ReadProcessMemory (hProcess, Pointer(A+$34), @A, sizeof(A), NoB);
ReadProcessMemory (hProcess, Pointer(A+$D18), @A, sizeof(A), NoB);
ReadProcessMemory (hProcess, Pointer(A+$10), @A, sizeof(A), NoB);
count:=A;
for x:= 0 to count-1 do begin
ReadProcessMemory (hProcess, Pointer($A57ACC), @A, sizeof(A), NoB);
ReadProcessMemory (hProcess, Pointer(A+$34), @A, sizeof(A), NoB);
ReadProcessMemory (hProcess, Pointer(A+$D18), @A, sizeof(A), NoB);
ReadProcessMemory (hProcess, Pointer(A+$C), @A, sizeof(A), NoB);
ReadProcessMemory (hProcess, Pointer(A+(x*4)), @B, sizeof(A), NoB);
ReadProcessMemory (hProcess, Pointer(B+$58), @A, sizeof(A), NoB);
if B <> 0 then begin
ReadProcessMemory (hProcess, Pointer(B+$4), @A, sizeof(A), NoB);
case A of
0,3: begin
ReadProcessMemory (hProcess, Pointer(B+$E0), @A, sizeof(A), NoB);
ReadProcessMemory (hProcess, Pointer(A+$C), @item_name, sizeof(item_name), NoB);
end;
.......
.......
cbb1.items.add(item_name);
end;
end;
прекрасно выводит в комбобокс содержимое инвентаря, за исключением всё тех же звёздочек. Но я решил наконец-то вынести это в отдельную функцию по аналогии с описанной в первом посте:
тык
Код:
function GetInventItems(hprocess:dword;cell_num:integer):string;
var
buf, nob:DWORD;
ibuf:array [0 .. 32] of WCHAR;
begin
ReadProcessMemory (hProcess, Pointer(GA), @buf, sizeof(buf), NoB);
ReadProcessMemory (hProcess, Pointer(buf+$34), @buf, sizeof(buf), NoB);
ReadProcessMemory (hProcess, Pointer(buf+$D18), @buf, sizeof(buf), NoB);
ReadProcessMemory (hProcess, Pointer(buf+$C), @buf, sizeof(buf), NoB);
ReadProcessMemory (hProcess, Pointer(buf+(cell_num*4)), @buf, sizeof(buf), NoB);
if buf <> 0 then begin
ReadProcessMemory (hProcess, Pointer(buf+$4), @buf, sizeof(buf), NoB);
case buf of
0,3: begin
ReadProcessMemory (hProcess, Pointer(buf+$E0), @buf, sizeof(buf), NoB);
ReadProcessMemory (hProcess, Pointer(buf+$C), @ibuf, sizeof(ibuf), NoB);
Result:=ibuf;
end;
.....
.....
end;
ShowMessage(ibuf);
end;
end;
Вызываю
f := GetInventItems(hProcess, 7); //8-я ячейка инвентаря
ShowMessage(f);
Результат - (????'????
Последний раз редактировалось ktulx; 14.05.2012 в 19:14.
|
|
|
15.10.2012, 11:42
|
#10
|
|
|
|
Пехотинец
|
 Регистрация: 17.05.2010
 Сообщений: 53
 Популярность: 204
 Сказал(а) спасибо: 11
Поблагодарили 15 раз(а) в 6 сообщениях
|
Re: Функция определения названия предмета
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
vogel, Винда седьмая, с русскими буквами проблем нет, это разве не юникод?
Вообще у меня что-то странное происходит. Висела на кнопке вот такая штука
тык
Код:
var
A,B,nob:DWORD;
count,x:Integer;
item_name:array [0 .. 32] of WCHAR;
begin
ReadProcessMemory (hProcess, Pointer($A57ACC), @A, sizeof(A), NoB);
ReadProcessMemory (hProcess, Pointer(A+$34), @A, sizeof(A), NoB);
ReadProcessMemory (hProcess, Pointer(A+$D18), @A, sizeof(A), NoB);
ReadProcessMemory (hProcess, Pointer(A+$10), @A, sizeof(A), NoB);
count:=A;
for x:= 0 to count-1 do begin
ReadProcessMemory (hProcess, Pointer($A57ACC), @A, sizeof(A), NoB);
ReadProcessMemory (hProcess, Pointer(A+$34), @A, sizeof(A), NoB);
ReadProcessMemory (hProcess, Pointer(A+$D18), @A, sizeof(A), NoB);
ReadProcessMemory (hProcess, Pointer(A+$C), @A, sizeof(A), NoB);
ReadProcessMemory (hProcess, Pointer(A+(x*4)), @B, sizeof(A), NoB);
ReadProcessMemory (hProcess, Pointer(B+$58), @A, sizeof(A), NoB);
if B <> 0 then begin
ReadProcessMemory (hProcess, Pointer(B+$4), @A, sizeof(A), NoB);
case A of
0,3: begin
ReadProcessMemory (hProcess, Pointer(B+$E0), @A, sizeof(A), NoB);
ReadProcessMemory (hProcess, Pointer(A+$C), @item_name, sizeof(item_name), NoB);
end;
.......
.......
cbb1.items.add(item_name);
end;
end;
прекрасно выводит в комбобокс содержимое инвентаря, за исключением всё тех же звёздочек. Но я решил наконец-то вынести это в отдельную функцию по аналогии с описанной в первом посте:
тык
Код:
function GetInventItems(hprocess:dword;cell_num:integer):string;
var
buf, nob:DWORD;
ibuf:array [0 .. 32] of WCHAR;
begin
ReadProcessMemory (hProcess, Pointer(GA), @buf, sizeof(buf), NoB);
ReadProcessMemory (hProcess, Pointer(buf+$34), @buf, sizeof(buf), NoB);
ReadProcessMemory (hProcess, Pointer(buf+$D18), @buf, sizeof(buf), NoB);
ReadProcessMemory (hProcess, Pointer(buf+$C), @buf, sizeof(buf), NoB);
ReadProcessMemory (hProcess, Pointer(buf+(cell_num*4)), @buf, sizeof(buf), NoB);
if buf <> 0 then begin
ReadProcessMemory (hProcess, Pointer(buf+$4), @buf, sizeof(buf), NoB);
case buf of
0,3: begin
ReadProcessMemory (hProcess, Pointer(buf+$E0), @buf, sizeof(buf), NoB);
ReadProcessMemory (hProcess, Pointer(buf+$C), @ibuf, sizeof(ibuf), NoB);
Result:=ibuf;
end;
.....
.....
end;
ShowMessage(ibuf);
end;
end;
Вызываю
f := GetInventItems(hProcess, 7); //8-я ячейка инвентаря
ShowMessage(f);
Результат - (????'????
|
|
 |
|
 |
|
Рак где то дальше в этом куске вроде все норм.
________________
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
|
|
|
16.10.2012, 23:45
|
#11
|
|
|
|
Лейтенант-командор
|
 Регистрация: 12.08.2010
 Сообщений: 727
 Популярность: 30569
 Золото Zhyk.Ru: 1
 Сказал(а) спасибо: 57
Поблагодарили 645 раз(а) в 386 сообщениях
|
Re: Функция определения названия предмета
Хм, а код, что в теме случайно не я писал?
Добавлено через 25 минут
А нет, извиняюсь, писал то же просто на форуме, на дату не посмотрел
Вот, кстати, мой вариант, всё описано полностью
________________
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Кошельки: WMZ - Z276844220882; WMR - R231028582939; WMU - U394136909210; ЯД - 410011494605270.
Perfect World: PWDatabaseScanner, Client, PWNickRenamer, PWClientRenamer, База логинов PW, Гайд по варУ, Зарабатываем репутацию.
Delphi: Авторизация на сайте с помощью Indy, Загрузка изображений с интернета в TImage с помощью Indy, Автоматическая смена стандартной версии Indy в Delphi на Indy 10.0.76 / 10.1.5, Основы парсинга с помощью Indy, Делаем Updater до программы с помощью Indy.
Other: ShowIP, FFUUU смайлы в QIP, Как играть в Minecraft (видеокурс), Как мы захватили человечество :D, Энергия в Лицемер/TopFace, PasGen.
Последний раз редактировалось VeTaL_UA; 17.10.2012 в 00:10.
Причина: Добавлено сообщение
|
|
|
19.10.2012, 07:31
|
#12
|
|
|
|
Пехотинец
|
 Регистрация: 17.05.2010
 Сообщений: 53
 Популярность: 204
 Сказал(а) спасибо: 11
Поблагодарили 15 раз(а) в 6 сообщениях
|
Re: Функция определения названия предмета
________________
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
|
|
|
05.03.2015, 23:23
|
#13
|
|
|
|
Пехотинец
|
 Регистрация: 03.01.2010
 Сообщений: 95
 Популярность: 1542
 Сказал(а) спасибо: 110
Поблагодарили 460 раз(а) в 288 сообщениях
|
Re: Функция определения названия предмета
item1_39_ofs=$58
item2_39_ofs=$4
|
|
|
25.03.2015, 14:55
|
#14
|
|
|
|
Рыцарь-лейтенант
|
 Регистрация: 31.01.2011
 Сообщений: 413
 Популярность: 14489
 Золото Zhyk.Ru: 300
 Сказал(а) спасибо: 77
Поблагодарили 361 раз(а) в 145 сообщениях
|
Re: Функция определения названия предмета
Альтернативный вариант для получения описания любой вещи инжектом:
1. Получаем указатель на ячейку - CELL_PTR
2. Выделяем удалённо в клиенте память - ALLOCATED_MEMORY
3. Инжектим следующий код (в другую память):
Код:
mov ecx, CELL_PTR // this = CELL_PTR
mov eax, [ecx] // eax = virtual table pointer
push 0 // параметр функции
call [eax+0x40] // вызов 11-й функции
mov [ALLOCATED_MEMORY], eax // пишем в выделенную память указатель на строку описания
4. Читаем из ALLOCATED_MEMORY - DESC_PTR
5. Читаем описание по указателю DESC_PTR
6. Освобождаем за собой память
7. PROFIT
Плюсы:
1. Для всех типов вещей один инжект
2. От версии клиента почти не зависит
3. Можно считать описание, не наводя на вещь перед этим
________________
Больше не занимаюсь читами, ушёл в серверную часть. Новый ник - int 3.
P.S. Но я всё такой же добрый модератор раздела PW.
Последний раз редактировалось Smertig; 25.03.2015 в 20:17.
|
|
|
Пользователь сказал cпасибо:
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 21:02.
|
 |