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

Вожусь с последними недоработками ункомпил6, их осталось две. Сейчас правлю первую.

 

Это файл res_bw\scripts\common\lib\idlelib\pyparse.pyc. В нем есть функция, на которой крашится ункомпил2 и ункпомил6. Причину я нашел. Это конструкция while else. Причем именно код в else

 

Я создал пример правильного кода, он повторяет по структуре код в "больной" функции - это два вложенных цикла, причем внутренний цикл имеет "больной" else-блок.

 

Вот пример правильного по структуре кода!:

|   1           0 SETUP_LOOP                   [78 50 00]    80 (to 83)  ВНЕШНИЙ ЦИКЛ
|         >>    3 | LOAD_NAME                  [65 00 00]     0 (a)      НАЧАЛО ТЕЛА ВНЕШНЕГО ЦИКЛА
|               6 | LOAD_CONST                 [64 00 00]     0 (1)
|               9 | COMPARE_OP                 [6B 00 00]     0 (<)
|              12 | POP_JUMP_IF_FALSE          [72 52 00]    82 
|   2          15 | · LOAD_CONST               [64 00 00]     0 (1)
|              18 | · STORE_NAME               [5A 00 00]     0 (a)
|   3          21 | · SETUP_LOOP               [78 37 00]    55 (to 79)  ВНУТРЕННИЙ ЦИКЛ
|         >>   24 | · | LOAD_NAME              [65 00 00]     0 (a)      НАЧАЛО ТЕЛА ЦИКЛА
|              27 | · | LOAD_CONST             [64 01 00]     1 (2)
|              30 | · | COMPARE_OP             [6B 00 00]     0 (<)
|              33 | · | POP_JUMP_IF_FALSE      [72 30 00]    48 
|   4          36 | · | · LOAD_CONST           [64 01 00]     1 (2)
|              39 | · | · STORE_NAME           [5A 00 00]     0 (a)
|   5          42 | · | · JUMP_ABSOLUTE        [71 18 00]    24          ВОЗВРАТ НА НАЧАЛО ВНУТРЕННЕГО ЦИКЛА (это сontinue)
|              45 | · | · JUMP_ABSOLUTE        [71 18 00]    24 
|         >>   48 | · | POP_BLOCK              [57 -- --]                ТЕЛО ЦИКЛА ЗАКОНЧИЛОСЬ
|   7          49 | · | LOAD_NAME              [65 01 00]     1 (g)      НАЧАЛО ELSE-БЛОКА
|              52 | · | LOAD_CONST             [64 02 00]     2 (8)
|              55 | · | COMPARE_OP             [6B 00 00]     0 (<)
|              58 | · | POP_JUMP_IF_FALSE      [72 49 00]    73 
|   8          61 | · | · LOAD_CONST           [64 03 00]     3 (3)
|              64 | · | · STORE_NAME           [5A 01 00]     1 (g)
|   9          67 | · | · JUMP_ABSOLUTE        [71 03 00]     3          ВОЗВРАТ НА НАЧАЛО ВНЕШНЕГО ЦИКЛА (это сontinue)
|              70 | · | · JUMP_FORWARD         [6E 00 00]     0 (to 73)  <--- ОБРАЩАЕМ ВНИМАНИЕ - ФОРВАРД ЕСТЬ!!!
|  10     >>   73 | · | LOAD_CONST             [64 01 00]     1 (2)
|              76 | · | STORE_NAME             [5A 02 00]     2 (f)      ELSE-БЛОК ЗАКОНЧИЛСЯ
|         >>   79 | · JUMP_ABSOLUTE            [71 03 00]     3          ВОЗВРАТ НА НАЧАЛО ВНЕШНЕГО ЦИКЛА (это сontinue)
|         >>   82 | POP_BLOCK                  [57 -- --]                КОНЕЦ ТЕЛА ВНЕШНЕГО ЦИКЛА
|         >>   83 LOAD_CONST                   [64 04 00]     4 (None)
|              86 RETURN_VALUE                 [53 -- --]

А вот кусочек код из оригинальной функции, которая "больная" из файла pyparse.pyc:

...........................
...........................
...........................
|             682 | · · | · COMPARE_OP               [6B 02 00]     2 (==)                    ИДЕТ ТЕЛО ВНУТРЕННЕГО ЦИКЛА
|             685 | · · | · POP_JUMP_IF_FALSE        [72 BD 02]   701 
| 291         688 | · · | · · LOAD_FAST              [7C 04 00]     4 (lno)
|             691 | · · | · · LOAD_CONST             [64 01 00]     1 (1)
|             694 | · · | · · BINARY_ADD             [17 -- --]
|             695 | · · | · · STORE_FAST             [7D 04 00]     4 (lno)
|             698 | · · | · · JUMP_FORWARD           [6E 00 00]     0 (to 701)
| 292     >>  701 | · · | · LOAD_FAST                [7C 07 00]     7 (i)
|             704 | · · | · LOAD_CONST               [64 01 00]     1 (1)
|             707 | · · | · BINARY_ADD               [17 -- --]
|             708 | · · | · STORE_FAST               [7D 07 00]     7 (i)
| 293         711 | · · | · JUMP_ABSOLUTE            [71 E2 01]   482                         ВОЗВРАТ НА НАЧАЛО ВНУТРЕННЕГО ЦИКЛА (это сontinue)
|             714 | · · | · JUMP_ABSOLUTE            [71 E2 01]   482 
|             717 | · · | · JUMP_ABSOLUTE            [71 E2 01]   482 
|         >>  720 | · · | POP_BLOCK                  [57 -- --]                               ТЕЛО ЦИКЛА ЗАКОНЧИЛОСЬ
| 300         721 | · · | LOAD_FAST                  [7C 04 00]     4 (lno)                   НАЧАЛО ELSE-БЛОКА
|             724 | · · | LOAD_CONST                 [64 01 00]     1 (1)
|             727 | · · | BINARY_SUBTRACT            [18 -- --]
|             728 | · · | LOAD_FAST                  [7C 0B 00]    11 (firstlno)
|             731 | · · | COMPARE_OP                 [6B 02 00]     2 (==)
|             734 | · · | POP_JUMP_IF_FALSE          [72 EA 02]   746 
| 303         737 | · · | · LOAD_GLOBAL              [74 0A 00]    10 (C_STRING_FIRST_LINE)
|             740 | · · | · STORE_FAST               [7D 02 00]     2 (continuation)
|             743 | · · | · JUMP_ABSOLUTE            [71 CD 00]   205                         ВОЗВРАТ НА НАЧАЛО ВНЕШНЕГО ЦИКЛА (это сontinue)
| 305     >>  746 | · · | LOAD_GLOBAL                [74 0B 00]    11 (C_STRING_NEXT_LINES)   ???? ГДЕ ФОРВАРД ???
|             749 | · · | STORE_FAST                 [7D 02 00]     2 (continuation)          ELSE-БЛОК ЗАКОНЧИЛСЯ
| 306     >>  752 | · · JUMP_ABSOLUTE                [71 CD 00]   205                         ВОЗВРАТ НА НАЧАЛО ВНЕШНЕГО ЦИКЛА (это сontinue)
..........................
..........................

Обратите внимание, что в "больном" else-блоке почему-то отсутствует инструкция JUMP_FORWARD. Она вообще-то является элементом конструкции сравнения 731-734. Например вот так:

if a<9:
    print 1
|   1           0 LOAD_NAME              [65 00 00]     0 (a)
|               3 LOAD_CONST             [64 00 00]     0 (9)
|               6 COMPARE_OP             [6B 00 00]     0 (<)
|               9 POP_JUMP_IF_FALSE      [72 14 00]    20 
|   2          12 · LOAD_CONST           [64 01 00]     1 (1)
|              15 · PRINT_ITEM           [47 -- --]
|              16 · PRINT_NEWLINE        [48 -- --]
|              17 · JUMP_FORWARD         [6E 00 00]     0 (to 20)  ПЕРЕХОД В ОСНОВНУЮ ВЕТКУ КОДА
|         >>   20 LOAD_CONST             [64 02 00]     2 (None)
|              23 RETURN_VALUE           [53 -- --]

И в первом моем примере, компилятор её вставил как положено. Однако в файле pyparse.pyc, что разбирается выше её почему нет?! Из-за этого декомпилятор впадает в ступор и не может осмыслить структуру кода. Вопрос в том, как так получилось и из-за чего. Это баг? Или это оптимизатор в компиляторе так сработал и выпнул её? Или это какая-то хитрая логика и я чего не допер? Короче пишите кто чего думает-знает.

Edited by StranikS_Scan

Share this post


Link to post

Short link
Share on other sites

есть одна мысль...

Вот этот файл: PyParse.py

 

Это крашит ункомпил:

while 1:pass
Но это не крашит:

while True:pass
Edited by ShadowHunterRUS

Share this post


Link to post

Short link
Share on other sites

Залил в первый пост декомпилированный клиент 0.9.14. Сейчас мой ункомпил6 все файлы в нем декомпилирует кроме res_bw\scripts\common\lib\plat-mac\carbon\quicktime.pyc. Его пришлось в ункомпиле2 декомпилировать. Почему-то ункомпил6 вываливается с ошибкой.

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

Почти 3.5к строк кода в одном файле.

Похоже подавился.

 

Да вот беда вываливается именно на сборке кода, с ошибкой переполнения памяти. Причем алгоритм такой же как и в ункомпил2, но 2-ка почему-то нормально декомпилит этот файл, а 6-ка вываливается. Не могу понять в чем прикол.

...............
............... куча buildTree
............... 
<<<   File "C:\Program Files (x86)\Borland\Delphi6\Projects\PjOrion\dcpack\dcpack\uncompyle6\parsers\spark.py", line 618, in buildTree
<<<     attr[i] = self.buildTree(sym, why[0], tokens, why[1])
<<<   File "C:\Program Files (x86)\Borland\Delphi6\Projects\PjOrion\dcpack\dcpack\uncompyle6\parsers\spark.py", line 620, in buildTree
<<<     return self.rule2func[self.new2old[rule]](attr)
<<<   File "C:\Program Files (x86)\Borland\Delphi6\Projects\PjOrion\dcpack\dcpack\uncompyle6\parsers\spark.py", line 663, in <lambda>
<<<     self.buildASTNode(args, lhs)
<<<   File "C:\Program Files (x86)\Borland\Delphi6\Projects\PjOrion\dcpack\dcpack\uncompyle6\parsers\spark.py", line 674, in buildASTNode
<<<     return self.nonterminal(lhs, children)
<<<   File "C:\Program Files (x86)\Borland\Delphi6\Projects\PjOrion\dcpack\dcpack\uncompyle6\parser.py", line 56, in nonterminal
<<<     rv = GenericASTBuilder.nonterminal(self, nt, args)
<<<   File "C:\Program Files (x86)\Borland\Delphi6\Projects\PjOrion\dcpack\dcpack\uncompyle6\parsers\spark.py", line 681, in nonterminal
<<<     rv[:len(args)] = args
<<<   File "UserList", line 39, in __setslice__
<<< MemoryError: Stack overflow
Файл UserList в Питоне:
   def __setslice__(self, i, j, other):
        i = max(i, 0); j = max(j, 0)
        if isinstance(other, UserList):    <-------- ошибка тут!!!
            self.data[i:j] = other.data
        elif isinstance(other, type(self.data)):
            self.data[i:j] = other
        else:
            self.data[i:j] = list(other)

Вот класс GenericASTBuilder в ункомпил6 - тыц.

 

Вот он же в укомпил2 - тыц

 

Ни какой разницы. Может проблема с деревьями. Криво генерируются, хз (((

Edited by StranikS_Scan

Share this post


Link to post

Short link
Share on other sites

@StranikS_Scan, добавь пожалуйста больше горячих клавиш в Орион.

Очень не хватает:

Ctrl + D (дублировать строку)

Ctrl + Del (удалить слово справа)

Ctrl + Backspace (удалить слово слева)

Share this post


Link to post

Short link
Share on other sites

@StranikS_Scan, добавь пожалуйста больше горячих клавиш в Орион.

Очень не хватает:

Ctrl + D (дублировать строку)

Ctrl + Del (удалить слово справа)

Ctrl + Backspace (удалить слово слева)

 

Ок.

Share this post


Link to post

Short link
Share on other sites

Ок.

Еще я заметил баг с подсветкой строки с ошибкой Орионом.

post-16296-0-03713800-1459441418_thumb.png

Подсвечивается 47 строка, хотя ошибка в 49.

Share this post


Link to post

Short link
Share on other sites

Еще я заметил баг с подсветкой строки с ошибкой Орионом.

attachicon.gifСнимок экрана (238).png

Подсвечивается 47 строка, хотя ошибка в 49.

Нашел причину.

Edited by StranikS_Scan

Share this post


Link to post

Short link
Share on other sites

"Replace Spaces to Tabs" не работает с таким кодом

def load():
    m_list = [i.replace('\\', '/') for i in glob.iglob('%s/mods/*/' % wd)]
    for m_dir in m_list:
        if os.path.isdir(m_dir) and os.path.exists('%s/__init__.pyc' % m_dir):
            pass

Share this post


Link to post

Short link
Share on other sites
"Replace Spaces to Tabs" не работает с таким кодом

 

Поправлю. 

 


 

Решил проблему с переполнением памяти в ункомпил6. Оказалось что проблема в размере стэка программы, т.е. основного потока. Обычно встречаются две проблемы - не хватка стэка и предел рекурсивных вызовов. Как они себя проявляют хорошо показано вот на этих примерах

Случай нулевой, достигается придел рекурсивных вызовов:
import sys
def rec(x):
    print x,
    if x < 1000:
        rec(x + 1)
rec(0)

Случай первый, переполнения стека не наблюдается, полет в норме:
import sys
sys.setrecursionlimit(2000000)
def rec(x):
    print x,
    if x < 1000:
        rec(x + 1)
rec(0)

Случай второй, достигается переполнение стека:
import sys
sys.setrecursionlimit(2000000)
def rec(x):
    print x,
    if x < 10000:
        rec(x + 1)
rec(0) 

Увеличить предел рекурсии можно легко в самом питоне. У меня это уже было сделано ранее в Terminal - Settings - Basic setup - Execute after connection... А вот про стэк я совсем забыл и долго не мог понять почему quicktime.pyc с 3,5к строк не хочет декомпилится.

 

Про увеличение стэка, хорошо написано вот тут. В самом питоне не увеличить. Потому увеличил в Орионе - поднял предел с 1Мб до 16Мб. И проблема исчезла.

Edited by StranikS_Scan
  • Upvote 4

Share this post


Link to post

Short link
Share on other sites

С новым файлом debug_utils.pyc в res_mods и работой трасмиттера все разобрались? Кто не разобрался еще, поясняю. Трансмиттер грузиться за счет хука на этот файл, т.е. на debug_utils.pyc. Если такой файл положить в res_mods (а трасмиттер в path.xml грузиться после папки res_mods), то Орион к клиенту не подключится.

 

Поэтому убирайте файл debug_utils.pyc из res_mods в папку res

Это ещё не всё... Пункты пользовательского соглашения как Вам?  Который запрещает запускать клиент игры через трансмитер, дословно:

 

"4.3.8. Использовать автоматизированные скрипты для сбора информации или для другого рода взаимодействия с Игрой и ее элементами."

"4.3.23. Использовать Игру способами, не предусмотренными настоящим Соглашением и выходящими за рамки обычного игрового процесса."

 

Так что, грызём только реплеи :) И то неизвестно можно ли :)

И ещё вопрос, в шапке 6 юникомпил уже правленый? Или ждём обновы?

Share this post


Link to post

Short link
Share on other sites

где ты его там увидел?

я имел ввиду инсталятор

Share this post


Link to post

Short link
Share on other sites

Клиент игры теперь /0.9.14.1/

я в курсе

Я про орион имел ввиду

Share this post


Link to post

Short link
Share on other sites

Это ещё не всё... Пункты пользовательского соглашения как Вам?  Который запрещает запускать клиент игры через трансмитер, дословно:

 

"4.3.8. Использовать автоматизированные скрипты для сбора информации или для другого рода взаимодействия с Игрой и ее элементами."

"4.3.23. Использовать Игру способами, не предусмотренными настоящим Соглашением и выходящими за рамки обычного игрового процесса."

 

Так что, грызём только реплеи :) И то неизвестно можно ли :)

 

Ой, ЛОЛ )))))) При чем тут трансмиттер?

 

Банят тех кто модпак урагана юзал и моды, в которые он троян засунул. Детектят через debug_utils запросы на читерский сервер. Всех дураков, кто последнюю неделю гонял с читом, тех задетектили и теперь банят ))))) Примерно 10к чепушил в баньку отправят.

 

 

И ещё вопрос, в шапке 6 юникомпил уже правленый? Или ждём обновы?

 

Еще нет. Ждите. 

Edited by StranikS_Scan
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

 

 

Банят тех кто модпак урагана юзал и моды, в которые он троян засунул.

А можно самому как-то провести диагностику? Я не ставлю модпаки, но отдельный мод мог и поставить.

Share this post


Link to post

Short link
Share on other sites

А можно самому как-то провести диагностику? Я не ставлю модпаки, но отдельный мод мог и поставить.

 

Да, хз.

 


 

Залил в первый пост ссылку на новые исходники 0.9.14.1 клиента 0.9.14_143_Decompile_WOT.zip

Edited by StranikS_Scan
  • Upvote 2

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.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...