Jump to content
Korean Random

fecell

User
  • Posts

    293
  • Joined

  • Last visited

  • Days Won

    1

Everything posted by fecell

  1. uncompyle6 <<< Error: maximum recursion depth exceeded in cmp http://rgho.st/6KbCGMX7D (в файле нет ни одной команды сравнения) (релиз ориона который без инжектора) upd: это баг оригинального декомпилера, создал тикет на гитхабе.. https://github.com/rocky/python-uncompyle6/issues/70
  2. Есть способ не очень сложный. Компилится стандартным питоном, а потом скриптом байткод патчиться во всех co_code. Особой защиты на первый взгляд нет кроме отсутствия заголовка и измененных опкодов, должно сработать. Таблицу опкодов из игры получить не должно быть очень сложно - сначала хук чтобы запустить консоль, потом в консоле компилируешь скрипт и получаешь байткод как он есть в игре, тот-же скрипт компилишь в стандартном питоне и сравниваешь результат. ;) офтоп: напишу в ЛС как скачаю игру, на ЗБТ записался, жду когда пойдет процесс загрузки.
  3. для начала добавляешь отсутствующий заголовок, в котором как раз указывается версия питона, в примере ниже 2.7: import sys, os fileName, fileExtension = os.path.splitext(sys.argv[1]) f = open(sys.argv[1], "rb") with open('%s_hdr.pyc' % fileName, 'wb') as fc: fc.write('\x03\xf3\x0d\x0a\0\0\0\0') fc.write(f.read()) f.close() но декомпилировать все равно сложно, таблица опкодов в игре нестандартная. т.е. в стандартном питоне RETURN_VALUE, а в этом скрипте вместо этого INPLACE_RSHIFT хотя LOAD_CONST похоже не изменена, например. без самой игры остается только гадать какие еще команды изменили, а какие нет. ну а без списка кодов команд как они заданы в игре ничего не декомпилируешь. вообщем это надо саму игру качать и.. "а оно мне надо сутки 30 гигов тянуть?!.. ради чего?!.."
  4. Ункомпил6 работает неправильно. def obj_166(): for obj_167 in obj_168: if obj_169(obj_167): obj_170 = 1 else: obj_170 = 2 преобразуется к def obj_166(): for obj_167 in obj_168: if obj_169(obj_167): obj_170 = 1 obj_170 = 2 ps: но uncompyle6 с офсайта - корректно.
  5. хм, обфускатор перемудренный вроде. генерит лишний код, который фактически не нужен, лишь замедляет исполнение скрипта. (строковые значения для простоты указаны в явном виде, без закрутки в O0OO1l[xxxx]) from tmp import test1 print test1 var_203 = getattr(__import__('tmp', globals(), locals(), ['test1'], -1), 'test1') #стало print var_203 var_203 = getattr(__import__('tmp'), 'test1') #но вроде достаточно print var_203
  6. похакал, если так можно сказать, официальную страницу загрузок - поправил ява код сняв с кнопки загрузки недоступность клика. "в итоге получил прямую ссылку:" но обойти дальнейшую авторизацию задача куда сложнее, я не справлюсь. может кто-то другой в этих делах более опытный. вообщем это все чем могу пособить.
  7. обновил первый пост под 9.16, добавил в исходник пример реализации __doc__ для пида.
  8. http://rgho.st/8XNTPYlDR print '\xd0\xa0\xd0\xbe\xd0\xb7\xd0\xb0 \xd0\xb8\xd1\x81\xd1\x87\xd0\xb5\xd0\xb7\xd0\xbd\xd0\xb5\xd1\x82, \xd0\xb5\xd1\x81\xd0\xbb\xd0\xb8 \xd0\xb2 \xd1\x82\xd0\xb5\xd1\x87\xd0\xb5\xd0\xbd\xd0\xb8\xd0\xb5 \xd1\x82\xd1\x80\xd1\x91\xd1\x85 \xd0\xbc\xd0\xb8\xd0\xbd\xd1\x83\xd1\x82 \xd0\xb5\xd1\x91 \xd0\xbd\xd0\xb8\xd0\xba\xd1\x82\xd0\xbe \xd0\xbd\xd0\xb5 \xd1\x81\xd0\xbe\xd1\x80\xd0\xb2\xd1\x91\xd1\x82. \xd0\x9c\xd0\xbe\xd0\xb6\xd0\xbd\xd0\xbe \xd0\xb8\xd1\x81\xd0\xbf\xd0\xbe\xd0\xbb\xd1\x8c\xd0\xb7\xd0\xbe\xd0\xb2\xd0\xb0\xd1\x82\xd1\x8c \xd1\x82\xd0\xbe\xd0\xbb\xd1\x8c\xd0\xba\xd0\xbe \xd0\xb2 \xd0\xbe\xd1\x82\xd0\xba\xd1\x80\xd1\x8b\xd1\x82\xd0\xbe\xd0\xbc \xd0\xbc\xd0\xb8\xd1\x80\xd0\xb5.' print '\xd0\x9f\xd0\xbe\xd1\x81\xd0\xb0\xd0\xb4\xd0\xb8\xd1\x82\xd0\xb5 \xd1\x80\xd0\xbe\xd0\xb7\xd1\x83, \xd1\x87\xd1\x82\xd0\xbe\xd0\xb1\xd1\x8b \xd0\xba\xd1\x82\xd0\xbe-\xd1\x82\xd0\xbe \xd0\xb4\xd1\x80\xd1\x83\xd0\xb3\xd0\xbe\xd0\xb9 \xd1\x81\xd0\xbc\xd0\xbe\xd0\xb3 \xd0\xb5\xd1\x91 \xd1\x81\xd0\xbe\xd1\x80\xd0\xb2\xd0\xb0\xd1\x82\xd1\x8c \xd0\xb8 \xd0\xbf\xd0\xbe\xd0\xb4\xd0\xb0\xd1\x80\xd0\xb8\xd1\x82\xd1\x8c \xd1\x81\xd0\xbb\xd0\xb5\xd0\xb4\xd1\x83\xd1\x8e\xd1\x89\xd0\xb5\xd0\xbc\xd1\x83 \xd1\x81\xd1\x87\xd0\xb0\xd1\x81\xd1\x82\xd0\xbb\xd0\xb8\xd0\xb2\xd1\x87\xd0\xb8\xd0\xba\xd1\x83.' print '\xd0\xa1\xd0\xbe\xd1\x8e\xd0\xb7 \xd0\xbe\xd0\xb7\xd0\xbe\xd1\x80\xd0\xbd\xd0\xb8\xd0\xba\xd0\xbe\xd0\xb2 \xd1\x83\xd1\x82\xd0\xb2\xd0\xb5\xd1\x80\xd0\xb6\xd0\xb4\xd0\xb0\xd0\xb5\xd1\x82: \xd1\x87\xd1\x82\xd0\xbe\xd0\xb1\xd1\x8b \xd0\xbb\xd1\x8e\xd0\xb4\xd0\xb8 \xd0\xb2\xd0\xbe\xd0\xba\xd1\x80\xd1\x83\xd0\xb3 \xd1\x83\xd0\xbb\xd1\x8b\xd0\xb1\xd0\xb0\xd0\xbb\xd0\xb8\xd1\x81\xd1\x8c, \xd0\xbd\xd1\x83\xd0\xb6\xd0\xbd\xd0\xbe \xd0\xb1\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x88\xd0\xb5 \xd1\x86\xd0\xb2\xd0\xb5\xd1\x82\xd0\xbe\xd0\xb2!' print '\xd0\xa0\xd0\xbe\xd0\xb7\xd0\xb0 \xd0\xbb\xd1\x8e\xd0\xb1\xd0\xb2\xd0\xb8'
  9. при компиляции с флагом оптимизации (-O) создается pyo (в частности удаляются docstring и т.п.) при обычной компиляции создается pyс это как взять документ (pyc) и удалить ненужные пустые строки (стал pyo). если не декомпилится - значит pyo/pyc защищен от декомпила. вероятно. точно можно сказать только увидев файлы о которых ведешь речь.
  10. блин, ночью заметил что ошибся, и исправил на... тоже самое что было, по запарке. Сейчас уже выше исправил смещение на верное. 'asm code for check'
  11. смещение E9A9A0 (9.16), 12DBD10 (9.14) сигнатуру признаться не смотрел. E9A7D0 (9.16), 12DBB40 (9.14) 'бросилось в глаза.. остальные завтра, три ночи за окном как-никак'
  12. PyList_Append_tmpl = "\x55\x8B\xEC\x8B\x4D\x08\x8B\x41\x04\xF7\x40\x54\x00\x00\x00\x02\x74"; PyList_Append_mask = "xxxxxxxxxxxxxxxxx"; PyList_New_tmpl = "\x55\x8B\xEC\x57\x8B\x7D\x08\x85\xFF\x79"; PyList_New_mask = "xxxxxxxxxx";
  13. @Mixaill, сигнатуры некоторые можно сократить. "\x55\x8B\xEC\x81\xEC\x14\x02" (xxxxxxx) достаточно для Py_InitModule4, по крайней мере с 9.4 и до сих пор (на тестовых не знаю).
  14. Ну так-то да, я к тому что: char* PyString_AS_STRING(PyObject *string) Macro form of PyString_AsString() but without error checking. Only string objects are supported; no Unicode objects should be passed. https://docs.python.org/2/c-api/string.html#c.PyString_AS_STRING строка 91, stringobject.h (2.7.12) #define PyString_AS_STRING(op) (((PyStringObject *)(op))->ob_sval)
  15. немного перебор вроде, ЕМНИП PyString_AsString можно не врапить, а использовать макрос PyString_AS_STRING (по аналогии как и PY_INCREF и т.п.).
  16. посмотрим... скоро уже по идее новый патч выйдет, через недели 2-3 думаю.
  17. Конечно, но зная что надо хукать, неважно какой алгоритм реализован для подготовки к исполнению. Важно снять дамп скрипта после его запуска. Поэтому нет смысла настолько сильно заморачиваться, имхо. Обфускация защищает исходный код, но результат его исполнения важен т.е. декриптованный скрипт, а не сам код деобфускатора.
  18. имхо зря.. https://exelab.ru/art/?action=view&id=366 советую посмотреть на Shielden (Safengine) http://www.safengine.com/en-us/downloads/get-demo
  19. здесь давно выкладывают http://dvamaster.ru/?p=308#more-308 но лишь адреса, по крайней мере проще искать сигнатуры зная где что. последнее что выложено - 385 адресов для 9.14.8318
  20. Не понимаю в чем весь срачь. Мододелам должно быть вообще фиолетово на этот мод, лишь чуть намекнуть на некоторые вещи которые надо доделывать в модах чтобы обходить подобные блокировки. Вот и все.
  21. такую вещь делал где-то два года назад. хукер чуть позже. хукер уже в паблке появился, логично предположить что и деобфускатор скоро будет доведен до ума. :( впрочем, деобфускация в полностью автоматическом режиме достаточно сложа. тут много все зависит от того, как реализована возможность ручной правки полу-деобфусцированного байткода. один фиг можно сказать - "скоро".. зы: признаться, когда написал хукер, когда допилил деобфускатор и понял что защиты которые были достаточно слабы, то переписал свою с нуля изменив принцип. вышло, имхо, куда лучше чем было. можно в теме ЛСД где про блокирование инета для скриптов посмотреть пример ;) зызы: что касается обфускации сырков, то тут фантазия и упорство может довести до состояния "300баксов" (платный обфускатор).. это уже считаю предварительной защитой и над ней не заморачивался, из релиза своего криптора удалил такую возможность - автор сам решает что делать с исходным кодом до защиты от декомпиляции, так решил для себя.
  22. хм. сложновато что-то.. проще дамп всех эксесов писать в файлы 001_file,pyc, 002_file,pyc и т..д.. по крайней мере года два назад именно так сделал и до сих пор достаточно)) зы: так проще заголовок добавлять fc.write('\x03\xf3\x0d\x0a\0\0\0\0')
×
×
  • Create New...