Уведомления

Группа в Telegram: @pythonsu

#1 Июль 13, 2019 02:12:21

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9727
Репутация: +  843  -
Профиль   Отправить e-mail  

Объекты Python в чужом процессе

lngvar
Есть игра, в которой логика сделана на питоне.
Изучал память, не смог найти твердые указатели на нужные мне значения.
Наверняка они там есть, просто ты не смог их найти. Одного желания мало, нужно ещё всё знать.

lngvar
Значит инжектом своего потока
Покажи код инжекта.



Офлайн

#2 Июль 13, 2019 09:52:37

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Объекты Python в чужом процессе

lngvar
Что значит получить доступ к этому потоку ?
Согласен, недостаточно четко выразился. В АПИ ссылку на которую я вам давал ранее есть функции с аргументом строка. Если их вызывать, то питон будет их интерпретировать и менять свое состояние. Внешние программы так и делают. А как это сделать инжектом, модернизацией python27.dll или через апи вашей игры это уже дело техники. (Способы приведены в порядке уменьшения сложности реализации).



Офлайн

#3 Июль 16, 2019 01:56:46

lngvar
Зарегистрирован: 2019-07-11
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Объекты Python в чужом процессе

Значит ситуация такая.
Подключил инжектом dll

в ней выполнил код , как оказалось примитивно dir() не работает, как и ожидалось наверное.

 Py_Initialize();
PyRun_SimpleString("handle = open('c:\\output.txt', 'w')");
PyRun_SimpleString("z=15");
PyRun_SimpleString("t=dir()");
PyRun_SimpleString("handle.write(' '.join(t))");
PyRun_SimpleString("handle.close()");

Выдает один объект z , как и при подключении к любой другой программе.
Имеет ли значение, что мой интерпретатор Python34 , а в таргете python27 ?
Если это не важно, то наверное есть какой то нюанс, который позволит получить таки список всех объектов ?

Офлайн

#4 Июль 16, 2019 09:29:02

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Объекты Python в чужом процессе

lngvar
Выдает один объект z , как и при подключении к любой другой программе.
1. Так что вы хотите, вы вызвали Py_Initialize() повторно когда питон уже инициализирован, вы все что было потерли. По идее вы после этого получаете недетерменированное поведение.
lngvar
Имеет ли значение, что мой интерпретатор Python34 , а в таргете python27 ?
2. Ровно никакого значения не имеет. Питон нужной версии вставлен внутрь приложения именно он и используется. Очевидно можете сами спросить у него версию.
3. Насколько я понимаю вы дергаете питон асинхронно. Это очевидно рано или поздно приведет к краху. Когда это вопрос нагруженности интерпретатора основным приложением.
4. И самое ГЛАВНОЕ!!! точки с запятой не обязательны. Они сразу выдают в вас человека пишущего на C.



Отредактировано doza_and (Июль 16, 2019 09:32:44)

Офлайн

#5 Июль 16, 2019 12:06:11

lngvar
Зарегистрирован: 2019-07-11
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Объекты Python в чужом процессе

doza_and
1. Так что вы хотите, вы вызвали Py_Initialize() повторно когда питон уже инициализирован, вы все что было потерли. По идее вы после этого получаете недетерменированное поведение.
Я не буду с Вами спорить, как говорится - ростом еще не вышел. Но я слышал, что возможно вызвать в процессе два разных интерпретатора. И к тому же таргет подгружает дополнительно python34.dll.
Ничего не изменилось в таргете, работал как работал. Более того, я сделал длинный цикл, и по идее это должно было подвесить таргет.
doza_and
4. И самое ГЛАВНОЕ!!! точки с запятой не обязательны. Они сразу выдают в вас человека пишущего на C.
вот тут готов возразить, это исполняется в пространстве с++, а у нас видите ли, отступы имеют декоративный смысл ) как во всех культурных языках ))

Вечером проверю версию, в которой исполняется моя вставка на питоне. Но если я не использую Py_Initialize() то у меня подвисает dll и крашится таргет.

Подскажите пожалуйста, я не получаю GIL. А ведь это необходимо ? Как же тогда выполняется мой код.

Офлайн

#6 Июль 16, 2019 12:49:07

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9727
Репутация: +  843  -
Профиль   Отправить e-mail  

Объекты Python в чужом процессе

lngvar
Подключил инжектом dll
Полный код сбрось. Не надо на словах пересказывать.

doza_and
4. И самое ГЛАВНОЕ!!! точки с запятой не обязательны.
Он просто кусок кода сбросил, это функции из C API
https://docs.python.org/3/c-api/init.html#c.Py_Initialize



Офлайн

#7 Июль 16, 2019 21:44:41

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Объекты Python в чужом процессе

py.user.next
Он просто кусок кода сбросил
Ой да. это мои кривые глаза с утра показалось что точки с запятой внутри кавычек.

lngvar
Но я слышал, что возможно вызвать в процессе два разных интерпретатора.
Может их и можно сделать два. Только я хоть убей не понимаю зачем? Вы хотите получить доступ к интерпретатору используемому вашей игрой. Вместо этого вы запускаете второй интерпретатор никак не связанный с первым. Очевидно если вы его не проинициализировали то с ним работать нельзя. Но он вообще не нужен. Ну либо я вообще не понимаю что вы хотите сделать.

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



Офлайн

#8 Июль 16, 2019 22:24:08

lngvar
Зарегистрирован: 2019-07-11
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Объекты Python в чужом процессе

Это Dll . конечно так делать нельзя, запускать поток при инициализации dll. Это черевато крашем, но в данном случае это работает.Счетчик потока у таргета увеличивается, файл с отчетом создается.

#include <thread>
#include "C:\Python34\include\python.h"
DWORD WINAPI thread1(CONST LPVOID lpParam)
{
Py_Initialize();
PyRun_SimpleString("import sys");
PyRun_SimpleString("handle = open('c:\\output.txt',mode='w',encoding='utf-8')");
PyRun_SimpleString("z=15");
PyRun_SimpleString("t=dir()");
PyRun_SimpleString("vers=(sys.version)");
PyRun_SimpleString("handle.write('System version = ' + vers + '\\n')");
PyRun_SimpleString("handle.write(' '.join(t))");
PyRun_SimpleString("handle.close()");
return 0;
}
{
HANDLE th;
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
th=CreateThread(NULL, 0, &thread1,0, 0, NULL);
break;
}
}
а вот содержимое файла отчета .

 System version = 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (Intel)]
__builtins__ __doc__ __loader__ __name__ __package__ __spec__ handle sys z
Как видно, интерпретатор 3.4 , а таргет работает с python27.dll
Без Py_Initialize(); моментальный краш

doza_and
Только я хоть убей не понимаю зачем? Вы хотите получить доступ к интерпретатору используемому вашей игрой. Вместо этого вы запускаете второй интерпретатор никак не связанный с первым.
Наверное надо как-то получить объект интерпретатора таргета.
Есть какие то хитрости, попасть в его пространство ?

____________
Есть небольшая инструкция …
1. Read in the plain python code and store it in memory
2. Get the process ID for the client process
3. Attach to the process object
4. Allocate a remote thread
5. Populate the remote thread with code
6. Allocate and populate parameters
7. Start the remote thread
Execution is now taking place in the client process
8. Get a handle for the python DLL
9. Get a handle for

(a) PyRun_SimpleString – Runs a python string in the global interpreter context
(b) PyGILState_Ensure – Acquires the python Global Interpreter
Lock (GIL)
(c) PyGILState_Release – Releases the Global Interpreter Lock
10. Acquire the GIL
11. Execute the python code
12. Release the GIL
Может вам покажется это значимым

Отредактировано lngvar (Июль 16, 2019 22:47:15)

Офлайн

#9 Июль 16, 2019 23:17:41

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Объекты Python в чужом процессе

lngvar
Есть какие то хитрости, попасть в его пространство ?
Все хитрости возникают в вашем воображении и реализуются вашими руками. Тут все просто как дважды-два.
lngvar
Есть какие то хитрости, попасть в его пространство ?
Какое пространство! Вы в процессе с динамическими библиотеками, там одно адресное пространство.

Вызывать просто надо функции того интерпретатора с которым хотите работать.



Отредактировано doza_and (Июль 16, 2019 23:18:50)

Офлайн

#10 Июль 16, 2019 23:34:30

lngvar
Зарегистрирован: 2019-07-11
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Объекты Python в чужом процессе

doza_and
Вызывать просто надо функции того интерпретатора с которым хотите работать.
Как раз над этим сейчас работаю, но поверьте, это всего лишь код.
И вызывая *lpfun(..) из своей библы или из родной для процесса, я получу просто другой адрес для выполнения точно такого же кода, и это никак не может повлиять на контекст выполнения

Отредактировано lngvar (Июль 16, 2019 23:35:30)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version