PDA

Просмотр полной версии : [Информация] Функция определения названия предмета


Jok3r666
20.01.2012, 22:04
Думаю кому нибудь пригодится

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


Если помог, не откажусь от спасибки.

Choochoo
27.03.2012, 17:45
Кто может помочь найти офсеты для итемов id 39 и 50 ?
Спасибо заранее

alegr
18.04.2012, 15:26
и как? работает твоя функция правильно? 32 символа как-то много, он не только название выводит, но и часть описания, нужно или по одному символу считывать пока не встретишь "\r" или считать строку и вырезать всё до \r

Jok3r666
11.05.2012, 07:30
и как? работает твоя функция правильно? 32 символа как-то много, он не только название выводит, но и часть описания, нужно или по одному символу считывать пока не встретишь "\r" или считать строку и вырезать всё до \r

У меня ничего лишнего не цепляля ни разу

ktulx
14.05.2012, 01:12
А как быть со специальными символами вроде звёзночки перед названием пухи/шмота/бижи? Данную функцию не пробовал, но делаю подобным образом и вместо звёздочки выводит знак вопроса, например "?Шлем Демон Страж".

BritishColonist
14.05.2012, 03:25
ktulx, попробуй поставить шрифт, взятый из папки с игрой. В нём есть звёздочки.
Это если выводишь в какой-нибудь Label или Edit. А если в файл, то тут, наверное, ничего не поделаешь.

ktulx
14.05.2012, 03:32
BritishColonist, вывожу в листбокс. Попробую со шрифтом похимичить. До этого не доводилось )

vogel
14.05.2012, 13:34
Эммм.... Вообще-то названия предметов (включая звёздочки и пр.) хранятся в уникоде, поэтому:
а) логично хранить их в WideString
б) использовать версию дельфей, понимающую уникод
в) в Windows XP вас спасёт только шрифт из комплекта игры, в 7-ке даже Verdana нормально показывает звёздочки.

ktulx
14.05.2012, 18:38
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):st ring;
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);

Результат - (????'????

Jok3r666
15.10.2012, 11:42
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):st ring;
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);

Результат - (????'????

Рак где то дальше в этом куске вроде все норм.

VeTaL_UA
16.10.2012, 23:45
Хм, а код, что в теме случайно не я писал?

Добавлено через 25 минут
А нет, извиняюсь, писал то же просто на форуме, на дату не посмотрел :)

Вот ([Ссылки могут видеть только зарегистрированные и активированные пользователи]), кстати, мой вариант, всё описано полностью :)

Jok3r666
19.10.2012, 07:31
Вот, кстати, мой вариант, всё описано полностью
О5 же нет 50 id и сейчас уже по моему 52 есть, давненько не ковырял.

diagnost
05.03.2015, 22:23
item1_39_ofs=$58
item2_39_ofs=$4

Smertig
25.03.2015, 13:55
Альтернативный вариант для получения описания любой вещи инжектом:
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. Можно считать описание, не наводя на вещь перед этим