You are not logged in.
Для начала ознакомьтесь с моим недавним открытием: возможностью добавлять в игру мишн паки (scm+gxt).
http://forums.ag.ru/?board=gta&action=d … =1725#1725 - первая находка
http://forums.ag.ru/?board=gta&action=d … =1790#1790 и далее по тексту
Скрины
http://sannybuilder.com/images/forums/mpunk.gif
http://sannybuilder.com/images/forums/mpunk1.jpg
http://sannybuilder.com/images/forums/mpunk2.jpg
http://sannybuilder.com/images/forums/mpunk3.jpg
http://sannybuilder.com/images/forums/mpacks_final.jpg
http://sannybuilder.com/images/forums/mpacks_final2.jpg
Прочитали? Едем дальше.
Основная проблема - игра не грузит script.img, поэтому вся функциональность равна нулю. Есть идея, как заставить ее делать это. Нужен патчик, небольшой инжект в тело ехе. Многое я уже раскопал, но нужна помощь да и времени сейчас в обрез.
Есть знатоки асма, желающие помочь?
<hr>
Патч лежит здесь: http://sannybuilder.com/files/samp_fix.rar
Last edited by Seemann (10-02-2007 05:59)
Offline
Нужен патчик, небольшой инжект в тело ехе.
Можно лоадер сделать.
Last edited by Sanchez (12-01-2007 11:47)
Offline
Не, лоадер это неудобно, лучше один раз пропатчить. Да и я хз как с лоадером сделать то что я планирую.
Offline
Да и я хз как с лоадером сделать то что я планирую.
Планируешь что?
---
А патчить там много надо? Я только при старте миссий это находил.
Last edited by Sanchez (12-01-2007 11:58)
Offline
Короче накидаю в 2-х словах че я хочу сделать
1. При загрузке майна есть проверка:
.text:00468F7F mov ds:dwMaxMissionLocal, ebx .text:00468F85 call j_GetMissionSegmentData ; Call Procedure >>>> .text:00468F8A cmp ds:MissionPackID, bl ; Compare Two Operands .text:00468F90 jnz short loc_468F9C ; Jump if Not Zero (ZF=0) <<<< .text:00468F92 mov ecx, offset eScriptsInfoPool ; Size(32) * Count(82) = 2624 .text:00468F92 ; +0 - dword Script IP .text:00468F92 ; +4 - word Status .text:00468F92 ; +6 - word ScmIndex .text:00468F92 ; +8 - char[20] Name .text:00468F92 ; +28 - dword Size .text:00468F97 call j_GetScriptsSegmentData ; Call Procedure .text:00468F9C .text:00468F9C loc_468F9C: ; CODE XREF: LoadMainScm+240j .text:00468F9C mov ds:dword_A4448C, esi
8 байтов. Ее мы затираем нафик, либо меняем условие, чтобы игра читала сегмент скриптов всегда.
2.
.text:005B9030 ; int __cdecl LoadDatFile(char *FileName)
грузит gta.dat файл и соответственно - script.img. Игра сначала парсит файл, смотрит расширения файлов и записывает их по адресу 008E48D8.
Для IMG файлов процедура StoreIMGName:
.text:005B9158 push 1 ; flag .text:005B915A push eax ; char *ImgName .text:005B915B call j_StoreImgName ; Call Procedure
Вот это место мы меняем. Перед j_StoreImgName есть свободные 5 байтов, вполне хватает для вставки нового кола:
.text:0040760B align 8 >>>> call SetNewIMGDir <<< .text:00407610 .text:00407610 ; --------------- S U B R O U T I N E --------------------------------------- .text:00407610 .text:00407610 ; Attributes: thunk .text:00407610 .text:00407610 ; int __cdecl j_StoreImgName(int,char) .text:00407610 j_StoreImgName proc near ; CODE XREF: sub_5A80D0+38p .text:00407610 ; LoadDatFile+12Bp .text:00407610 jmp StoreImgName ; Jump .text:00407610 j_StoreImgName endp
соответственно уменьшаем значение в 005B915B на 5 байтов. Игра при загрузке gta.dat перейдет на наше процедуру, выполнит ее (адрес изменится на папку с скм), и дальше пойдет как обычно.
Вот что я надумал. Есть 2 траблы:
1. Нужно проверить, в новой процедуре SetNewIMGDir что был передан именно script.img, а не cutscenes.img, например. Есть процедура CompareStrings, она должна помочь.
2. Данный метод будет (должен) работать только при первом запуске. Когда загружаешься во время игры, она gta.dat не читает (поэтому так быстро происходит загрузка). Надо заставить ее перечитывать script.img, только в том случае, если загружается другой пак или стандартная игра. Если перегружается та же самая - обновлять имг не надо.. Вот с этим я пока не разобрался.
Имг хранится в динамической памяти, процедура загрузки в
.text:005B6170 ; int __cdecl LoadIMG(char *FileName,int IntImgIndex)
IntImgIndex - это индекс имг, для script.img он равен 3.
Вот пока не знаю, как обновить имг. Заставить игру перечитывать gta.dat?
3. Нужно найти свободное место в ехе для новой процедуры, байтов 100-150.
4. Нужно перенести паки из директории User Files в корневую папку - это облегчит загрузку script.img, т.к. его имя хранится как локальное (data\script), а у паков тоже локальное (mpack\), но у паков это переделать проще (нужно занопить процедуру установления текущей папки в папку User Files при загрузке паков, тогда он будет читать mpack из корневой директории. Нужно занопить около 5 колов при загрузке паков.
Last edited by Seemann (13-01-2007 08:04)
Offline
Хотелось бы еще, чтоб тов. listener отозвался в этой теме
Offline
8 байтов. Ее мы затираем нафик, либо меняем условие, чтобы игра читала сегмент скриптов всегда.
Зачем нопить 8 байт я так и не понял.
По адресу B72910 храниться номер запущенного мпака (byte), если 0, то загружается стандартная игра.
Вот так у меня выглядет процедура SetNewIMGDir
00856CD0 /$ 51 PUSH ECX ; Сохраняем ECX на всякий случай 00856CD1 |. 8A48 05 MOV CL,BYTE PTR DS:[EAX+5] ; Заносим в CL 6 символ 00856CD4 |. 80F9 53 CMP CL,53 ; Сравниваем 6 символ (в CL) с символом 'S' 00856CD7 |. 75 20 JNZ SHORT gta_saa.00856CF9 ; Если CL != 'S', то на выход 00856CD9 |. 8A48 0C MOV CL,BYTE PTR DS:[EAX+C] ; Заносим в CL 13 символ 00856CDC |. 80F9 53 CMP CL,53 ; Сравниваем 13 символ (в CL) с символом 'S' 00856CDF |. 75 18 JNZ SHORT gta_saa.00856CF9 ; Если CL != 'S', то на выход 00856CE1 |. 8A0D 1029B700 MOV CL,BYTE PTR DS:[B72910] ; По адресу B72910 берем байт, равный номеру запущенного мпака 00856CE7 |. 80F9 00 CMP CL,0 ; Сравниваем CL c нулем 00856CEA |. 74 0D JE SHORT gta_saa.00856CF9 ; Если CL == 0, то на выход 00856CEC |. 80C1 40 ADD CL,40 ; CL = CL + 40 так надо :) 00856CEF |. 8848 12 MOV BYTE PTR DS:[EAX+12],CL ; Добовлаем к строке (в EAX) символ CL 00856CF2 |. C740 13 2E494D47 MOV DWORD PTR DS:[EAX+13],474D492E ; Добовлаем к строке (в EAX) расширение '.IMG' 00856CF9 |> 59 POP ECX ; Восстанавливаем ECX 00856CFA \. C3 RETN ; Возвращаемся обратно
Здесь я проверяю чтобы 6 и 13 символы были "S" DATA\SCRIPT\SCRIPT.IMG
Вот короче байты кот. я патчил
RAW Offset | Old Byte | New Byte -----------------+----------+---------- 00006A0B 90 E8 00006A0C 90 C0 00006A0D 90 F6 00006A0E 90 44 00006A0F 90 00 001B855C B0 AB 004560D0 00 51 004560D1 00 8A 004560D2 00 48 004560D3 00 05 004560D4 00 80 004560D5 00 F9 004560D6 00 53 004560D7 00 75 004560D8 00 20 004560D9 00 8A 004560DA 00 48 004560DB 00 0C 004560DC 00 80 004560DD 00 F9 004560DE 00 53 004560DF 00 75 004560E0 00 18 004560E1 00 8A 004560E2 00 0D 004560E3 00 10 004560E4 00 29 004560E5 00 B7 004560E7 00 80 004560E8 00 F9 004560EA 00 74 004560EB 00 0D 004560EC 00 80 004560ED 00 C1 004560EE 00 40 004560EF 00 88 004560F0 00 48 004560F1 00 12 004560F2 00 C7 004560F3 00 40 004560F4 00 13 004560F5 00 2E 004560F6 00 49 004560F7 00 4D 004560F8 00 47 004560F9 00 59 004560FA 00 C3
Last edited by Sanchez (14-01-2007 10:53)
Offline
т.е на выходе получается script1.img?
Offline
т.е на выходе получается script1.img?
Нет в зависимости от номера мпака на выходе получается:
mpack1 - scripta.img mpack2 - scriptb.img mpack3 - scriptc.img
Если надо цифры прибавляем не 40h а 30h только с цифрами получается до девяти, потом будут всякие символы, я первый раз сам с цифрами делал потом на буквы перешел.
Оригинальная игра, если ее запустить как мпак, выдает ошибку (пропатченная или нет без разницы) пока х.з. в чем дело.
Last edited by Sanchez (13-01-2007 10:06)
Offline
попробовал я, патч сказал byte not found, но вроде done. Игра при запуске вылетает
Offline
Зачем нопить 8 байт я так и не понял.
это обязательно нужно нопить, иначе игра не будет читать инфу о скриптах, записанную в скм (define scrtipt и пр.)! без этого все теряет смысл, даже если скрипты будут загружены, игра не будет их использовать
Offline
попробовал я, патч сказал byte not found, но вроде done. Игра при запуске вылетает
х.з. у меня все нормально попробуй пропатчить чистый gta-sa.exe, или все вручную можно сделать (олька рулит )
Поставь бряк по адресу 005B915B и посмотри что у тебя в B72910
Last edited by Sanchez (13-01-2007 09:50)
Offline
это обязательно нужно нопить, иначе игра не будет читать инфу о скриптах, записанную в скм (define scrtipt и пр.)! без этого все теряет смысл, даже если скрипты будут загружены, игра не будет их использовать
ну это легко поправить
Как проверить в игре что опр. scriptX.img запустился
Last edited by Sanchez (13-01-2007 10:08)
Offline
Если надо цифры прибавляе не 40h а 30h только с цифрами получается до девяти, потом будут всякие символы
я кстати когда тестировал, игра не показывает больше 10 паков на экране, не знаю почему. Так что можно и цифрами.
попробуй edx вместо ecx, он свободный, не надо будет пуш/поп.
и, кстати, вторую проблему этот способ не решает.
Offline
я кстати когда тестировал, игра не показывает больше 10 паков на экране, не знаю почему. Так что можно и цифрами.
Это я тоже заметил.
попробуй edx вместо ecx, он свободный, не надо будет пуш/поп.
Да какая разница. Я даже не проверял, может игра и не вылетит Хотя можно и заменить.
и, кстати, вторую проблему этот способ не решает.
Над этим я пока думаю, не заню за что зацепиться.
Offline
Я чето не врубился как там пропатчилось:
.text:0040760B call loc_856CD0 .text:00856CCF db 9Dh ; Ý .text:00856CD0 unk_856CD0 db 0D6h ; ã ; CODE XREF: .text:loc_40760Bp .text:00856CD1 db 0C0h ; L .text:00856CD2 db 0FFh .text:00856CD3 db 32h ; 2 .text:00856CD4 db 0C0h ; L .text:00856CD5 db 8Bh ; Ë .text:00856CD6 db 4Ch ; L .text:00856CD7 db 24h ; $ .text:00856CD8 db 40h ; @ .text:00856CD9 db 64h ; d .text:00856CDA db 89h ; É .text:00856CDB db 0Dh .text:00856CDC db 0 .text:00856CDD db 0 .text:00856CDE db 0 .text:00856CDF db 0 .text:00856CE0 db 5Fh ; _ .text:00856CE1 db 5Eh ; ^ .text:00856CE2 db 83h ; Ã .text:00856CE3 db 0C4h ; - .text:00856CE4 db 44h ; D .text:00856CE5 db 0C2h ; T .text:00856CE6 db 4 .text:00856CE7 db 0
это ты вместо 00С3 перезапизал чтоли?
Offline
Я чето не врубился как там пропатчилось:
Нет, у меня там пусто.
Перенеси в др. место.
Можно вместо пустых опкодов добавить.
Last edited by Sanchez (13-01-2007 10:24)
Offline
Так мультимод паком на оригинале работает, правда скрипты нет, но это надо нопить то условие. И сделать совместимость с ксионовским патчем, у меня он стоял
Offline
Так мультимод паком на оригинале работает, правда скрипты нет, но это надо нопить то условие.
Непонял
И сделать совместимость с ксионовским патчем, у меня он стоял
Вот из-за этого, наверно, патч и не ставиться.
Есть процедура CompareStrings, она должна помочь.
Поподробнее. Я только lstrcmp и lstrcmpi знаю.
зы Как проверить в игре что опр. scriptX.img запустился
Last edited by Sanchez (13-01-2007 10:44)
Offline
Непонял
ну я поставил оригинальный ехе, непатченный патчем Xieon'а и все заработало. Мультимод запустился, scripta.img тоже
Поподробнее. Я только lstrcmp и lstrcmpi знаю
.text:008214D0 ; int __cdecl CompareStrings(char *StringPtr1,char *StringPtr2,int StringLength) .text:008213D0 ; int __cdecl CharPos(char *String,char Char) .text:0082258E ; int __cdecl StrToInt(char *String) .text:0076FA94 ; int __stdcall CompareText(LPCSTR lpString2) // первая строка в ECX
Как проверить в игре что опр. scriptX.img запустился
а зачем? по MissionPackID ты можешь знать, какой сейчас IMG в памяти (до первой перезагрузки проверка работает, но тебе другого и не надо)
Last edited by Seemann (13-01-2007 10:53)
Offline
Хотелось бы еще, чтоб тов. listener отозвался в этой теме
Отзываюсь. Я пока еще до скриптов толком не добирался (так, слегка пробежался), так что с конкретикой помочь не могу.
Из общих вопросов - в IDA есть меню Edit->Patch, которое включается в idagui.cfg (DISPLAY_PATCH_SUBMENU = YES), в котором можно править непосредственно код. К сожалению, File->Produce File, для EXE/PE не работает. Чтобы сбросить результаты правок, можно пользоваться .idc, например:
static main (void) { auto beg, end, name, file; beg = SegStart (ScreenEA ()); end = SegEnd (ScreenEA ()); name = SegName (ScreenEA ()); Message ("DUMP %s:%08x-%08x", name, beg, end); file = fopen (name, "wb"); savefile (file, 0, beg, end-beg); fclose (file); }
Приведенный фрагмент сбрасывает текущий сегмент в файл, с именем, совпадающим с именем сегмента (а заменить его в .exe - задача тривиальная, например, для .text - записать его в gta_sa.exe по смещению 0x400 (проверить! может отличаться))
Я сейчас пытаюсь избавиться от сегмента HOODLUM (вернуть все на место), чтобы выкинуть все рудименты securom. В итоге, должн получиться .exe не 15М, а порядка 5.5. Если все получится и все будет работать (вероятность я оцениваю процентов в 75), можно будет взять его за эталонный.
Offline
2Sanchez:
можно попробовать сравнивать не 2 буквы, а все имя имга:
push 6 // script push 00859D4C // db 'script',0 push [eax+C] // data\script\script.img call CompareStrings test al, al
правда могут возникнуть нестыковки, при несовпадении регистров (lowercase, uppercase). кстати, у тебя тоже такое возможно (буквы S, s различаются).
Или попробовать CompareText, там вроде case-insensetive.
Offline
правда могут возникнуть нестыковки, при несовпадении регистров (lowercase, uppercase). кстати, у тебя тоже такое возможно (буквы S, s различаются).
Они вроде приводятся к верхнему регистру хотя х.з.
Или попробовать CompareText, там вроде case-insensetiveОни
Есть апишная функция lstrcmpi там регистр не важен.
-----
Никак немогу заставить при загрузке читать gta.dat.
Небольшие изменения в патче. Процедуру вставил на место опкода 3ad. Занопил 8 байт
00468F8A . 90 NOP 00468F8B . 90 NOP 00468F8C . 90 NOP 00468F8D . 90 NOP 00468F8E . 90 NOP 00468F8F . 90 NOP 00468F90 . 90 NOP 00468F91 . 90 NOP 005B915B . E8 ABE4E4FF CALL gta_sa.0040760B 0040760B $ E8 4FD10700 CALL gta_sa.0048475F 0048475A > \E9 3C0F0000 JMP gta_sa.0048569B ; Case 3AD of switch 00483BF2 0048475F /$ 8A50 05 MOV DL,BYTE PTR DS:[EAX+5] 00484762 |. 80FA 53 CMP DL,53 00484765 |. 75 20 JNZ SHORT gta_sa.00484787 00484767 |. 8A50 0C MOV DL,BYTE PTR DS:[EAX+C] 0048476A |. 80FA 53 CMP DL,53 0048476D |. 75 18 JNZ SHORT gta_sa.00484787 0048476F |. 8A15 1029B700 MOV DL,BYTE PTR DS:[B72910] 00484775 |. 80FA 00 CMP DL,0 00484778 |. 74 0D JE SHORT gta_sa.00484787 0048477A |. 80C2 30 ADD DL,30 0048477D |. 8850 12 MOV BYTE PTR DS:[EAX+12],DL 00484780 |. C740 13 2E494D47 MOV DWORD PTR DS:[EAX+13],474D492E 00484787 \> C3 RETN 00484788 90 NOP 00484789 90 NOP 0048478A 90 NOP 0048478B 90 NOP 0048478C 90 NOP 0048478D 90 NOP
И сделать совместимость с ксионовским патчем, у меня он стоял
Вот попробуй это:
cсылочку убрал пока
Last edited by Seemann (14-01-2007 11:31)
Offline
а имя скрипта какое? попробовал мультимод - скрипты не работают, хотя в остальном вроде норм (еще не проверял в отладчике)
Offline
а имя скрипта какое? попробовал мультимод - скрипты не работают, хотя в остальном вроде норм (еще не проверял в отладчике)
mpack1-script1.img
mpack2-script2.img
...
ps где мультимод можно скачать
Last edited by Sanchez (14-01-2007 11:27)
Offline