Конунг
-
Постов
3 -
Зарегистрирован
-
Посещение
Тип контента
Профили
Форумы
Загрузки
Блоги
Сообщения, опубликованные Конунг
-
-
2 часа назад, Xipho сказал:
Судя по твоему коду, ты не представляешь, что делаешь и зачем нопишь. Рекомендую почитать про инструкцию cmp, тогда станет понятно, что ты делаешь не так.
Да, я новичок. Но суть в том, что когда ее в коде нопишь, значения у персонажей становится максимальными и не падают. Вот оригинальный код на всякий случай. Там стоят комментарии, где такой же скрипт нопами, делает максимальное значение параметров. А вот через newmem не получается. Мне кажется через него правильнее будет, чем через code. А про cmp прочитаю, спасибо за наводку.
Спойлер00460115: 8B CE - mov ecx,esi
00460117: E8 BE B2 FC FF - call 0042B3DA
0046011C: 3B D8 - cmp ebx,eax //Религия
0046011E: 7D 02 - jnl 00460122
00460120: FF 07 - inc [edi]
00460122: 33 ED - xor ebp,ebp
00460124: A1 EC 7B 4F 00 - mov eax,[004F7BEC]
00460129: 8B C8 - mov ecx,eax
0046012B: D1 F9 - sar ecx,1
0046012D: 03 C1 - add eax,ecx
// ---------- INJECTING HERE ----------
0046012F: 39 86 A8 0A 00 00 - cmp [esi+00000AA8],eax //Энергия
// ---------- DONE INJECTING ----------
00460135: 7E 06 - jle 0046013D
00460137: 89 86 A8 0A 00 00 - mov [esi+00000AA8],eax
0046013D: A1 F0 7B 4F 00 - mov eax,[004F7BF0]
00460142: 8B C8 - mov ecx,eax
00460144: D1 F9 - sar ecx,1
00460146: 03 C1 - add eax,ecx
00460148: 39 86 AC 0A 00 00 - cmp [esi+00000AAC],eax //Стамина
0046014E: 7E 06 - jle 00460156
00460150: 89 86 AC 0A 00 00 - mov [esi+00000AAC],eax
00460156: A1 F4 7B 4F 00 - mov eax,[004F7BF4] -
Доброго времени суток. Хотелось бы узнать у экспертов, как занопить в newmem, если при добавлении нопов в newmem, значение продолжается меняться. Вот пример...но тут мне пришлось нопить сам код (тогда значение в игре не меняется). А через newmem это можно как то сделать? Закомментировал в code ту функцию, которую нужно занопить.
Спойлер[ENABLE]
aobscanmodule(Energy,GameRus.exe,39 86 A8 0A 00 00) // should be unique
alloc(newmem,$1000)
label(code)
label(return)
newmem:
code:
db 90 90 90 90
//cmp [esi+00000AA8],eax
jmp return
Energy:
jmp newmem
nop
return:
registersymbol(Energy)
[DISABLE]
Energy:
db 39 86 A8 0A 00 00
unregistersymbol(Energy)
dealloc(newmem)
[HELP] The Settlers 3 - History Edition v2.0
in Вопросы по созданию читов в одиночных играх
Опубликовано
Всем привет. Решил поиграть в поселенцев, но чита на эту версию игры не нашел. Есть табличка у зарубежных геймхакеров на версию игры 2.1, но она не работает на 2.0. Тогда решил попробовать взломать сам. Сразу оговорюсь, что я новичок в этом ремесле, поэтому многого не знаю. Моя задача была единственной - бессмертие для моих солдат. Нашел значение здоровья своих бойцов (не без труда) и оно было в byte. Нашел инструкции на доступ и запись.
Первая из них на запись, она же и еще две другие на доступ. Все они работают с адресами и врагов тоже. Когда нопишь первую, то бессмертными становятся все. Когда нопишь остальные две, то ничего не происходит, либо и враги, и мои солдаты убивают друг друга с одного удара. Что касается четвертой mov eax,ecx, то когда ее нопишь, то мои солдаты убивают вражеских с одного удара, а враги наносят обычный дамаг. Сам не знаю как это получилось. По крайней мере с OHK прошел все сюжетные кампании. Но моих солдат все равно убивали и мне все таки захотелось бессмертия, чтобы пройти остальные дополнительные сценарии в этой игре. К сожалению, ума не хватило написать скрипт. Во первых, не смог найти адреса для фильтра свой чужой. А те которые находил, все же менялись по ходу игры. Во вторых, не знаю как написать скрипт с регистром CL. На данный момент я сделал два скрипта которые включаются одновременно - OHK и HP (где оригинальный код в обоих случаях просто закомментирован). Тогда и здоровье не убавляется и благодаря OHK враги все же убиваются, не смотря на бессмертие и у них. Нужна помощь в написании скрипта хотя бы на бессмертие в грамотном виде. Мои скрипты работают, но сам понимаю, что это халтура. Вот и хотелось бы посмотреть пример правильного написания скрипта с пояснениями.
Как видно на скрине это то, что находится рядом с sub [edi+00525e73],cl (HP1). Тут же и movzx eax,byte ptr [edi+00525e73] (HP2) которая тоже получает доступ к адресу во время получения и нанесения урона.
Здесь третья инструкция, которая тоже получает доступ к тому же адресу здоровья моего солдата.
Скрипт на HP
[ENABLE]
aobscanmodule(HP,Siedler3R.exe,28 8F 73 5E 52 00) // should be unique
alloc(newmem,$1000)
label(code)
label(return)
newmem:
code:
//sub [edi+00525E73],cl
jmp return
HP:
jmp newmem
nop
return:
registersymbol(HP)
[DISABLE]
HP:
db 28 8F 73 5E 52 00
unregistersymbol(HP)
dealloc(newmem)
{
// ORIGINAL CODE - INJECTION POINT: Siedler3R.exe+13DD75
Siedler3R.exe+13DD51: 69 C0 48 01 00 00 - imul eax,eax,00000148
Siedler3R.exe+13DD57: 83 BC 30 EC 43 41 00 02 - cmp dword ptr [eax+esi+004143EC],02
Siedler3R.exe+13DD5F: 75 09 - jne Siedler3R.exe+13DD6A
Siedler3R.exe+13DD61: 8B C1 - mov eax,ecx
Siedler3R.exe+13DD63: D1 E8 - shr eax,1
Siedler3R.exe+13DD65: 01 C1 - add ecx,eax
Siedler3R.exe+13DD67: 89 4D F8 - mov [ebp-08],ecx
Siedler3R.exe+13DD6A: 0F B6 87 73 5E 52 00 - movzx eax,byte ptr [edi+00525E73]
Siedler3R.exe+13DD71: 3B C1 - cmp eax,ecx
Siedler3R.exe+13DD73: 72 0B - jb Siedler3R.exe+13DD80
// ---------- INJECTING HERE ----------
Siedler3R.exe+13DD75: 28 8F 73 5E 52 00 - sub [edi+00525E73],cl
// ---------- DONE INJECTING ----------
Siedler3R.exe+13DD7B: E9 DE 0A 00 00 - jmp Siedler3R.exe+13E85E
Siedler3R.exe+13DD80: 0F B7 87 7E 5E 52 00 - movzx eax,word ptr [edi+00525E7E]
Siedler3R.exe+13DD87: B9 AD 00 00 00 - mov ecx,000000AD
Siedler3R.exe+13DD8C: 66 3B C1 - cmp ax,cx
Siedler3R.exe+13DD8F: 0F 84 A4 04 00 00 - je Siedler3R.exe+13E239
Siedler3R.exe+13DD95: B9 AE 00 00 00 - mov ecx,000000AE
Siedler3R.exe+13DD9A: 66 3B C1 - cmp ax,cx
Siedler3R.exe+13DD9D: 0F 84 96 04 00 00 - je Siedler3R.exe+13E239
Siedler3R.exe+13DDA3: 83 F8 03 - cmp eax,03
Siedler3R.exe+13DDA6: 74 05 - je Siedler3R.exe+13DDAD
}
Скрипт на OHK
[ENABLE]
aobscanmodule(OHK,Siedler3R.exe,8B C1 D1 E8 01 C1) // should be unique
alloc(newmem,$1000)
label(code)
label(return)
newmem:
code:
//mov eax,ecx
shr eax,1
add ecx,eax
jmp return
OHK:
jmp newmem
nop
return:
registersymbol(OHK)
[DISABLE]
OHK:
db 8B C1 D1 E8 01 C1
unregistersymbol(OHK)
dealloc(newmem)
{
// ORIGINAL CODE - INJECTION POINT: Siedler3R.exe+13DD61
Siedler3R.exe+13DD2E: 8B 4D F8 - mov ecx,[ebp-08]
Siedler3R.exe+13DD31: 80 A7 84 5E 52 00 DF - and byte ptr [edi+00525E84],-21
Siedler3R.exe+13DD38: 83 3D A8 CD 36 01 00 - cmp dword ptr [Siedler3R.exe+CDCDA8],00
Siedler3R.exe+13DD3F: 74 29 - je Siedler3R.exe+13DD6A
Siedler3R.exe+13DD41: 80 3D 94 FB 39 01 00 - cmp byte ptr [Siedler3R.exe+D0FB94],00
Siedler3R.exe+13DD48: 74 20 - je Siedler3R.exe+13DD6A
Siedler3R.exe+13DD4A: 0F B6 87 70 5E 52 00 - movzx eax,byte ptr [edi+00525E70]
Siedler3R.exe+13DD51: 69 C0 48 01 00 00 - imul eax,eax,00000148
Siedler3R.exe+13DD57: 83 BC 30 EC 43 41 00 02 - cmp dword ptr [eax+esi+004143EC],02
Siedler3R.exe+13DD5F: 75 09 - jne Siedler3R.exe+13DD6A
// ---------- INJECTING HERE ----------
Siedler3R.exe+13DD61: 8B C1 - mov eax,ecx
// ---------- DONE INJECTING ----------
Siedler3R.exe+13DD63: D1 E8 - shr eax,1
Siedler3R.exe+13DD65: 01 C1 - add ecx,eax
Siedler3R.exe+13DD67: 89 4D F8 - mov [ebp-08],ecx
Siedler3R.exe+13DD6A: 0F B6 87 73 5E 52 00 - movzx eax,byte ptr [edi+00525E73]
Siedler3R.exe+13DD71: 3B C1 - cmp eax,ecx
Siedler3R.exe+13DD73: 72 0B - jb Siedler3R.exe+13DD80
Siedler3R.exe+13DD75: 28 8F 73 5E 52 00 - sub [edi+00525E73],cl
Siedler3R.exe+13DD7B: E9 DE 0A 00 00 - jmp Siedler3R.exe+13E85E
Siedler3R.exe+13DD80: 0F B7 87 7E 5E 52 00 - movzx eax,word ptr [edi+00525E7E]
Siedler3R.exe+13DD87: B9 AD 00 00 00 - mov ecx,000000AD
}
В обоих случаях просто закомментировал оригинальные инструкции. Включаю оба сразу и все работает. Как уже ранее писал, хочется понять как грамотно написать один скрипт на бессмертие.