Перейти к содержимому
Korean Random
fecell

Создание PYD для embedded python

Рекомендуемые сообщения

(изменено)

Итак:

0. Предварительно ищем точку входа в нужную функцию (ida в помощь, или гуглите смещения в интернете)

 

1. Имея точку входа и несколько версий exe-файла определяем действительную сигнатуру (шаблон+маска) сравнивая последовательности из разных файлов.

char *wotPy_InitModule4_tmpl = "\x55\x8B\xEC\x81\xEC\x14\x02\x00\x00\xA1\x00\x00\x00\x00\x33\xC5\x89\x45\xFC\x8B\x45\x10\x53";
char *wotPy_InitModule4_mask = "xxxxxxxxxx????xxxxxxxxx";

2. По сигнатуре ищем точку входа, она должна совпадать с найденной вручную в нулевом этапе разработки.

DWORD wotPy_InitModule4_addr = FindPattern(wotPy_InitModule4_tmpl, wotPy_InitModule4_mask);

3. Объявляем тип, соответствующий оригинальному объявлению функции в питоне.

typedef PyAPI_FUNC(PyObject *) Py_InitModule4_def(char *, PyMethodDef *, char *, PyObject *, int);

4. Объявляем функцию с типом и адресом подготовленными на этапах 2 и 3.

Py_InitModule4_def* wotPy_InitModule4 = (Py_InitModule4_def*)wotPy_InitModule4_addr;

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

#define Py_InitModule4(name, methods, doc, passthrough, module_api_version) wotPy_InitModule4(name, methods, doc, passthrough, module_api_version)

Во вложении пример исходника пида для прямой работы с памятью в World Of Tanks.

Если в исходнике CONSOLE_VER1 переименовать в CONSOLE_VER, то пид будет собран для консоли, если оставить как есть - для танков.

 

Пример использования пида:

def do_show():
    import imp
    try:
        import BigWorld
        mem_helper = imp.load_dynamic('mem_helper', 'res_mods/mem_helper.pyd')
    except:
        mem_helper = imp.load_dynamic('mem_helper', 'mem_helper.pyd')

    print mem_helper.__doc__
   
    orig = 'ABCDEF'
    print 'orig =', orig
   
    orig_addr = id(orig) + ''.__sizeof__() - 1
    print 'orig_addr =', orig_addr
   
    new_val = '\1\0' + '34' + '\0\1'
    print 'new_val = %s (%s)' % (new_val, repr(new_val))
   
    print
    res = mem_helper.write(orig_addr, new_val)
    print "mem_helper.write(%s, '%s') = %s " % (orig_addr, new_val, res)
    print 'new orig = %s' % orig
   
    print
    res = mem_helper.read(orig_addr, len(orig))
    print "mem_helper.read(%s, %s) = '%s'" % (orig_addr, len(orig), res)
   
    print
    res = mem_helper.find('MZZ', 'xx?')
    print "mem_helper.find('MZZ', 'xx?') = %s" % res
    res1 = mem_helper.read(res, 3)
    print "mem_helper.read(%s, 3) = '%s'" % (res, res1)

    try:
        import BigWorld
    except:
        print "\npress CTRL+C or CTRL+BREAK"
        while 1 : pass

do_show()

При использовании любого материала из данного поста указывайте автора!

WBW / fecell / lelicopter.

 

зы: Далее в теме ответов и комментариев вероятней всего не будет. Вопросы сотрудничества обсуждаемы в ЛС.

psps: без этих людей не возник бы этот шаблон - squadteam, Makct, Dr. Webber, mercger, kastiil, Sharmatov

 

upd:

- обновлено для 9.16

- в исходник добавлен код для назначения __doc__ для пида (print mem_helper.__doc__).

~mem_helper.pyd.rar

Изменено пользователем fecell
  • Нравится 14
  • Не нравится 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
(изменено)

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

 

А можно ссылку на подтверждение, что ребята из XVM будут использовать *.pyd?

Изменено пользователем kharlashkin

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

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

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

 

'офтоп'

А можно ссылку на подтверждение, что ребята из XVM будут использовать *.pyd?

 

'как-то так'

XVM%2BNative%2B2015-10-10%2B14.23.27.png

 

  • Нравится 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
(изменено)

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

 

'офтоп'

 

'как-то так'

XVM%2BNative%2B2015-10-10%2B14.23.27.png

 

Просто нет слов...

P.S. У меня сейчас оочень много работы по оформлению пусковой документации на один объект - думаю не осилю сам :(

Изменено пользователем kharlashkin

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
(изменено)

Куда кидать PYD файл, чтоб WoT сама его подхватила, и + можно из либы вызывать python функции?

Изменено пользователем BrainRegress

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

Куда кидать PYD файл, чтоб WoT сама его подхватила, и + можно из либы вызывать python функции?

обновил первый пост.

  • Нравится 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если кому интересен ответ на вопрос - почему спустя 100 лет я таки до сих пор не юзаю эти пиды. То ответ в пункте №0 - метод не универсальный.


ЗЫ: fecell, а где можно почитать предысторию, которая сподвигла тебя к публикации данной темы? Мы же все тут знаем, что такие темы на пустом месте не вырастают, где-то поди в каком-то Мордоре битва титанов произошла наверно... а эта тема её отголосок )))))

  • Нравится 1
  • Не нравится 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

предысторию

просто надоело в ЛС одно и тоже писать по сто раз)

  • Нравится 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
(изменено)

ЗЫ: fecell, а где можно почитать предысторию, которая сподвигла тебя к публикации данной темы? Мы же все тут знаем, что такие темы на пустом месте не вырастают, где-то поди в каком-то Мордоре битва титанов произошла наверно... а эта тема её отголосок )))))

Дык у меня в сообщении есть правильная ссылка. Одна из многих предпосылок к написанию.

Если конечно уделят мне внимание... Вопрос если SWIG как интерфейс и GCC как компилятор по этой инструкции можно использовать?

Изменено пользователем kharlashkin

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Дык у меня в сообщении есть правильная ссылка. Одна из многих предпосылок к написанию.

Если конечно уделят мне внимание... Вопрос если SWIG как интерфейс и GCC как компилятор по этой инструкции можно использовать?

 

Вроде бы, но нет ))))

 

Писать код dll (а она и есть pyd) можно на любом языке, главное предусмотреть базовую функцию, которую вызовет питон и пробросить "правильно" в dll адреса импортируемых функций.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
(изменено)

Вроде бы, но нет ))))

 

Писать код dll (а она и есть pyd) можно на любом языке, главное предусмотреть базовую функцию, которую вызовет питон и пробросить "правильно" в dll адреса импортируемых функций.

Так мне вроде и надо - из python вызвать вибрацию в геймпаде не вызывая ctypes. Может тогда подскажете "инструкцию для чайника"?

 

P.S. Попробовал код и утилиту из моей темы - под Win10 отработала как надо ;)

Изменено пользователем kharlashkin

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Так мне вроде и надо - из python вызвать вибрацию в геймпаде не вызывая ctypes. Может тогда подскажете "инструкцию для чайника"?

 

P.S. Попробовал код и утилиту из моей темы - под Win10 отработала как надо ;)

 

Нету для чайников, есть через три-пи***ды-колено, а всё благодаря ВГ.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Нету для чайников, есть через три-пи***ды-колено, а всё благодаря ВГ.

А я попробую, ведь если я правильно понял необходимый функционал мода никаким образом к ВГ не относится, разве что к их реализации python,..

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

просто надоело в ЛС одно и тоже писать по сто раз)

Добрый день хотел бы с Вами переговорить по поводу возможности создания мода одного но почему то ЛС писать не могу (( подскажите как с Вами связаться? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

Это было сложно, но я смог.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Мало что понял, поэтому вопросы:

  • Из-за чего WoT-клиент не поддерживает загрузку обычных .pyd?
  • Можно ли используя исходники pyd, скажем, Pillow, собрать тот, который загрузится?
  • Можно ли сделать pyd-обёртку, который загрузит обычный модуль pyd?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
(изменено)

Можно ли используя исходники pyd, скажем, Pillow, собрать тот, который загрузится?

Можно.

 

Можно ли сделать pyd-обёртку, который загрузит обычный модуль pyd?

Сделать можно, но займет много времени.

Там надо создать экспорт всех Python C API функций.

Вопрос - зачем?

 

Из-за чего WoT-клиент не поддерживает загрузку обычных .pyd?

В клиенте нет таблицы экспорта функций из питона. Изменено пользователем ShadowHunterRUS

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В клиенте нет таблицы экспорта функций из питона.

Лучше сказать по другому: libpython слинкован c WorldOfTanks.exe статически, а не динамически, как этого требуют штатные Python C Extensions.

Сделать можно, но займет много времени. Там надо создать экспорт всех Python C API функций. Вопрос - зачем?

На самом деле, не сильно много, такое себе медитативное залипалово в IDA. Дошел до 102 функций и надоело.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

На самом деле, не сильно много, такое себе медитативное залипалово в IDA. Дошел до 102 функций и надоело.
 

Поделитесь наработками?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
(изменено)

Поделитесь наработками?

https://bitbucket.org/Mixail/xvm.native/

Я там еще 20 функций наковырял...

Изменено пользователем ShadowHunterRUS

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.

×