Jump to content
Korean Random
StranikS_Scan

PjOrion - редактирование, компиляция, декомпиляция, обфускация модов (Версия: 1.3.5 Дата: 11.08.2019)

Пользуетесь ли вы Орионом?  

314 members have voted

You do not have permission to vote in this poll, or see the poll results. Please sign in or register to vote in this poll.

Recommended Posts

Это чего?

Оно еще и скроллится)

Черный прямоугольник Страникса)

Edited by ShadowHunterRUS

Share this post


Link to post

Short link
Share on other sites

super(_GlobalCtx, self).__init__() так и не понял, зачем это нужно, когда наследования нет.

Если идет наследование от object, то вызов super() необходим для адекватного выполнения кода при множественном наследовании. Тоже одно время потратил приличное время в поиске бага, оказалось просто надо было проставить везде на перегрузках (там где происходит переопределение метода класса-родителя) super(). Хотя прямой логики вроде и нет. Но без него работает некорректно (вызывается только метод одного из родителей при множественном наследовании).

Для юзверских модов не особо актуально, ибо классы (а уж тем более наследование, и уж тем более множественное) используют единицы и в единичных случаях, а вот картошка любит такое дело и довольно часто таким промышляет :)

Share this post


Link to post

Short link
Share on other sites

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

В Python 3k такое поведение исправили?

Share this post


Link to post

Short link
Share on other sites

Запустил декопил клиента по новой на исправленной версии.... Короче я пофиксил только один баг. Нуно еще 88 багов пофиксеть ))))) к концу месяца закончу ))))


Хотя нет 38 надо пофиксеть, 88 это со старым если ))))

Share this post


Link to post

Short link
Share on other sites

я пофиксил только один баг.

Что-то совсем странно ожидать от новых версий регресса( Edited by ShadowHunterRUS

Share this post


Link to post

Short link
Share on other sites

А это точно был баг?

В чем он заключался?

Что-то совсем странно ожидать от новых версий регресса(

 

Я не знаю как правильно это называть. Это была неучтёнка. То есть декомпилятор не учитывал, что в описании класса может закрасться этот странный CALL

Edited by StranikS_Scan

Share this post


Link to post

Short link
Share on other sites

@StranikS_Scan, меня больше радует тот факт, что Decompile++ выдает совершенно другой loader.py)))

 

Он проглатывает, что не смог, то выкидывает и т.д. )))

 

----------------------

 

Сейчас сижу курю проблему вот с эти кодом:

            |             114 JUMP_IF_FALSE_OR_POP [6F 7C 00]   124 
            |             117 LOAD_FAST            [7C 03 00]     3 (mrtEnabled)
            |             120 RETURN_VALUE         [53 -- --]
            |         >>  121 LOAD_GLOBAL          [74 01 00]     1 (True)
            |         >>  124 RETURN_VALUE         [53 -- --]

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

         114	JUMP_IF_FALSE_OR_POP '124'
         117	LOAD_FAST         'mrtEnabled'
         120	RETURN_END_IF     ''
       121_0	COME_FROM         '114'
         121	LOAD_GLOBAL       'True'
       124_0	COME_FROM         '90'
       124_1	COME_FROM         '96'
         124	RETURN_VALUE      ''
          -1	RETURN_LAST       ''

Syntax error at or near `RETURN_END_IF' token at offset 120
Edited by StranikS_Scan

Share this post


Link to post

Short link
Share on other sites

И там косяк с распаковкой имен приватных методов.

 

Это само-собой )))))

Share this post


Link to post

Short link
Share on other sites

Это само-собой )))))

А зачем тогда ты его добавил, если он страдает детскими болячками?

Он даже не может в декораторы.

Edited by ShadowHunterRUS

Share this post


Link to post

Short link
Share on other sites

А зачем тогды ты его добавил, если он страдает детскими болячками?

 

Эти болячки во 2-м ункомпиле оказывается тоже есть. Просто я вывод ошибок криво сделал и ни какой реакции не было, а py-файлы-то битые на выходе из него были ))))

 

 

И там косяк с распаковкой имен приватных методов.

 

А вот это спорный вопрос. Так как в оригинальном py метод был записан без префикса. А потому наверно логично, что декомпилированный вариант тоже его не содержит. Вот смотри сам

      | 113          90 LOAD_CONST           [64 09 00]     9 (<code object __isSupported at 02B91F50, file "scripts/client/post_processing/__init__.py", line 113>)
      |              93 MAKE_FUNCTION        [84 00 00]     0
      |              96 STORE_NAME           [5A 0C 00]    12 (_Effect__isSupported)
Edited by StranikS_Scan

Share this post


Link to post

Short link
Share on other sites

Кто-нибудь может вообще объяснить как такой код мог получится?

            |         >>   65 STORE_FAST           [7D 03 00]     3 (mrtEnabled)
            | 119          68 LOAD_FAST            [7C 00 00]     0 (self)
            |              71 LOAD_ATTR            [6A 05 00]     5 (_Effect__curQuality)
            |              74 LOAD_FAST            [7C 00 00]     0 (self)
            |              77 LOAD_ATTR            [6A 06 00]     6 (_Effect__effectType)
            |              80 BINARY_SUBSCR        [19 -- --]
            |              81 LOAD_FAST            [7C 00 00]     0 (self)
            |              84 LOAD_ATTR            [6A 07 00]     7 (_Effect__qualityRange)
            |              87 COMPARE_OP           [6B 06 00]     6 (in)
            |              90 JUMP_IF_FALSE_OR_POP [6F 7C 00]   124 
            |              93 LOAD_FAST            [7C 02 00]     2 (isEnabled)
            |              96 JUMP_IF_FALSE_OR_POP [6F 7C 00]   124 
            | 120          99 LOAD_FAST            [7C 00 00]     0 (self)
            |             102 LOAD_ATTR            [6A 08 00]     8 (_Effect__isAdvanced)
            |             105 POP_JUMP_IF_FALSE    [72 79 00]   121 
            |             108 LOAD_FAST            [7C 00 00]     0 (self)
            |             111 LOAD_ATTR            [6A 08 00]     8 (_Effect__isAdvanced)
            |             114 JUMP_IF_FALSE_OR_POP [6F 7C 00]   124 
            |             117 LOAD_FAST            [7C 03 00]     3 (mrtEnabled)
            |             120 RETURN_VALUE         [53 -- --]
            |         >>  121 LOAD_GLOBAL          [74 01 00]     1 (True)
            |         >>  124 RETURN_VALUE         [53 -- --]

Мозг убивает отсутствие явной инструкции задания в TOS значения возвращаемого через RETURN_VALUE (ниже это ?). Попытался построить логику исходного кода по данной цепочке вышло что-то типа такого:

...

 

Не правильно, ...OR_POP же сохраняет TOS если идет переход. Ща соображу по новой ))))))

 

Нашел как появляется базовая конструкция:

      discode[hexcode]:
      |   2           0 LOAD_GLOBAL          [74 00 00]     0 (a)
      |               3 JUMP_IF_FALSE_OR_POP [6F 0F 00]    15 
      |               6 LOAD_GLOBAL          [74 01 00]     1 (b)
      |               9 JUMP_IF_FALSE_OR_POP [6F 0F 00]    15 
      |              12 LOAD_GLOBAL          [74 02 00]     2 (c)
      |         >>   15 RETURN_VALUE         [53 -- --]
      consts:
         (0) None 

вот код:

def aaa():
    return a and b and c

Вот такой скрипт:

def aaa():
    mrtEnabled = False
    return self._Effect__curQuality[self._Effect__effectType] in self._Effect__qualityRange and \
           isEnabled and \
           (self._Effect__isAdvanced or _Effect__isAdvanced) and \
           mrtEnabled

дает вот такой код:

      discode[hexcode]:
      |   2           0 LOAD_GLOBAL          [74 00 00]     0 (False)
      |               3 STORE_FAST           [7D 00 00]     0 (mrtEnabled)
      |   3           6 LOAD_GLOBAL          [74 01 00]     1 (self)
      |               9 LOAD_ATTR            [6A 02 00]     2 (_Effect__curQuality)
      |              12 LOAD_GLOBAL          [74 01 00]     1 (self)
      |              15 LOAD_ATTR            [6A 03 00]     3 (_Effect__effectType)
      |              18 BINARY_SUBSCR        [19 -- --]
      |              19 LOAD_GLOBAL          [74 01 00]     1 (self)
      |              22 LOAD_ATTR            [6A 04 00]     4 (_Effect__qualityRange)
      |              25 COMPARE_OP           [6B 06 00]     6 (in)
      |              28 JUMP_IF_FALSE_OR_POP [6F 37 00]    55 
      |   4          31 LOAD_GLOBAL          [74 05 00]     5 (isEnabled)
      |              34 JUMP_IF_FALSE_OR_POP [6F 37 00]    55 
      |   5          37 LOAD_GLOBAL          [74 01 00]     1 (self)
      |              40 LOAD_ATTR            [6A 06 00]     6 (_Effect__isAdvanced)
      |              43 POP_JUMP_IF_TRUE     [73 34 00]    52 
      |              46 LOAD_GLOBAL          [74 06 00]     6 (_Effect__isAdvanced)
      |              49 JUMP_IF_FALSE_OR_POP [6F 37 00]    55 
      |   6     >>   52 LOAD_FAST            [7C 00 00]     0 (mrtEnabled)
      |         >>   55 RETURN_VALUE         [53 -- --]
      consts:
         (0) None

Почти подобрался к искомому коду. осталось понять как вывернуться на POP_JUMP_IF_FALSE в 43

 

Я сделал это  :flag:  :flag:  :flag:   Вот какой код скрипт там был:

    ...
    mrtEnabled = ...
    return self._Effect__isAdvanced and mrtEnabled \
           if (self._Effect__curQuality[self._Effect__effectType] in self._Effect__qualityRange and \
              isEnabled and self._Effect__isAdvanced) else \
           True

именно он на выходе и дает код вида:

|               3 STORE_FAST           [7D 00 00]     0 (mrtEnabled)
      |   4           6 LOAD_GLOBAL          [74 01 00]     1 (self)
      |               9 LOAD_ATTR            [6A 02 00]     2 (_Effect__curQuality)
      |              12 LOAD_GLOBAL          [74 01 00]     1 (self)
      |              15 LOAD_ATTR            [6A 03 00]     3 (_Effect__effectType)
      |              18 BINARY_SUBSCR        [19 -- --]
      |              19 LOAD_GLOBAL          [74 01 00]     1 (self)
      |              22 LOAD_ATTR            [6A 04 00]     4 (_Effect__qualityRange)
      |              25 COMPARE_OP           [6B 06 00]     6 (in)
      |              28 POP_JUMP_IF_FALSE    [72 3B 00]    59
      |   5          31 LOAD_GLOBAL          [74 05 00]     5 (isEnabled)
      |              34 POP_JUMP_IF_FALSE    [72 3B 00]    59
      |   6          37 LOAD_GLOBAL          [74 01 00]     1 (self)
      |              40 LOAD_ATTR            [6A 06 00]     6 (_Effect__isAdvanced)
      |              43 POP_JUMP_IF_FALSE    [72 3B 00]    59
      |              46 LOAD_GLOBAL          [74 01 00]     1 (self)
      |              49 LOAD_ATTR            [6A 06 00]     6 (_Effect__isAdvanced)
      |              52 JUMP_IF_FALSE_OR_POP [6F 3E 00]    62
      |              55 LOAD_FAST            [7C 00 00]     0 (mrtEnabled)
      |              58 RETURN_VALUE         [53 -- --]
      |   7     >>   59 LOAD_GLOBAL          [74 07 00]     7 (True)
      |         >>   62 RETURN_VALUE         [53 -- --]

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

 

----------------

 

Хотя, нет, опять не тот код получился. Недосмотрел я. Поиски продолжаются :((((

 

Все. Вот теперь задача реально решена. Все перепроверил на два раза ))) Вот какой скрипт в оригинале:

    ...
    mrtEnabled = ...
    return self._Effect__curQuality[self._Effect__effectType] in self._Effect__qualityRange and \
           isEnabled and \
           (self._Effect__isAdvanced and mrtEnabled if self._Effect__isAdvanced else True)

      discode[hexcode]:
      |   2           0 LOAD_GLOBAL          [74 00 00]     0 (False)
      |               3 STORE_FAST           [7D 00 00]     0 (mrtEnabled)
      |   3           6 LOAD_GLOBAL          [74 01 00]     1 (self)
      |               9 LOAD_ATTR            [6A 02 00]     2 (_Effect__curQuality)
      |              12 LOAD_GLOBAL          [74 01 00]     1 (self)
      |              15 LOAD_ATTR            [6A 03 00]     3 (_Effect__effectType)
      |              18 BINARY_SUBSCR        [19 -- --]
      |              19 LOAD_GLOBAL          [74 01 00]     1 (self)
      |              22 LOAD_ATTR            [6A 04 00]     4 (_Effect__qualityRange)
      |              25 COMPARE_OP           [6B 06 00]     6 (in)
      |              28 JUMP_IF_FALSE_OR_POP [6F 3E 00]    62 
      |   4          31 LOAD_GLOBAL          [74 05 00]     5 (isEnabled)
      |              34 JUMP_IF_FALSE_OR_POP [6F 3E 00]    62 
      |   5          37 LOAD_GLOBAL          [74 01 00]     1 (self)
      |              40 LOAD_ATTR            [6A 06 00]     6 (_Effect__isAdvanced)
      |              43 POP_JUMP_IF_FALSE    [72 3B 00]    59 
      |              46 LOAD_GLOBAL          [74 01 00]     1 (self)
      |              49 LOAD_ATTR            [6A 06 00]     6 (_Effect__isAdvanced)
      |              52 JUMP_IF_FALSE_OR_POP [6F 3E 00]    62 
      |              55 LOAD_FAST            [7C 00 00]     0 (mrtEnabled)
      |              58 RETURN_VALUE         [53 -- --]
      |         >>   59 LOAD_GLOBAL          [74 07 00]     7 (True)
      |         >>   62 RETURN_VALUE         [53 -- --]
      consts:
         (0) None 

Edited by StranikS_Scan

Share this post


Link to post

Short link
Share on other sites

@StranikS_Scan, перебором что-ли искал?

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

(self._Effect__isAdvanced and mrtEnabled if self._Effect__isAdvanced else True)
нормально переписывается в

(mrtEnabled if self._Effect__isAdvanced else True)
далее

not self._Effect__isAdvanced or mrtEnabled
И где только картошка таких берет...

Share this post


Link to post

Short link
Share on other sites
StranikS_Scan, перебором что-ли искал?

 

Изучал базовые конструкции пока не научился видеть их в коде. Как сам видишь выше, данный код использует всего из две базовые конструкций это return X and Y and Z and... и конструкцию A if N else B.

 

Их распознать не сложно, когда их знаешь. Первая это:

 

TOS <--

JUMP_IF_FALSE_OR_POP

TOS <--

JUMP_IF_FALSE_OR_POP

TOS <--

...

RETURN_VALUE

 

Вторая это:

 

TOS <--

POP_JUMP_IF_FALSE

   TOS <--

   ...

   RETURN или JUMP_FORWARD -----

TOS <--                                                  |

...                                                            |

TOS <--------------------------------------------

...

 

Однако это все легкая часть решения задачки. Сейчас пытаюсь понять как устроен AST-конвертер в ункопиле, надо там правку делать.

я там выше привел пример if a or a:

возможно баги копипасты

 

Это вообще левый код. Декомпил++ даже не смог правильно разобрать эту часть кода

 

И где только картошка таких берет...

 

Часто сложные условия пишут следуя за логикой рассуждения. И в дальнейшем не  упрощают код, чтобы видеть именно эту логику.

Edited by StranikS_Scan

Share this post


Link to post

Short link
Share on other sites

Однако это все легкая часть решения задачки. Сейчас пытаюсь понять как устроен AST-конвертер в ункопиле, надо там правку делать.

В их Issues кинул эти баги?

Share this post


Link to post

Short link
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...