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