Сейчас на форуме: Magister Yoda, vasilevradislav (+5 невидимых)

 eXeL@B —› Крэки, обсуждения —› Исследование Heroes 3
. 1 . 2 . >>
Посл.ответ Сообщение

Ранг: 0.7 (гость)
Активность: 0.010
Статус: Участник

Создано: 12 января 2016 13:05
· Личное сообщение · #1

Добрый день. Думаю heroes 3 в представлении не нуждаются. Решил заняться исследованием данной игры, никакой конкретной цели не преследую, просто для себя + подкачать скил ассемблере и руками пощупать, что такое исследование, попробовать поделать небольшие изменения - поиграться)
Решил легкие задачки не брать типа изменения кол-во существ, золото over 9000 - не сложно да и artmoney выручит. Потому поставил задачу по-сложнее, как вы знаете в данной игре могут быть только 8 игроков(8 цветов), хотелось бы сделать больше. Потому как мне стоит подойти к решению данной задачи лучше?
Пользуюсь ollyDBG и IDA. Собственно сразу столкнулся с проблемой. Количество игроков это не статическая переменная так просто ее не найти. Попробовал поискать тот момент, когда генерируем случайный шаблон для карты(Там думается мне передается кол-во игроков в параметрах) - снова облом. Попробовал найти ту часть где идет прибавление дней/недель/месяцев нашел лишь инициализацию и тот момент когда заносим новый день в стек дальше действий с регистром не нашел - забил. Теперь пробую найти упоминание слов типа player и проч. Может кто-то что-нибудь умной посоветует? Какой-нибудь интересный подход для обнаружения этого числа?



Ранг: 95.1 (постоянный), 247thx
Активность: 0.260.01
Статус: Участник

Создано: 12 января 2016 13:14
· Личное сообщение · #2

А конечная цель у Вас какая ? Сделать редактор сохранений ?

-----
TEST YOUR MIGHT




Ранг: 0.7 (гость)
Активность: 0.010
Статус: Участник

Создано: 12 января 2016 13:19 · Поправил: KordDEM
· Личное сообщение · #3

Конечная цель - понять как работает данная игра. Что бы при возникновении мыслей в плане улучшений можно было не разбираться с 0, а в течении короткого промежутка времени добавить или вернуться к исходному варианту, если не понравится. Аналог мододелов, только для собственного пользования)



Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 12 января 2016 13:42 · Поправил: VodoleY
· Личное сообщение · #4

KordDEM когдато менял сейвы героев(добавлял предметы) там все банально.. а вообще не занимайтесь дурью. под герои есть редактор карт .. для создания собственных квестовых. бери лучше редактор и смотрите что он делает. или вы решили движок геороев выдирать? дык это дурь. помница были карты от GREGa вроде так.. оочень лютые карты.. для тех, у кого уровня умения в игре ипасебл

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....




Ранг: 222.2 (наставник), 115thx
Активность: 0.140.01
Статус: Участник

Создано: 12 января 2016 13:43
· Личное сообщение · #5

На этом форуме у вас спросят детали: где искать, что искать(бинарники, адреса), и конечно же спросят что же вы сделали для этого сами. Уже существует минимум 2 проекта, которые занимаются разбором и переписыванием homm3:
http://forum.vcmi.eu/portal.php
http://forum.df2.ru/showtopic=7188
Во втором случае разработчик скорее всего русскоязычный, и по всей видимости свой проект не только не забросил но и активно пилит.

-----
все багрепорты - в личные сообщения




Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 12 января 2016 13:46
· Личное сообщение · #6

HandMill стоп.. там же еще под андроид геров год назад вроде переносить двиг начали.. даже вроде бетка есть..

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....




Ранг: 222.2 (наставник), 115thx
Активность: 0.140.01
Статус: Участник

Создано: 12 января 2016 13:49
· Личное сообщение · #7

VodoleY возможно Вы имеете ввиду движок для homm 2, который называется fheroes, тут человек третьими интересуется.

-----
все багрепорты - в личные сообщения




Ранг: 0.7 (гость)
Активность: 0.010
Статус: Участник

Создано: 12 января 2016 13:56
· Личное сообщение · #8

VodoleY пишет:
KordDEM когдато менял сейвы героев(добавлял предметы) там все банально.. а вообще не занимайтесь дурью. под герои есть редактор карт .. для создания собственных квестовых. бери лучше редактор и смотрите что он делает. или вы решили движок геороев выдирать? дык это дурь. помница были карты от GREGa вроде так.. оочень лютые карты.. для тех, у кого уровня умения в игре ипасебл

В механике игры больше 8 человек нельзя создавать даже в редакторе карт. Т.к. всего 8 цветов(красный, синий и т.д). Да и не карту мне одну надо, а собственно механику поменять.
HandMill пишет:
На этом форуме у вас спросят детали: где искать, что искать(бинарники, адреса), и конечно же спросят что же вы сделали для этого сами. Уже существует минимум 2 проекта, которые занимаются разбором и переписыванием homm3:
http://forum.vcmi.eu/portal.php
http://forum.df2.ru/showtopic=7188
Во втором случае разработчик скорее всего русскоязычный, и по всей видимости свой проект не только не забросил но и активно пилит.

Был на втором форуме) Там люди ленятся и либо не понимают некоторый моменты касательно низкоуровневого программирования, либо я чего-то не понимаю. Но в любом случае хочется самому поковырятся)
Кое-какие адреса предоставить могу - находил(да и писал вроде где искал), но основная проблемы в том, что я не могу найти момент где описано кол-во игроков.



Ранг: 222.2 (наставник), 115thx
Активность: 0.140.01
Статус: Участник

Создано: 12 января 2016 14:13
· Личное сообщение · #9

KordDEM пишет:
Был на втором форуме) Там люди ленятся и либо не понимают некоторый моменты касательно низкоуровневого программирования, либо я чего-то не понимаю. Но в любом случае хочется самому поковырятся)

вы начали с того что не выложили бинарник. Разных версий homm3 было помоему не мало, и это не считая всяких аддонов. Во всех них, скорее всего, разные исполнительные файлы, соответственно адреса и данные будут разными. Для выполнения вашей задачи нужно понимать принципы игры, именно поэтому я вам и предложил попробовать связаться с энтузиастами которые занимаются этим направлением.

-----
все багрепорты - в личные сообщения




Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 12 января 2016 16:31
· Личное сообщение · #10

HandMill пишет:
ы начали с того что не выложили бинарник. Разных версий homm3 было помоему не мало, и это не считая всяких аддонов.

на моей памяти минимум 12шт было.. может даже больше

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....




Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 12 января 2016 17:31
· Личное сообщение · #11

KordDEM пишет:
Потому поставил задачу по-сложнее, как вы знаете в данной игре могут быть только 8 игроков(8 цветов), хотелось бы сделать больше. Потому как мне стоит подойти к решению данной задачи лучше

К примеру, в dota2 кол-во игроков, судя по всему, задано, через #define и инлайинится везде.
Code:
  1.     |.  83FE 09       CMP ESI,9 //указывает на работу с массивом данных
  2.     |.- 76 0B         JBE SHORT 21C4C951

Под каждого игрока выделяется массив данных.
В случае с heroes 3, по аналогии, я полагаю, Вам стоит искать цикл обработки движений ботов в игре на общей карте, он должен крутится по итерациями из кол-ва ботов, т.е. после нажатия окончания хода, мы должны попасть в этот цикл. Выцепите эту переменную - потяните за всю цепочку. Ещё наверняка должны быть функции типа AddBot, SetBotDifficulty - смотрите все строки, авось найдете что нужно (у меня с DUNE 2000 так прокатывало)



Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 12 января 2016 19:28
· Личное сообщение · #12

ELF_7719116 пишет:
Под каждого игрока выделяется массив данных.

если он не статичен ток.. что вполне возможно. тогда жопель

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....





Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 12 января 2016 20:14
· Личное сообщение · #13

Для начала, разумно будет найти референсы к ресурсам, и от них плясать (всё равно ведь придётся)
вот, например:
PRBLUE.PCX
PRGREEN.PCX
PRORANGE.PCX
PRPURPLE.PCX
PRRED.PCX
PRROSE.PCX
PRTAN.PCX
PRTEAL.PCX

найдёшь массив указателей на эти имена - выйдешь на что-то похожее на цикл инициализации. покопай сначала там

Добавлено спустя 2 часа 24 минуты
А вообще, задача тянет на отдельный мод, с кучей сопутствующих изменений.
Во-первых, самое простое - это расширение массивов с цветами игроков (на один я уже указал, и еще один - непосредственно локализорванные названия цветов)
Во-вторых, скорей всего придётся еще править Players.pal на предмет новых цветов (я так понимаю, влияет на цвет флагов у объектов, городов и героев)
В-третьих, просмотр кучи циклов на предмет константы 8
В-четвёртых, я могу ошибаться, так как сильно не вникал - но похоже, что присутствие или отсутствие на карте игрока определённого цвета задаётся массивом булей в динамической памяти, и массив этот угадайте какого размера. Вот, например, код:

Code:
  1. .text:005DE70A                 mov     eax, [ebp+var_24]
  2. .text:005DE70D                 cmp     eax, 8
  3. .text:005DE710                 jge     short loc_5DE72F
  4. .text:005DE712                 mov     ecx, dword_69CC88
  5. .text:005DE718
  6. .text:005DE718 loc_5DE718:                             ; CODE XREF: sub_5DE140+5E7j
  7. .text:005DE718                 mov     dl, [eax+ecx+1F636h]
  8. .text:005DE71F                 test    dl, dl
  9. .text:005DE721                 jz      short loc_5DE729
  10. .text:005DE723                 inc     eax
  11. .text:005DE724                 cmp     eax, 8
  12. .text:005DE727                 jl      short loc_5DE718
  13. .text:005DE729
  14. .text:005DE729 loc_5DE729:                             ; CODE XREF: sub_5DE140+5E1j
  15. .text:005DE729                 mov     [ebp+var_24], eax
  16. .text:005DE72C                 cmp     eax, 8
  17. .text:005DE72F
  18. .text:005DE72F loc_5DE72F:                             ; CODE XREF: sub_5DE140+5D0j
  19. .text:005DE72F                 jz      loc_5DF538


(Смотрю на HoMM 3 Полное собрание, MD5 exe модуля - 55BE6A65157A1D4F6912817AD96E33C8 )

| Сообщение посчитали полезным: KordDEM

Ранг: 0.7 (гость)
Активность: 0.010
Статус: Участник

Создано: 13 января 2016 08:37 · Поправил: KordDEM
· Личное сообщение · #14

Code:
  1. .data:0068A324 off_68A324      dd offset aPrred_pcx    ; DATA XREF: sub_5DDE10+60Br
  2. .data:0068A324                                         ; "PRRed.pcx"
  3. .data:0068A328                 dd offset aPrblue_pcx   ; "PRBlue.pcx"
  4. .data:0068A32C                 dd offset aPrtan_pcx    ; "PRTan.pcx"
  5. .data:0068A330                 dd offset aPrgreen_pcx  ; "PRGreen.pcx"
  6. .data:0068A334                 dd offset aProrange_pcx ; "PROrange.pcx"
  7. .data:0068A338                 dd offset aPrpurple_pcx ; "PRPurple.pcx"
  8. .data:0068A33C                 dd offset aPrteal_pcx   ; "PRTeal.pcx"
  9. .data:0068A340                 dd offset aPrrose_pcx   ; "PRRose.pcx"
  10. .data:0068A344                 dd offset aTpcasneu_pcx ; "TPCasNeu.pcx"

Скорее всего придется создавать свой аналогичный файлик. Соответственно как собственно сами файлики найти и редактировать в случае Players.pal?
Для каждого цвета присутствует подобный код:
Code:
  1. .text:005C892A loc_5C892A:                             ; CODE XREF: sub_5C8590+36Dj
  2. .text:005C892A                 xor     eax, eax
  3. .text:005C892C
  4. .text:005C892C loc_5C892C:                             ; CODE XREF: sub_5C8590+398j
  5. .text:005C892C                 lea     edx, [ebp+var_18]
  6. .text:005C892F                 mov     [ebp+var_18], eax
  7. .text:005C8932                 mov     eax, [esi+8]
  8. .text:005C8935                 push    edx
  9. .text:005C8936                 push    1
  10. .text:005C8938                 push    eax
  11. .text:005C8939                 mov     ecx, esi
  12. .text:005C893B                 mov     byte ptr [ebp+var_4], 0
  13. .text:005C893F                 call    sub_5FE2D0
  14. .text:005C8944                 push    34h
  15. .text:005C8946                 call    sub_617492
  16. .text:005C894B                 add     esp, 4
  17. .text:005C894E                 mov     [ebp+var_20], eax
  18. .text:005C8951                 test    eax, eax
  19. .text:005C8953                 mov     byte ptr [ebp+var_4], 9
  20. .text:005C8957                 jz      short loc_5C897F
  21. .text:005C8959                 push    800h
  22. .text:005C895E                 push    offset aPrred_pcx ; "PRRed.pcx"
  23. .text:005C8963                 push    384h
  24. .text:005C8968                 push    6Dh
  25. .text:005C896A                 push    3Eh
  26. .text:005C896C                 push    14Eh
  27. .text:005C8971                 push    0FDh
  28. .text:005C8976                 mov     ecx, eax
  29. .text:005C8978                 call    sub_44FFA0
  30. .text:005C897D                 jmp     short loc_5C8981
  31. .text:005C897F ; ---------------------------------------------------------------------------
  32. .text:005C897F
  33. .text:005C897F loc_5C897F:                             ; CODE XREF: sub_5C8590+3C7j
  34. .text:005C897F                 xor     eax, eax
  35. .text:005C8981
  36. .text:005C8981 loc_5C8981:                             ; CODE XREF: sub_5C8590+3EDj
  37. .text:005C8981                 lea     ecx, [ebp+var_18]
  38. .text:005C8984                 mov     [ebp+var_18], eax
  39. .text:005C8987                 mov     eax, [esi+8]
  40. .text:005C898A                 push    ecx
  41. .text:005C898B                 push    1
  42. .text:005C898D                 push    eax
  43. .text:005C898E                 mov     ecx, esi
  44. .text:005C8990                 mov     byte ptr [ebp+var_4], 0
  45. .text:005C8994                 call    sub_5FE2D0
  46. .text:005C8999                 push    34h
  47. .text:005C899B                 call    sub_617492
  48. .text:005C89A0                 add     esp, 4
  49. .text:005C89A3                 mov     [ebp+var_20], eax
  50. .text:005C89A6                 test    eax, eax
  51. .text:005C89A8                 mov     byte ptr [ebp+var_4], 0Ah
  52. .text:005C89AC                 jz      short loc_5C89D4
  53. .text:005C89AE                 push    800h
  54. .text:005C89B3                 push    offset aPrred_pcx ; "PRRed.pcx"
  55. .text:005C89B8                 push    385h
  56. .text:005C89BD                 push    6Dh
  57. .text:005C89BF                 push    3Eh
  58. .text:005C89C1                 push    14Eh
  59. .text:005C89C6                 push    13Fh
  60. .text:005C89CB                 mov     ecx, eax
  61. .text:005C89CD                 call    sub_44FFA0
  62. .text:005C89D2                 jmp     short loc_5C89D6
  63. .text:005C89D4 ; ---------------------------------------------------------------------------
  64. .text:005C89D4
  65. .text:005C89D4 loc_5C89D4:                             ; CODE XREF: sub_5C8590+41Cj
  66. .text:005C89D4                 xor     eax, eax
  67. .text:005C89D6
  68. .text:005C89D6 loc_5C89D6:                             ; CODE XREF: sub_5C8590+442j
  69. .text:005C89D6                 lea     edx, [ebp+var_18]
  70. .text:005C89D9                 mov     [ebp+var_18], eax
  71. .text:005C89DC                 mov     eax, [esi+8]
  72. .text:005C89DF                 push    edx
  73. .text:005C89E0                 push    1
  74. .text:005C89E2                 push    eax
  75. .text:005C89E3                 mov     ecx, esi
  76. .text:005C89E5                 mov     byte ptr [ebp+var_4], 0
  77. .text:005C89E9                 call    sub_5FE2D0
  78. .text:005C89EE                 push    34h
  79. .text:005C89F0                 call    sub_617492
  80. .text:005C89F5                 add     esp, 4
  81. .text:005C89F8                 mov     [ebp+var_20], eax
  82. .text:005C89FB                 test    eax, eax
  83. .text:005C89FD                 mov     byte ptr [ebp+var_4], 0Bh
  84. .text:005C8A01                 jz      short loc_5C8A29
  85. .text:005C8A03                 push    800h
  86. .text:005C8A08                 push    offset aPrred_pcx ; "PRRed.pcx"
  87. .text:005C8A0D                 push    386h
  88. .text:005C8A12                 push    6Dh
  89. .text:005C8A14                 push    3Eh
  90. .text:005C8A16                 push    14Eh
  91. .text:005C8A1B                 push    181h
  92. .text:005C8A20                 mov     ecx, eax
  93. .text:005C8A22                 call    sub_44FFA0
  94. .text:005C8A27                 jmp     short loc_5C8A2B
  95. .text:005C8A29 ; ---------------------------------------------------------------------------
  96. .text:005C8A29
  97. .text:005C8A29 loc_5C8A29:                             ; CODE XREF: sub_5C8590+471j
  98. .text:005C8A29                 xor     eax, eax
  99. .text:005C8A2B
  100. .text:005C8A2B loc_5C8A2B:                             ; CODE XREF: sub_5C8590+497j
  101. .text:005C8A2B                 lea     ecx, [ebp+var_18]
  102. .text:005C8A2E                 mov     [ebp+var_18], eax
  103. .text:005C8A31                 mov     eax, [esi+8]
  104. .text:005C8A34                 push    ecx
  105. .text:005C8A35                 push    1
  106. .text:005C8A37                 push    eax
  107. .text:005C8A38                 mov     ecx, esi
  108. .text:005C8A3A                 mov     byte ptr [ebp+var_4], 0
  109. .text:005C8A3E                 call    sub_5FE2D0
  110. .text:005C8A43                 push    34h
  111. .text:005C8A45                 call    sub_617492
  112. .text:005C8A4A                 add     esp, 4
  113. .text:005C8A4D                 mov     [ebp+var_20], eax
  114. .text:005C8A50                 test    eax, eax
  115. .text:005C8A52                 mov     byte ptr [ebp+var_4], 0Ch
  116. .text:005C8A56                 jz      short loc_5C8A7E
  117. .text:005C8A58                 push    800h
  118. .text:005C8A5D                 push    offset aPrred_pcx ; "PRRed.pcx"
  119. .text:005C8A62                 push    387h
  120. .text:005C8A67                 push    6Dh
  121. .text:005C8A69                 push    3Eh
  122. .text:005C8A6B                 push    14Eh
  123. .text:005C8A70                 push    1C3h
  124. .text:005C8A75                 mov     ecx, eax
  125. .text:005C8A77                 call    sub_44FFA0
  126. .text:005C8A7C                 jmp     short loc_5C8A80
  127. .text:005C8A7E ; ---------------------------------------------------------------------------
  128. .text:005C8A7E
  129. .text:005C8A7E loc_5C8A7E:                             ; CODE XREF: sub_5C8590+4C6j
  130. .text:005C8A7E                 xor     eax, eax
  131. .text:005C8A80
  132. .text:005C8A80 loc_5C8A80:                             ; CODE XREF: sub_5C8590+4ECj
  133. .text:005C8A80                 lea     edx, [ebp+var_18]
  134. .text:005C8A83                 mov     [ebp+var_18], eax
  135. .text:005C8A86                 mov     eax, [esi+8]
  136. .text:005C8A89                 push    edx
  137. .text:005C8A8A                 push    1
  138. .text:005C8A8C                 push    eax
  139. .text:005C8A8D                 mov     ecx, esi
  140. .text:005C8A8F                 mov     byte ptr [ebp+var_4], 0
  141. .text:005C8A93                 call    sub_5FE2D0
  142. .text:005C8A98                 push    34h
  143. .text:005C8A9A                 call    sub_617492
  144. .text:005C8A9F                 add     esp, 4
  145. .text:005C8AA2                 mov     [ebp+var_20], eax
  146. .text:005C8AA5                 test    eax, eax
  147. .text:005C8AA7                 mov     byte ptr [ebp+var_4], 0Dh
  148. .text:005C8AAB                 jz      short loc_5C8AD3
  149. .text:005C8AAD                 push    800h
  150. .text:005C8AB2                 push    offset aPrred_pcx ; "PRRed.pcx"
  151. .text:005C8AB7                 push    388h
  152. .text:005C8ABC                 push    6Dh
  153. .text:005C8ABE                 push    3Eh
  154. .text:005C8AC0                 push    14Eh
  155. .text:005C8AC5                 push    205h
  156. .text:005C8ACA                 mov     ecx, eax
  157. .text:005C8ACC                 call    sub_44FFA0
  158. .text:005C8AD1                 jmp     short loc_5C8AD5
  159. .text:005C8AD3 ; ---------------------------------------------------------------------------
  160. .text:005C8AD3
  161. .text:005C8AD3 loc_5C8AD3:                             ; CODE XREF: sub_5C8590+51Bj
  162. .text:005C8AD3                 xor     eax, eax
  163. .text:005C8AD5
  164. .text:005C8AD5 loc_5C8AD5:                             ; CODE XREF: sub_5C8590+541j
  165. .text:005C8AD5                 lea     ecx, [ebp+var_18]
  166. .text:005C8AD8                 mov     [ebp+var_18], eax
  167. .text:005C8ADB                 mov     eax, [esi+8]
  168. .text:005C8ADE                 push    ecx
  169. .text:005C8ADF                 push    1
  170. .text:005C8AE1                 push    eax
  171. .text:005C8AE2                 mov     ecx, esi
  172. .text:005C8AE4                 mov     byte ptr [ebp+var_4], 0
  173. .text:005C8AE8                 call    sub_5FE2D0
  174. .text:005C8AED                 push    34h
  175. .text:005C8AEF                 call    sub_617492
  176. .text:005C8AF4                 add     esp, 4
  177. .text:005C8AF7                 mov     [ebp+var_20], eax
  178. .text:005C8AFA                 test    eax, eax





Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 13 января 2016 09:34 · Поправил: -=AkaBOSS=-
· Личное сообщение · #15

сами изображения лежат в data\h3bitmap.lod
чем работать с ними - это уже в гугл


call sub_617492 - оператор new, выделение памяти
call sub_44FFA0 - конструктор какого-то класса. И аргументы всё-таки - прямоугольник вывода.

Залил вытащенные изображения. Ничего особо интересного они собой, как оказалось, не представляют.

Вот эти вот цветные рамки и есть эти самые PRRed.pcx и так далее.



Ранг: 0.7 (гость)
Активность: 0.010
Статус: Участник

Создано: 13 января 2016 22:16 · Поправил: KordDEM
· Личное сообщение · #16

Спасибо пнули в верном направлении, начала постепенно понимать, что происходит в коде, как строятся картинки и в каком направлении вообще пытаться плыть) Потому решил начать с начала с генерации случайной карты. Такой вопрос как понять, что за функция вызывается? В привычном ассемблере заносим номер команды в eax и на int 20h например происходит прерывание с этой командой и соответственно параметры - что в какие побочные регистры записано. А то я не особо понимаю, что за команды происходят. Например
Code:
  1. .text:0057A57B loc_57A57B:                             ; CODE XREF: sub_579CE0+897j
  2. .text:0057A57B                 push    6
  3. .text:0057A57D                 push    6
  4. .text:0057A57F                 mov     ecx, edi
  5. .text:0057A581                 mov     byte ptr [ebp+var_4], 6
  6. .text:0057A585                 call    sub_5FED80
  7. .text:0057A58A                 lea     ecx, [ebp+arg_0]
  8. .text:0057A58D                 mov     [ebp+arg_0], edi
  9. .text:0057A590                 mov     eax, [esi+8]
  10. .text:0057A593                 push    ecx
  11. .text:0057A594                 push    1
  12. .text:0057A596                 push    eax
  13. .text:0057A597                 mov     ecx, esi
  14. .text:0057A599                 call    sub_5FE2D0
  15. .text:0057A59E
  16. .text:0057A59E loc_57A59E:                             ; CODE XREF: sub_579CE0+7E4j
  17. .text:0057A59E                                         ; sub_579CE0+7FAj
  18. .text:0057A59E                 mov     edx, dword_6A5DC4
  19. .text:0057A5A4                 mov     eax, [edx+20h]
  20. .text:0057A5A7                 mov     eax, [eax+7B4h]
  21. .text:0057A5AD                 push    eax
  22. .text:0057A5AE                 push    offset aS_3     ; "%s:"
  23. .text:0057A5B3                 push    offset Text
  24. .text:0057A5B8                 call    sub_6179DE
  25. .text:0057A5BD                 push    50h
  26. .text:0057A5BF                 call    new
  27. .text:0057A5C4                 add     esp, 10h
  28. .text:0057A5C7                 mov     [ebp+ThreadId], eax
  29. .text:0057A5CA                 test    eax, eax
  30. .text:0057A5CC                 mov     byte ptr [ebp+var_4], 11h
  31. .text:0057A5D0                 jz      short loc_57A603
  32. .text:0057A5D2                 push    8
  33. .text:0057A5D4                 push    0
  34. .text:0057A5D6                 push    5
  35. .text:0057A5D8                 push    84h
  36. .text:0057A5DD                 push    2
  37. .text:0057A5DF                 push    offset aSmalfont_fnt ; "smalfont.fnt"
  38. .text:0057A5E4                 push    offset Text
  39. .text:0057A5E9                 push    13h
  40. .text:0057A5EB                 push    14Eh
  41. .text:0057A5F0                 push    1B3h
  42. .text:0057A5F5                 push    19Eh
  43. .text:0057A5FA                 mov     ecx, eax
  44. .text:0057A5FC                 call    sub_5BC6A0
  45. .text:0057A601                 jmp     short loc_57A605

Понимаю, что из файла smalfont.fnt берется строка и заливается на картинку. В данном куске и последующий 8 похожих кусках формируется подобная картинка(1) [url= ]--> Link <--[/url]Это важно т.к. тут максимально возможно создать только 8 игроков. Нужно из fnt вытащить цифру 9(она там есть) и впихнуть ее то же на картинку.
В этом месте формируются часть с флагами, тут придется изменить def файл добавив свой флаг.
Code:
  1. .text:0057AB10 loc_57AB10:                             ; CODE XREF: sub_579CE0+F09j
  2. .text:0057AB10                 push    48h
  3. .text:0057AB12                 call    new
  4. .text:0057AB17                 add     esp, 4
  5. .text:0057AB1A                 mov     [ebp+ThreadId], eax
  6. .text:0057AB1D                 test    eax, eax
  7. .text:0057AB1F                 mov     byte ptr [ebp+var_4], 1Dh
  8. .text:0057AB23                 jz      short loc_57AB54
  9. .text:0057AB25                 mov     ecx, [ebp+arg_0]
  10. .text:0057AB28                 push    10h
  11. .text:0057AB2A                 push    0
  12. .text:0057AB2C                 push    0
  13. .text:0057AB2E                 push    0
  14. .text:0057AB30                 push    0
  15. .text:0057AB32                 lea     edx, [edi-8]
  16. .text:0057AB35                 push    offset aItgflags_def ; "itgflags.def"
  17. .text:0057AB3A                 push    edx
  18. .text:0057AB3B                 push    14h
  19. .text:0057AB3D                 push    0Fh
  20. .text:0057AB3F                 add     ecx, 0FFFFFF4Ch
  21. .text:0057AB45                 push    195h
  22. .text:0057AB4A                 push    ecx
  23. .text:0057AB4B                 mov     ecx, eax
  24. .text:0057AB4D                 call    sub_4EA800
  25. .text:0057AB52                 jmp     short loc_57AB56

В этой части вроде идет подгрузка уже больших флагов тут тоже хотелось бы понять, потому объясните пожалуйста как исполняются команды в этом ассме)
Code:
  1. .text:0057B302 loc_57B302:                             ; CODE XREF: sub_579CE0+1BBBj
  2. .text:0057B302                 mov     edx, [ebp+arg_0]
  3. .text:0057B305                 lea     ecx, [ebp+var_1C0]
  4. .text:0057B30B                 movsx   eax, byte ptr [edx+edi]
  5. .text:0057B30F                 push    eax
  6. .text:0057B310                 push    offset aAoflgbC_def ; "AOFLGB%c.DEF"
  7. .text:0057B315                 push    ecx
  8. .text:0057B316                 call    sub_6179DE
  9. .text:0057B31B                 push    68h
  10. .text:0057B31D                 call    new
  11. .text:0057B322                 add     esp, 10h
  12. .text:0057B325                 mov     [ebp+ThreadId], eax
  13. .text:0057B328                 test    eax, eax
  14. .text:0057B32A                 mov     byte ptr [ebp+var_4], 30h
  15. .text:0057B32E                 jz      short loc_57B364
  16. .text:0057B330                 mov     ecx, [ebp+var_20]
  17. .text:0057B333                 push    2
  18. .text:0057B335                 push    0
  19. .text:0057B337                 push    0
  20. .text:0057B339                 push    1
  21. .text:0057B33B                 lea     edx, [ebp+var_1C0]
  22. .text:0057B341                 push    0
  23. .text:0057B343                 push    edx
  24. .text:0057B344                 mov     edx, ebx
  25. .text:0057B346                 push    edi
  26. .text:0057B347                 sub     edx, [ecx+1Ch]
  27. .text:0057B34A                 push    32h
  28. .text:0057B34C                 push    2Ah
  29. .text:0057B34E                 sub     edx, 3
  30. .text:0057B351                 push    edx
  31. .text:0057B352                 mov     edx, 0Eh
  32. .text:0057B357                 sub     edx, [ecx+18h]
  33. .text:0057B35A                 mov     ecx, eax
  34. .text:0057B35C                 push    edx
  35. .text:0057B35D                 call    sub_455BD0
  36. .text:0057B362                 jmp     short loc_57B366


f645_13.01.2016_EXELAB.rU.tgz - 1.png




Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 14 января 2016 10:59 · Поправил: -=AkaBOSS=-
· Личное сообщение · #17

KordDEM пишет:
Нужно из fnt вытащить цифру 9(она там есть) и впихнуть ее то же на картинку

Текстуры рисовать надо. Цифры на кнопках не программно заданы, а текстурами RanNum0.def, RanNum1.def и т.д до 8. Плюс если добавить еще одну, интерфейс разъедется - нужно перетасовать другие кнопки (мб размер им уменьшить или типа того).


KordDEM пишет:
объясните пожалуйста как исполняются команды в этом ассме)

вроде ж код из иды, но имена функций от чего-то не распознались

Code:
  1. mov     edx, dword ptr aRbygopts ; "RBYGOPTS"
  2. mov     eax, dword ptr aRbygopts+4
  3. mov     cl, byte ptr aRbygopts+8
  4. mov     [ebp+var_34], edx
  5. mov     [ebp+var_30], eax
  6. mov     [ebp+var_2C], cl
  7.  
  8. <skip>
  9.  
  10. ; инициализация цикла
  11. mov     edi, 107h
  12. lea     eax, [ebp+var_34]
  13. sub     eax, edi
  14. mov     ebx, 85h
  15. mov     [ebp+arg_0], eax
  16. mov     eax, offset aRbygopts_0 ; "rbygopts"
  17. sub     eax, edi
  18. mov     [ebp+var_14], eax
  19.  
  20. ; начало итерации
  21. mov     edx, [ebp+arg_0]
  22. lea     ecx, [ebp+Dest]
  23. movsx   eax, byte ptr [edx+edi]
  24. push    eax
  25. push    offset aAoflgbC_def ; "AOFLGB%c.DEF"
  26. push    ecx             ; Dest
  27. call    _sprintf
  28. push    68h             ; unsigned int
  29. call    operator new(uint)
  30. add     esp, 10h
  31. mov     [ebp+ThreadId], eax
  32. test    eax, eax
  33. mov     byte ptr [ebp+var_4], 30h
  34. jz      short loc_57B274
  35.  
  36. <skip>
  37.  
  38. ; конец итерации
  39. loc_57B79E:
  40. inc     edi
  41. add     ebx, 32h
  42. lea     edx, [edi-107h]
  43. cmp     edx, 8
  44. jl      loc_57B212


Как видно, в цикле проходит обработка по строке "rbygopts" ("RBYGOPTS"), каждый символ которой подставляется в формат "AOFLGB%c.DEF".
Таким образом обрабатываются файлы "AOFLGBR.DEF", "AOFLGBB.DEF", "AOFLGBY.DEF" и так далее.
Тоесть, достаточно добавить еще одну букву (например, Z) и тогда будет загружен соответствующий файл "AOFLGBZ.DEF"

| Сообщение посчитали полезным: KordDEM

Ранг: 0.7 (гость)
Активность: 0.010
Статус: Участник

Создано: 14 января 2016 12:23
· Личное сообщение · #18

Code:
  1. Текстуры рисовать надо.

Да сегодня чуть, ниже опустился тоже нашел этот момент. Тогда вопрос - зачем нужен файл "smalfont.fnt" и что за строки он подгружает? Нужно ли как-то от него ожидать подлянки? Попробую с текстурами к вечеру разобраться и попробовать что выйдет, отпишусь о результатах чуть позже.



Ранг: 4.1 (гость)
Активность: 0.010
Статус: Участник

Создано: 14 января 2016 12:40
· Личное сообщение · #19

smalfont.fnt это файл со шрифтами.



Ранг: 0.7 (гость)
Активность: 0.010
Статус: Участник

Создано: 14 января 2016 14:06
· Личное сообщение · #20

Файлики с текстурами сделал, залил в ресурсы, теперь возник такой вопрос. После того как отобразили RanNum8.def нам нужно переделать jmp не на тот кусок где загрузка RanRand.def идет, а вставить свой кусок кода аналогичный предыдущим с загрузкой RanNum9.def и только после него делать прыжок на загрузку RanRand.def.
В WinHex можно вроде бы только редактировать какие-то отдельные участки вставлять какой-то дополнительный код не получится.




Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 14 января 2016 14:42 · Поправил: -=AkaBOSS=-
· Личное сообщение · #21

KordDEM пишет:
В WinHex можно вроде бы только редактировать какие-то отдельные участки вставлять какой-то дополнительный код не получится.

Не, просто так винхексом лучше не лезть. Есть такие понятия как PEформат, секции и прочее. Расписывать с нуля утомительно, мб кто-нибудь туторы порекомендует?

И к тому же, мало просто скопировать код. Опуская лишние детали, кнопки создаются вот так:
Code:
  1. new defTexture ( 70, 153, 30, 32, 287, "RanNum1.def", 0, 1, 0, 0, 2)
  2. new defTexture (102, 153, 30, 32, 288, "RanNum2.def", 0, 1, 0, 0, 2)
  3. new defTexture (134, 153, 30, 32, 289, "RanNum3.def", 0, 1, 0, 0, 2)
  4. new defTexture (166, 153, 30, 32, 290, "RanNum4.def", 0, 1, 0, 0, 2)
  5. new defTexture (198, 153, 30, 32, 291, "RanNum5.def", 0, 1, 0, 0, 2)
  6. new defTexture (230, 153, 30, 32, 292, "RanNum6.def", 0, 1, 0, 0, 2)
  7. new defTexture (262, 153, 30, 32, 293, "RanNum7.def", 0, 1, 0, 0, 2)
  8. new defTexture (294, 153, 30, 32, 294, "RanNum8.def", 0, 1, 0, 0, 2)
  9. new defTexture (326, 153, 55, 32, 295, "RanRand.def", 0, 1, 0, 0, 2)
  10.  
  11. new defTexture ( 70, 219, 30, 32, 297, "RanNum0.def", 0, 1, 0, 0, 2)
  12. new defTexture (102, 219, 30, 24, 298, "RanNum1.def", 0, 1, 0, 0, 2)
  13. new defTexture (134, 219, 30, 24, 299, "RanNum2.def", 0, 1, 0, 0, 2)
  14. new defTexture (166, 219, 30, 32, 300, "RanNum3.def", 0, 1, 0, 0, 2)
  15. new defTexture (198, 219, 30, 32, 301, "RanNum4.def", 0, 1, 0, 0, 2)
  16. new defTexture (230, 219, 30, 32, 302, "RanNum5.def", 0, 1, 0, 0, 2)
  17. new defTexture (262, 219, 30, 32, 303, "RanNum6.def", 0, 1, 0, 0, 2)
  18. new defTexture (294, 219, 30, 32, 304, "RanNum7.def", 0, 1, 0, 0, 2)
  19. new defTexture (326, 219, 55, 32, 305, "RanRand.def", 0, 1, 0, 0, 2)
  20.  
  21. new defTexture ( 70, 285, 30, 32, 307, "RanNum0.def", 0, 1, 0, 0, 2)
  22. new defTexture (102, 285, 30, 32, 308, "RanNum1.def", 0, 1, 0, 0, 2)
  23. new defTexture (134, 285, 30, 32, 309, "RanNum2.def", 0, 1, 0, 0, 2)
  24. new defTexture (166, 285, 30, 32, 310, "RanNum3.def", 0, 1, 0, 0, 2)
  25. new defTexture (198, 285, 30, 32, 311, "RanNum4.def", 0, 1, 0, 0, 2)
  26. new defTexture (230, 285, 30, 32, 312, "RanNum5.def", 0, 1, 0, 0, 2)
  27. new defTexture (262, 285, 30, 32, 313, "RanNum6.def", 0, 1, 0, 0, 2)
  28. new defTexture (294, 285, 30, 32, 314, "RanNum7.def", 0, 1, 0, 0, 2)
  29. new defTexture (326, 285, 55, 32, 315, "RanRand.def", 0, 1, 0, 0, 2)
  30.  
  31. new defTexture ( 70, 351, 30, 32, 317, "RanNum0.def", 0, 1, 0, 0, 2)
  32. new defTexture (102, 351, 30, 32, 318, "RanNum1.def", 0, 1, 0, 0, 2)
  33. new defTexture (134, 351, 30, 32, 319, "RanNum2.def", 0, 1, 0, 0, 2)
  34. new defTexture (166, 351, 30, 32, 320, "RanNum3.def", 0, 1, 0, 0, 2)
  35. new defTexture (198, 351, 30, 32, 321, "RanNum4.def", 0, 1, 0, 0, 2)
  36. new defTexture (230, 351, 30, 32, 322, "RanNum5.def", 0, 1, 0, 0, 2)
  37. new defTexture (262, 351, 30, 32, 323, "RanNum6.def", 0, 1, 0, 0, 2)
  38. new defTexture (326, 351, 55, 32, 324, "RanRand.def", 0, 1, 0, 0, 2)
  39.  

Большую часть аргументов можно понять интуитивно:
Первые четыре - это координаты x и y, ширина и высота. Нужно скорректировать координаты и размеры элементов, чтобы новая кнопка не оказалась под/над какой-либо из существующих.

Пятый аргумент - уникальный идентификатор, который, вероятней всего, участвует в определении кода, выполняющегося по нажатию кнопки.
В конкретном случае, ничего особенно умного происходить не должно - кнопка переключается в состояние "нажата", а все остальные кнопки в ряду переключаются в состояние по умолчанию.
Возможно, также переключится какая-то внутренняя переменная, которая будет использована при нажатии кнопки "Начать" - и нужно будет убедиться, что код там готов обработать значение этой переменной.



Ранг: 0.7 (гость)
Активность: 0.010
Статус: Участник

Создано: 14 января 2016 15:05 · Поправил: KordDEM
· Личное сообщение · #22

-=AkaBOSS=- пишет:
Есть такие понятия как PE формат, секции и прочее.

Знаю, что это такое. Каким образом этим воспользоваться в данном случае?о-о

-=AkaBOSS=- пишет:
Пятый аргумент - уникальный идентификатор, который, вероятней всего, участвует в определении кода, выполняющегося по нажатию кнопки.

Постараюсь за этим проследить. Последние 5 параметров какую роль играют?




Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 14 января 2016 15:25
· Личное сообщение · #23

KordDEM пишет:
Каким образом этим воспользоваться в данном случае?

Так как весь гуй намертво вбит в код, патчей всё равно будет дофигища. В связи с этим, я предлагаю создать новую секцию, и писать код туда.

KordDEM пишет:
Последние 5 параметров какую роль играют?

Без понятия, и разбираться нет особой нужды. Так как у всех кнопок они одинаковы - можно оставить как есть



Ранг: 0.7 (гость)
Активность: 0.010
Статус: Участник

Создано: 15 января 2016 14:31 · Поправил: KordDEM
· Личное сообщение · #24

Вообщем результаты и вопросы.)
Поигрался с параметрами, вообщем первые два параметра вы были правы x,y относительно которых загружается картинка. Вторые 2 параметры высота и ширина площади на которую происходит нажатие. Пятый параметр какой-то очень важный попробовал воткнуть на место первой кнопки идентификатор от второй - краш программы. Результат того, что в итоге получилось

Теперь вопрос) Секцию в PE файле создал, как мне теперь в эту секцию загрузить свой код? И в каком виде должен быть код? в таком же как я в IDE его вижу? Т.е. что-то типа:
Code:
  1. loc_57D71B:  //соответственно другое имя метки                            
  2. xor     eax, eax
  3. loc_57D71D:                   // и тут другое          
  4. lea     ecx, [ebp+var_20]
  5. mov     [ebp+var_20], eax
  6. mov     eax, [esi+8]
  7. push    ecx
  8. push    1
  9. push    eax
  10. mov     ecx, esi
  11. mov     [ebp+var_4], 0FFFFFFFFh
  12. call    sub_5FE2D0
  13. push    68h
  14. call    new
  15. add     esp, 4
  16. mov     [ebp+var_28], eax
  17. cmp     eax, edi
  18. mov     [ebp+var_4], 7
  19. jz      short loc_57D775 //и тут надо будет поменять на нужное
  20. push    2
  21. push    edi
  22. push    edi
  23. push    1
  24. push    edi
  25. push    offset aRannum1_def ; "RanNum9.def"
  26. push    11Fh
  27. push    20h
  28. push    1Eh
  29. push    99h
  30. push    46h
  31. mov     ecx, eax
  32. call    sub_455BD0          // здесь все остается такое же поскольку эта функция вызывается во всех подобных местах 
  33. jmp     short loc_57D777 //и тут 


или в другом?
Вот тут пример функции в которую передаются все параметры:

Code:
  1. .text:00455BD0 var_10          = dword ptr -10h
  2. .text:00455BD0 var_C           = dword ptr -0Ch
  3. .text:00455BD0 var_4           = dword ptr -4
  4. .text:00455BD0 arg_0           = dword ptr  8
  5. .text:00455BD0 arg_4           = dword ptr  0Ch
  6. .text:00455BD0 arg_8           = dword ptr  10h
  7. .text:00455BD0 arg_C           = dword ptr  14h
  8. .text:00455BD0 arg_10          = dword ptr  18h
  9. .text:00455BD0 arg_14          = dword ptr  1Ch
  10. .text:00455BD0 arg_18          = dword ptr  20h
  11. .text:00455BD0 arg_1C          = dword ptr  24h
  12. .text:00455BD0 arg_20          = dword ptr  28h
  13. .text:00455BD0 arg_24          = dword ptr  2Ch
  14. .text:00455BD0 arg_28          = dword ptr  30h
  15. .text:00455BD0
  16. .text:00455BD0                 push    ebp
  17. .text:00455BD1                 mov     ebp, esp
  18. .text:00455BD3                 push    0FFFFFFFFh
  19. .text:00455BD5                 push    offset SEH_455BD0
  20. .text:00455BDA                 mov     eax, large fs:0
  21. .text:00455BE0                 push    eax
  22. .text:00455BE1                 mov     large fs:0, esp
  23. .text:00455BE8                 push    ecx
  24. .text:00455BE9                 mov     eax, [ebp+arg_28]
  25. .text:00455BEC                 mov     edx, [ebp+arg_C]
  26. .text:00455BEF                 push    ebx
  27. .text:00455BF0                 mov     ebx, ecx
  28. .text:00455BF2                 mov     ecx, [ebp+arg_10]
  29. .text:00455BF5                 push    esi
  30. .text:00455BF6                 push    edi
  31. .text:00455BF7                 push    eax
  32. .text:00455BF8                 mov     eax, [ebp+arg_8]
  33. .text:00455BFB                 push    ecx
  34. .text:00455BFC                 mov     ecx, [ebp+arg_4]
  35. .text:00455BFF                 push    edx
  36. .text:00455C00                 mov     edx, [ebp+arg_0]
  37. .text:00455C03                 push    eax
  38. .text:00455C04                 push    ecx
  39. .text:00455C05                 push    edx
  40. .text:00455C06                 mov     ecx, ebx
  41. .text:00455C08                 mov     [ebp+var_10], ebx
  42. .text:00455C0B                 call    sub_5FE900
  43. .text:00455C10                 mov     al, byte ptr [ebp+arg_20+3]
  44. .text:00455C13                 lea     esi, [ebx+48h]
  45. .text:00455C16                 xor     ecx, ecx
  46. .text:00455C18                 mov     [ebp+var_4], ecx
  47. .text:00455C1B                 mov     [esi], al
  48. .text:00455C1D                 mov     [esi+4], ecx
  49. .text:00455C20                 mov     [esi+8], ecx
  50. .text:00455C23                 mov     [esi+0Ch], ecx
  51. .text:00455C26                 mov     dl, byte ptr [ebp+arg_20+3]
  52. .text:00455C29                 mov     [ebx+5Ch], ecx
  53. .text:00455C2C                 mov     [ebx+58h], dl
  54. .text:00455C2F                 mov     [ebx+60h], ecx
  55. .text:00455C32                 mov     [ebx+64h], ecx
  56. .text:00455C35                 mov     edx, [ebp+arg_1C]
  57. .text:00455C38                 mov     eax, 2
  58. .text:00455C3D                 mov     byte ptr [ebp+var_4], al
  59. .text:00455C40                 mov     [ebx+3Ch], eax
  60. .text:00455C43                 mov     eax, [ebp+arg_18]
  61. .text:00455C46                 mov     dword ptr [ebx], offset off_63BB54
  62. .text:00455C4C                 mov     [ebx+34h], eax
  63. .text:00455C4F                 mov     al, byte ptr [ebp+arg_20]
  64. .text:00455C52                 mov     [ebx+38h], edx
  65. .text:00455C55                 mov     dword ptr [ebx+40h], 3
  66. .text:00455C5C                 mov     [ebx+44h], al
  67. .text:00455C5F                 mov     eax, [esi+8]
  68. .text:00455C62                 mov     edx, [esi+0Ch]
  69. .text:00455C65                 mov     edi, eax
  70. .text:00455C67                 sub     edx, eax
  71. .text:00455C69                 sar     edx, 2
  72. .text:00455C6C                 cmp     edx, 1
  73. .text:00455C6F                 jnb     loc_455D1E
  74. .text:00455C75                 mov     edx, [esi+4]
  75. .text:00455C78                 cmp     edx, ecx
  76. .text:00455C7A                 jz      short loc_455C89
  77. .text:00455C7C                 sub     eax, edx
  78. .text:00455C7E                 sar     eax, 2
  79. .text:00455C81                 cmp     eax, 1
  80. .text:00455C84                 mov     [ebp+arg_20], eax
  81. .text:00455C87                 ja      short loc_455C90
  82. .text:00455C89
  83. .text:00455C89 loc_455C89:                             ; CODE XREF: sub_455BD0+AAj
  84. .text:00455C89                 mov     [ebp+arg_20], 1
  85. .text:00455C90
  86. .text:00455C90 loc_455C90:                             ; CODE XREF: sub_455BD0+B7j
  87. .text:00455C90                 mov     ecx, esi
  88. .text:00455C92                 call    sub_54D2B0
  89. .text:00455C97                 add     eax, [ebp+arg_20]
  90. .text:00455C9A                 mov     [ebp+arg_10], eax
  91. .text:00455C9D                 jns     short loc_455CA1
  92. .text:00455C9F                 xor     eax, eax
  93. .text:00455CA1
  94. .text:00455CA1 loc_455CA1:                             ; CODE XREF: sub_455BD0+CDj
  95. .text:00455CA1                 shl     eax, 2
  96. .text:00455CA4                 push    eax
  97. .text:00455CA5                 call    new
  98. .text:00455CAA                 mov     ecx, [esi+4]
  99. .text:00455CAD                 add     esp, 4
  100. .text:00455CB0                 mov     [ebp+arg_28], eax
  101. .text:00455CB3                 push    eax
  102. .text:00455CB4                 push    edi
  103. .text:00455CB5                 push    ecx
  104. .text:00455CB6                 mov     ecx, esi
  105. .text:00455CB8                 call    sub_4232E0
  106. .text:00455CBD                 lea     edx, [ebp+arg_24]
  107. .text:00455CC0                 mov     ecx, esi
  108. .text:00455CC2                 push    edx
  109. .text:00455CC3                 push    1
  110. .text:00455CC5                 push    eax
  111. .text:00455CC6                 mov     [ebp+arg_20], eax
  112. .text:00455CC9                 call    sub_423310
  113. .text:00455CCE                 mov     eax, [ebp+arg_20]
  114. .text:00455CD1                 mov     ecx, [esi+8]
  115. .text:00455CD4                 add     eax, 4
  116. .text:00455CD7                 push    eax
  117. .text:00455CD8                 push    ecx
  118. .text:00455CD9                 push    edi
  119. .text:00455CDA                 mov     ecx, esi
  120. .text:00455CDC                 call    sub_4232E0
  121. .text:00455CE1                 mov     edx, [esi+8]
  122. .text:00455CE4                 mov     eax, [esi+4]
  123. .text:00455CE7                 push    edx
  124. .text:00455CE8                 push    eax
  125. .text:00455CE9                 mov     ecx, esi
  126. .text:00455CEB                 call    nullsub_4
  127. .text:00455CF0                 mov     ecx, [esi+4]
  128. .text:00455CF3                 push    ecx
  129. .text:00455CF4                 call    sub_60B0F0
  130. .text:00455CF9                 mov     edi, [ebp+arg_28]
  131. .text:00455CFC                 mov     edx, [ebp+arg_10]
  132. .text:00455CFF                 add     esp, 4
  133. .text:00455D02                 mov     ecx, esi
  134. .text:00455D04                 lea     eax, [edi+edx*4]
  135. .text:00455D07                 mov     [esi+0Ch], eax
  136. .text:00455D0A                 call    sub_54D2B0
  137. .text:00455D0F                 lea     ecx, [edi+eax*4+4]
  138. .text:00455D13                 mov     [esi+4], edi
  139. .text:00455D16                 mov     [esi+8], ecx
  140. .text:00455D19                 jmp     loc_455DA7
  141. .text:00455D1E ; ---------------------------------------------------------------------------
  142. .text:00455D1E
  143. .text:00455D1E loc_455D1E:                             ; CODE XREF: sub_455BD0+9Fj
  144. .text:00455D1E                 mov     edx, eax
  145. .text:00455D20                 sub     edx, edi
  146. .text:00455D22                 sar     edx, 2
  147. .text:00455D25                 cmp     edx, 1
  148. .text:00455D28                 jnb     short loc_455D6A
  149. .text:00455D2A                 lea     ecx, [edi+4]
  150. .text:00455D2D                 push    ecx
  151. .text:00455D2E                 push    eax
  152. .text:00455D2F                 push    edi
  153. .text:00455D30                 mov     ecx, esi
  154. .text:00455D32                 call    sub_4232E0
  155. .text:00455D37                 mov     eax, [esi+8]
  156. .text:00455D3A                 lea     edx, [ebp+arg_24]
  157. .text:00455D3D                 mov     ecx, eax
  158. .text:00455D3F                 push    edx
  159. .text:00455D40                 sub     ecx, edi
  160. .text:00455D42                 mov     edx, 1
  161. .text:00455D47                 sar     ecx, 2
  162. .text:00455D4A                 sub     edx, ecx
  163. .text:00455D4C                 mov     ecx, esi
  164. .text:00455D4E                 push    edx
  165. .text:00455D4F                 push    eax
  166. .text:00455D50                 call    sub_423310
  167. .text:00455D55                 mov     eax, [esi+8]
  168. .text:00455D58                 cmp     edi, eax
  169. .text:00455D5A                 jz      short loc_455DA3




Ранг: 0.7 (гость)
Активность: 0.010
Статус: Участник

Создано: 15 января 2016 14:39 · Поправил: KordDEM
· Личное сообщение · #25

Продолжение
Code:
  1. loc_455D5C:                             ; CODE XREF: sub_455BD0+196j
  2. .text:00455D5C                 mov     ecx, [ebp+arg_24]
  3. .text:00455D5F                 mov     [edi], ecx
  4. .text:00455D61                 add     edi, 4
  5. .text:00455D64                 cmp     edi, eax
  6. .text:00455D66                 jnz     short loc_455D5C
  7. .text:00455D68                 jmp     short loc_455DA3
  8. .text:00455D6A ; ---------------------------------------------------------------------------
  9. .text:00455D6A
  10. .text:00455D6A loc_455D6A:                             ; CODE XREF: sub_455BD0+158j
  11. .text:00455D6A                 push    eax
  12. .text:00455D6B                 push    eax
  13. .text:00455D6C                 add     eax, 0FFFFFFFCh
  14. .text:00455D6F                 mov     ecx, esi
  15. .text:00455D71                 push    eax
  16. .text:00455D72                 call    sub_4232E0
  17. .text:00455D77                 mov     ecx, [esi+8]
  18. .text:00455D7A                 lea     eax, [ecx-4]
  19. .text:00455D7D                 cmp     edi, eax
  20. .text:00455D7F                 jz      short loc_455D90
  21. .text:00455D81
  22. .text:00455D81 loc_455D81:                             ; CODE XREF: sub_455BD0+1BEj
  23. .text:00455D81                 mov     edx, [eax-4]
  24. .text:00455D84                 sub     eax, 4
  25. .text:00455D87                 sub     ecx, 4
  26. .text:00455D8A                 cmp     eax, edi
  27. .text:00455D8C                 mov     [ecx], edx
  28. .text:00455D8E                 jnz     short loc_455D81
  29. .text:00455D90
  30. .text:00455D90 loc_455D90:                             ; CODE XREF: sub_455BD0+1AFj
  31. .text:00455D90                 lea     eax, [edi+4]
  32. .text:00455D93                 cmp     edi, eax
  33. .text:00455D95                 jz      short loc_455DA3
  34. .text:00455D97
  35. .text:00455D97 loc_455D97:                             ; CODE XREF: sub_455BD0+1D1j
  36. .text:00455D97                 mov     ecx, [ebp+arg_24]
  37. .text:00455D9A                 mov     [edi], ecx
  38. .text:00455D9C                 add     edi, 4
  39. .text:00455D9F                 cmp     edi, eax
  40. .text:00455DA1                 jnz     short loc_455D97
  41. .text:00455DA3
  42. .text:00455DA3 loc_455DA3:                             ; CODE XREF: sub_455BD0+18Aj
  43. .text:00455DA3                                         ; sub_455BD0+198j ...
  44. .text:00455DA3                 add     dword ptr [esi+8], 4
  45. .text:00455DA7
  46. .text:00455DA7 loc_455DA7:                             ; CODE XREF: sub_455BD0+149j
  47. .text:00455DA7                 mov     ecx, [ebp+arg_14]
  48. .text:00455DAA                 call    sub_55C9C0
  49. .text:00455DAF                 mov     ecx, [ebp+var_C]
  50. .text:00455DB2                 mov     [ebx+30h], eax
  51. .text:00455DB5                 pop     edi
  52. .text:00455DB6                 mov     eax, ebx
  53. .text:00455DB8                 pop     esi
  54. .text:00455DB9                 pop     ebx
  55. .text:00455DBA                 mov     large fs:0, ecx
  56. .text:00455DC1                 mov     esp, ebp
  57. .text:00455DC3                 pop     ebp
  58. .text:00455DC4                 retn    2Ch
  59. .text:00455DC4 sub_455BD0      endp

Передаются все параметры вот сюда, что происходит я не понял, но имеет такой вид
funct_name(x,y,ширина, важный параметр, высота, 2)
Code:
  1. .text:005FE900 sub_5FE900      proc near               ; CODE XREF: sub_44FBE0+20p
  2. .text:005FE900                                         ; sub_455BD0+3Bp ...
  3. .text:005FE900
  4. .text:005FE900 arg_0           = word ptr  8
  5. .text:005FE900 arg_4           = word ptr  0Ch
  6. .text:005FE900 arg_8           = word ptr  10h
  7. .text:005FE900 arg_C           = word ptr  14h
  8. .text:005FE900 arg_10          = word ptr  18h
  9. .text:005FE900 arg_14          = word ptr  1Ch
  10. .text:005FE900
  11. .text:005FE900                 push    ebp
  12. .text:005FE901                 mov     ebp, esp
  13. .text:005FE903                 mov     dx, [ebp+arg_0]
  14. .text:005FE907                 mov     eax, ecx
  15. .text:005FE909                 xor     ecx, ecx
  16. .text:005FE90B                 mov     [eax+18h], dx
  17. .text:005FE90F                 mov     dx, [ebp+arg_4]
  18. .text:005FE913                 mov     [eax+1Ah], dx
  19. .text:005FE917                 mov     dx, [ebp+arg_8]
  20. .text:005FE91B                 mov     [eax+1Ch], dx
  21. .text:005FE91F                 mov     dx, [ebp+arg_C]
  22. .text:005FE923                 mov     [eax+1Eh], dx
  23. .text:005FE927                 mov     dx, [ebp+arg_10]
  24. .text:005FE92B                 mov     [eax+10h], dx
  25. .text:005FE92F                 mov     dx, [ebp+arg_14]
  26. .text:005FE933                 mov     [eax+2Ch], ecx
  27. .text:005FE936                 mov     dword ptr [eax], offset off_643CA0
  28. .text:005FE93C                 mov     [eax+4], ecx
  29. .text:005FE93F                 mov     [eax+8], ecx
  30. .text:005FE942                 mov     [eax+0Ch], ecx
  31. .text:005FE945                 mov     word ptr [eax+16h], 6
  32. .text:005FE94B                 mov     word ptr [eax+12h], 0FFFFh
  33. .text:005FE951                 mov     [eax+14h], dx
  34. .text:005FE955                 mov     [eax+20h], ecx
  35. .text:005FE958                 mov     [eax+24h], ecx
  36. .text:005FE95B                 mov     [eax+28h], cl
  37. .text:005FE95E                 pop     ebp
  38. .text:005FE95F                 retn    18h
  39. .text:005FE95F sub_5FE900      endp





Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 16 января 2016 01:07 · Поправил: -=AkaBOSS=-
· Личное сообщение · #26

KordDEM пишет:
пример функции в которую передаются все параметры

я ведь тоже в модуль смотрю) другая версия, но код я всё-таки вижу

как мне теперь в эту секцию загрузить свой код?
Ну смотри в заголовок секции - там (должны быть) чётко описаны границы адресного пространства, как файлового, так и виртуального.
Пишем в файловое пространство, а адреса считаем по виртуальному. Вроде несложно.

И в каком виде должен быть код? в таком же как я в IDE его вижу?
Для начала - в предоставленном коде неправильно выделен блок кода, ответственный за создание кнопки.
После ветвления есть еще код, сохраняющий полученное значение. Он расположен ПОСЛЕ ветвления и ПЕРЕД следующим вызовом new:
Code:
  1. ; это после кнопки 1
  2. push    68h
  3. mov     [ebp+var_4], 0FFFFFFFFh
  4. mov     [ebx+18C0h], eax    ; <<< вот оно, сохраняется либо результат конструктора, либо 0
  5. call    operator new(uint)
  6.  
  7. ; это после кнопки 2
  8. push    68h
  9. mov     [ebp+var_4], 0FFFFFFFFh
  10. mov     [ebx+18C4h], eax    ; <<< опять
  11. call    operator new(uint)
  12.  
  13. ; и так далее...


И вот тут начинается САМОЕ интересное) Код-то вписать несложно, а вот заставить его работать - уже проблема.

Дело в том, что процедура создающая кнопки - всего лишь метод какого-то класса, и все создаваемые кнопки она сохраняется в переменных своего класса.
в начале процедуры можно заметить
Code:
  1. ; сохранение this, тоесть далее в ebx находится указатель на свой объект
  2. mov     ebx, ecx  


таким образом, код создания кнопки выглядит примерно так:
Code:
  1.   push    68h    ; размер объекта кнопки
  2.   call    new    ; выделяется память
  3.   add     esp, 4 ; очистка стэка, потомушто CDECL
  4.   mov     [ebp+var_28], eax   ; затирается, можно пропустить
  5.   cmp     eax, edi  ; можно и с нулём сравнивать - без разницы
  6.   mov     [ebp+var_4], 8    ; компиляторная метка, означает строку в исходнике. можно пропустить
  7.   jz lbl_1
  8.  
  9.   push    2
  10.   push    edi     ; 0
  11.   push    edi     ; 0
  12.   push    1
  13.   push    edi     ; 0
  14.   push    "RanNum9.def"
  15.   push    идентификатор
  16.   push    высота
  17.   push    ширина
  18.   push    позиция_вертикаль
  19.   push    позиция_горизонталь
  20.   mov     ecx, eax          ; полученная после new память теперь будет новым объектом
  21.   call    CButton::CButton  ; конструктор короч
  22.  
  23.  
  24.   jmp lbl_2
  25.  
  26. lbl_1:
  27.  ; можно и скипнуть этот момент, ведь когда управление сюда приходит, в eax и так уже 0...
  28.   xor eax, eax
  29.  
  30. lbl_2:
  31.   mov     [ebp+var_4], -1    ; номер строки, теперь сбрасывается - можно пропустить
  32.   mov     [ebx+переменная_класса], eax
  33.  


Как видим, самая главная проблема теперь - это как внедрить свою переменную в класс, не развалив его к чертям?
Нужно определить, каким образом эти кнопки используются в дальнейшем (ну в деструкторе, это понятное дело - освобождение занятого идентификатора и всё такое).

Добавлено спустя 1 час 45 минут
Code:
  1. ; так сохраняются кнопки после создания
  2. ; как видно, сохраняются в памяти строго последовательно,
  3. ; получается массив из 9 указателей на классы кнопок
  4. mov     [ebx+18C0h], eax    ; кнопка 1
  5. mov     [ebx+18C4h], eax    ; кнопка 2
  6. mov     [ebx+18C8h], eax    ; кнопка 3
  7. mov     [ebx+18CCh], eax    ; кнопка 4
  8. mov     [ebx+18D0h], eax    ; кнопка 5
  9. mov     [ebx+18D4h], eax    ; кнопка 6
  10. mov     [ebx+18D8h], eax    ; кнопка 7
  11. mov     [ebx+18DCh], eax    ; кнопка 8
  12. mov     [ebx+18E0h], eax    ; кнопка рандом


и сразу после кнопки "рандом" начинается цикл
Code:
  1. lea     edi, [ebx+18C0h]    ; начало массива
  2. mov     [ebp+var_18], 9     ; размер массива, количество итераций цикла
  3.  
  4. lbl_1:
  5. mov     eax, [edi]
  6. lea     ecx, [ebp+var_20]
  7. push    ecx
  8. push    1
  9. mov     dword ptr [eax+40h], 2
  10. mov     eax, [edi]
  11. mov     ecx, esi
  12. mov     dword ptr [eax+3Ch], 1
  13. mov     eax, [esi+8]
  14. mov     edx, [edi]
  15. push    eax
  16. mov     [ebp+var_20], edx
  17. call    sub_4347D0
  18. mov     eax, [ebp+var_18]
  19. add     edi, 4              ; переход на следующий элемент массива
  20. dec     eax
  21. mov     [ebp+var_18], eax
  22. jnz     lbl_1


Тело цикла особого интереса не представляет, важен сам факт обработки.
На этой точке нужно понимать, что так или иначе, виртуальный размер класса придётся увеличивать.
Есть два варианта - либо увеличить его на одну переменную, либо на весь массив.
В первом варианте - встраиваем одну переменную (в конец, разумеется), и используем её для сохранения указателя.
Тогда, после создания кнопки, нужно еще сделать соответствующий вызов того, что у меня обозначено как sub_4347D0.
Во втором варианте - весь массив из десяти (с добавленной) кнопок переносим в конец класса.
Это позволит использовать тот же цикл, только на десять итераций. Минус - нужно еще отследить все обращения к полям и поправить их.




Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 17 января 2016 04:09 · Поправил: -=AkaBOSS=-
· Личное сообщение · #27

покопал еще немного.. я бы сказал, что расширение класса - задача крайне неприятная
Во всех местах, где используется этот код, присутствует примерно такое:
Code:
  1. ; выделение стэкового пространства под локальные переменные в начале процедуры
  2. mov     eax, 1970h
  3. call    __alloca_probe
  4.  
  5. push    1
  6. lea     ecx, [ebp+var_197C]
  7. call    sub_579BF0  ; тут, собственно, создаётся гуй, в т.ч. и тот что мы пытаемся исправить
  8.  
  9. lea     ecx, [ebp+var_197C]
  10. call    sub_584DF0
  11.  
  12. lea     ecx, [ebp+var_197C]
  13. call    sub_583D40

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

ЗЫ. тю блин, я думал пост подклеится.. видать много времени прошло

KordDEM
Сложно? А ведь это еще даже до игровой механики (очередность ходов, захват объектов, сетевой протокол) не добрались. А там такой радости будет хоть отбавляй. Игрушка писалась во времена, когда движки оптимизировали намного лучше чем сейчас, в следствие чего нет кучи динамически разбираемых конфигов и XML схем - везде константы и хардкод. Может быть, лучше выбрать другую цель?



Ранг: 0.7 (гость)
Активность: 0.010
Статус: Участник

Создано: 18 января 2016 09:59
· Личное сообщение · #28

-=AkaBOSS=- пишет:
Нужно определить, каким образом эти кнопки используются в дальнейшем (ну в деструкторе, это понятное дело - освобождение занятого идентификатора и всё такое).

Добавлено спустя 1 час 45 минут
Code:
; так сохраняются кнопки после создания
; как видно, сохраняются в памяти строго последовательно,
; получается массив из 9 указателей на классы кнопок
mov     [ebx+18C0h], eax    ; кнопка 1
mov     [ebx+18C4h], eax    ; кнопка 2
mov     [ebx+18C8h], eax    ; кнопка 3
mov     [ebx+18CCh], eax    ; кнопка 4
mov     [ebx+18D0h], eax    ; кнопка 5
mov     [ebx+18D4h], eax    ; кнопка 6
mov     [ebx+18D8h], eax    ; кнопка 7
mov     [ebx+18DCh], eax    ; кнопка 8
mov     [ebx+18E0h], eax    ; кнопка рандом


и сразу после кнопки "рандом" начинается цикл


Я так понимаю после кнопки рандом у нас следующая строка располагается?(Другой ряд кнопок)
Так что пихать придется в после всего.
А если опустим просто запилить туда кнопку пока без действия?
-=AkaBOSS=- пишет:
Сложно? А ведь это еще даже до игровой механики (очередность ходов, захват объектов, сетевой протокол) не добрались.

Понимаю, что сложно было бы легко. я б в одного это все делал) Мб стоит тогда и начать с очередности ходов и захвата объектов?) Если так проще будет) Правда, если объекты у нас создаются в этом месте, то исправлять все равно придется)

-=AkaBOSS=- пишет:
Может быть, лучше выбрать другую цель?

Если честно, не знаю, что там можно еще поправить)

Добавлено спустя 27 минут
-=AkaBOSS=- пишет:
Ну смотри в заголовок секции - там (должны быть) чётко описаны границы адресного пространства, как файлового, так и виртуального.
Пишем в файловое пространство, а адреса считаем по виртуальному

Не про то не много спросил. Как записать в секцию свой код. Это имелось ввиду)




Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 18 января 2016 10:35
· Личное сообщение · #29

KordDEM пишет:
А если опустим просто запилить туда кнопку пока без действия?

А смысл? Тем более, что до действий мы еще и не дошли - всё вышеописанное нужно только для того, чтобы интерфейс корректно создавался и уничтожался.

KordDEM пишет:
Мб стоит тогда и начать с очередности ходов и захвата объектов?) Если так проще будет)

нет, там всё только сложнее будет (скорей всего, не смотрел)

KordDEM пишет:
Если честно, не знаю, что там можно еще поправить)

я имел в виду другую игру) более дружественную для низкоуровневого мододельства.

KordDEM пишет:
Как записать в секцию свой код. Это имелось ввиду)

Берём код и пишем в секцию, любым удобным способом. Пусть даже и винхексом. При желании можно прямо в ольке писать.



Ранг: 0.7 (гость)
Активность: 0.010
Статус: Участник

Создано: 18 января 2016 13:06
· Личное сообщение · #30

Код тогда мб так выглядит?
Code:
  1. push    68h
  2. mov     [ebp+var_4], 0FFFFFFFFh
  3. mov     [ebx+var_28], eax ; сохранение кнопки
  4. call    new
  5. add     esp, 4
  6. mov     [ebp+var_28], eax
  7. cmp     eax, edi
  8. mov     [ebp+var_4], 9  ; видимо можно пропустить
  9. jz      label_1
  10. push    2
  11. push    edi
  12. push    edi
  13. push    1
  14. push    edi
  15. push    "RanNum9.def"
  16. push     id
  17. push    width
  18. push    height
  19. push    y
  20. push    x
  21. mov     ecx, eax
  22. call    sub_455BD0
  23. jmp     jmp label_2

Там кст кнопки после цикла(которая после кнопки рандом), надо будет добавлять вызов какой-нибудь своей проверки, что б тоже учитывался.
-=AkaBOSS=- пишет:
При желании можно прямо в ольке писать.

У меня там адреса какие-то не очень отображаются) Не понятно куда писать)


. 1 . 2 . >>
 eXeL@B —› Крэки, обсуждения —› Исследование Heroes 3
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати