Jump to content
Korean Random

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


fecell

Recommended Posts

Итак:

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

Edited by fecell
  • Upvote 15
  • Downvote 1
Link to comment
Short link
Share on other sites

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

 

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

Edited by kharlashkin
Link to comment
Short link
Share on other sites

 

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

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

 

'офтоп'

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

 

'как-то так'

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

 

  • Upvote 2
Link to comment
Short link
Share on other sites

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

 

'офтоп'

 

'как-то так'

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

 

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

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

Edited by kharlashkin
Link to comment
Short link
Share on other sites

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


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

  • Upvote 1
  • Downvote 1
Link to comment
Short link
Share on other sites

  • 4 weeks later...

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

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

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

Edited by kharlashkin
Link to comment
Short link
Share on other sites

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

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

 

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

 

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

Link to comment
Short link
Share on other sites

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

 

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

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

 

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

Edited by kharlashkin
Link to comment
Short link
Share on other sites

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

 

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

 

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

Link to comment
Short link
Share on other sites

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

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

Link to comment
Short link
Share on other sites

  • 4 months later...

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

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

Link to comment
Short link
Share on other sites

  • 3 months later...
  • 2 weeks later...

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

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

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

Можно.

 

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

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

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

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

 

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

В клиенте нет таблицы экспорта функций из питона.
Edited by ShadowHunterRUS
Link to comment
Short link
Share on other sites

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

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

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

На самом деле, не сильно много, такое себе медитативное залипалово в IDA. Дошел до 102 функций и надоело.
Link to comment
Short link
Share on other sites

 

 

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

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

Link to comment
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...