#1 12-01-2007 08:51

Seemann
Registered: 07-08-2006
Posts: 2,155

[EXE|Patch] San Andreas Mission Packs

Для начала ознакомьтесь с моим недавним открытием: возможностью добавлять в игру мишн паки (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

#2 12-01-2007 11:47

Sanchez
Registered: 18-08-2006
Posts: 280

Re: [EXE|Patch] San Andreas Mission Packs

Нужен патчик, небольшой инжект в тело ехе.

Можно лоадер сделать.

Last edited by Sanchez (12-01-2007 11:47)

Offline

#3 12-01-2007 11:54

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: [EXE|Patch] San Andreas Mission Packs

Не, лоадер это неудобно, лучше один раз пропатчить.  Да и я хз как с лоадером сделать то что я планирую.

Offline

#4 12-01-2007 11:56

Sanchez
Registered: 18-08-2006
Posts: 280

Re: [EXE|Patch] San Andreas Mission Packs

Да и я хз как с лоадером сделать то что я планирую.

Планируешь что?

---
А патчить там много надо? Я только при старте миссий это находил.

Last edited by Sanchez (12-01-2007 11:58)

Offline

#5 12-01-2007 12:25

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: [EXE|Patch] San Andreas Mission Packs

Короче накидаю в 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

#6 12-01-2007 12:44

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: [EXE|Patch] San Andreas Mission Packs

Хотелось бы еще, чтоб тов. listener отозвался в этой теме smile

Offline

#7 13-01-2007 09:34

Sanchez
Registered: 18-08-2006
Posts: 280

Re: [EXE|Patch] San Andreas Mission Packs

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

#8 13-01-2007 09:37

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: [EXE|Patch] San Andreas Mission Packs

т.е на выходе получается script1.img?

Offline

#9 13-01-2007 09:43

Sanchez
Registered: 18-08-2006
Posts: 280

Re: [EXE|Patch] San Andreas Mission Packs

т.е на выходе получается script1.img?

Нет в зависимости от номера мпака на выходе получается:

mpack1 - scripta.img
mpack2 - scriptb.img
mpack3 - scriptc.img

Если надо цифры прибавляем не 40h а 30h только с цифрами получается до девяти, потом будут всякие символы, я первый раз сам с цифрами делал потом на буквы перешел.

Оригинальная игра, если ее запустить как мпак, выдает ошибку (пропатченная или нет без разницы) пока х.з. в чем дело.

Last edited by Sanchez (13-01-2007 10:06)

Offline

#10 13-01-2007 09:45

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: [EXE|Patch] San Andreas Mission Packs

попробовал я, патч сказал byte not found, но вроде done. Игра при запуске вылетает

Offline

#11 13-01-2007 09:47

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: [EXE|Patch] San Andreas Mission Packs

Sanchez wrote:

Зачем нопить 8 байт я так и не понял.

это обязательно нужно нопить, иначе игра не будет читать инфу о скриптах, записанную в скм (define scrtipt и пр.)! без этого все теряет смысл, даже если скрипты будут загружены, игра не будет их использовать

Offline

#12 13-01-2007 09:50

Sanchez
Registered: 18-08-2006
Posts: 280

Re: [EXE|Patch] San Andreas Mission Packs

попробовал я, патч сказал byte not found, но вроде done. Игра при запуске вылетает

х.з. у меня все нормально попробуй пропатчить чистый gta-sa.exe, или все вручную можно сделать (олька рулит wink)

Поставь бряк по адресу 005B915B и посмотри что у тебя в B72910

Last edited by Sanchez (13-01-2007 09:50)

Offline

#13 13-01-2007 09:52

Sanchez
Registered: 18-08-2006
Posts: 280

Re: [EXE|Patch] San Andreas Mission Packs

это обязательно нужно нопить, иначе игра не будет читать инфу о скриптах, записанную в скм (define scrtipt и пр.)! без этого все теряет смысл, даже если скрипты будут загружены, игра не будет их использовать

ну это легко поправить smile

Как проверить в игре что опр. scriptX.img запустился

Last edited by Sanchez (13-01-2007 10:08)

Offline

#14 13-01-2007 10:08

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: [EXE|Patch] San Andreas Mission Packs

Sanchez wrote:

Если надо цифры прибавляе не 40h а 30h только с цифрами получается до девяти, потом будут всякие символы

я кстати когда тестировал, игра не показывает больше 10 паков на экране, не знаю почему. Так что можно и цифрами.

попробуй edx вместо ecx, он свободный, не надо будет пуш/поп.

и, кстати, вторую проблему этот способ не решает.

Offline

#15 13-01-2007 10:14

Sanchez
Registered: 18-08-2006
Posts: 280

Re: [EXE|Patch] San Andreas Mission Packs

я кстати когда тестировал, игра не показывает больше 10 паков на экране, не знаю почему. Так что можно и цифрами.

Это я тоже заметил.

попробуй edx вместо ecx, он свободный, не надо будет пуш/поп.

Да какая разница. Я даже не проверял, может игра и не вылетит wink Хотя можно и заменить.

и, кстати, вторую проблему этот способ не решает.

Над этим я пока думаю, не заню за что зацепиться.

Offline

#16 13-01-2007 10:17

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: [EXE|Patch] San Andreas Mission Packs

Я чето не врубился как там пропатчилось:

.text:0040760B call    loc_856CD0

.text:00856CCF db  9Dh ; &#221;
.text:00856CD0 unk_856CD0 db 0D6h ; &#227;                                      ; 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 ; &#203;
.text:00856CD6 db  4Ch ; L
.text:00856CD7 db  24h ; $
.text:00856CD8 db  40h ; @
.text:00856CD9 db  64h ; d
.text:00856CDA db  89h ; &#201;
.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 ; &#195;
.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

#17 13-01-2007 10:21

Sanchez
Registered: 18-08-2006
Posts: 280

Re: [EXE|Patch] San Andreas Mission Packs

Я чето не врубился как там пропатчилось:

Нет, у меня там пусто.

Перенеси в др. место.

Можно вместо пустых опкодов добавить.

Last edited by Sanchez (13-01-2007 10:24)

Offline

#18 13-01-2007 10:32

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: [EXE|Patch] San Andreas Mission Packs

Так мультимод паком на оригинале работает, правда скрипты нет, но это надо нопить то условие. И сделать совместимость с ксионовским патчем, у меня он стоял

Offline

#19 13-01-2007 10:37

Sanchez
Registered: 18-08-2006
Posts: 280

Re: [EXE|Patch] San Andreas Mission Packs

Так мультимод паком на оригинале работает, правда скрипты нет, но это надо нопить то условие.

Непонял sad

И сделать совместимость с ксионовским патчем, у меня он стоял

Вот из-за этого, наверно, патч и не ставиться.

Есть процедура CompareStrings, она должна помочь.

Поподробнее. Я только lstrcmp и lstrcmpi знаю.

зы Как проверить в игре что опр. scriptX.img запустился

Last edited by Sanchez (13-01-2007 10:44)

Offline

#20 13-01-2007 10:45

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: [EXE|Patch] San Andreas Mission Packs

Непонял

ну я поставил оригинальный ехе, непатченный патчем 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

#21 13-01-2007 16:34

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: [EXE|Patch] San Andreas Mission Packs

Хотелось бы еще, чтоб тов. 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

#22 14-01-2007 05:20

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: [EXE|Patch] San Andreas Mission Packs

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

#23 14-01-2007 11:05

Sanchez
Registered: 18-08-2006
Posts: 280

Re: [EXE|Patch] San Andreas Mission Packs

правда могут возникнуть нестыковки, при несовпадении регистров (lowercase, uppercase). кстати, у тебя тоже такое возможно (буквы S, s различаются).

Они вроде приводятся к верхнему регистру хотя х.з.

Или попробовать CompareText, там вроде case-insensetiveОни

Есть апишная функция lstrcmpi там регистр не важен.

-----
Никак немогу заставить при загрузке читать gta.dat.

Небольшие изменения в патче. Процедуру вставил на место опкода 3ad. Занопил 8 байт smile

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сылочку убрал пока wink

Last edited by Seemann (14-01-2007 11:31)

Offline

#24 14-01-2007 11:23

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: [EXE|Patch] San Andreas Mission Packs

а имя скрипта какое? попробовал мультимод - скрипты не работают, хотя в остальном вроде норм (еще не проверял в отладчике)

Offline

#25 14-01-2007 11:24

Sanchez
Registered: 18-08-2006
Posts: 280

Re: [EXE|Patch] San Andreas Mission Packs

а имя скрипта какое? попробовал мультимод - скрипты не работают, хотя в остальном вроде норм (еще не проверял в отладчике)

mpack1-script1.img
mpack2-script2.img
...

ps где мультимод можно скачать

Last edited by Sanchez (14-01-2007 11:27)

Offline

Board footer

Powered by FluxBB