Форум сайта python.su
lngvarНаверняка они там есть, просто ты не смог их найти. Одного желания мало, нужно ещё всё знать.
Есть игра, в которой логика сделана на питоне.
Изучал память, не смог найти твердые указатели на нужные мне значения.
lngvarПокажи код инжекта.
Значит инжектом своего потока
Офлайн
lngvarСогласен, недостаточно четко выразился. В АПИ ссылку на которую я вам давал ранее есть функции с аргументом строка. Если их вызывать, то питон будет их интерпретировать и менять свое состояние. Внешние программы так и делают. А как это сделать инжектом, модернизацией python27.dll или через апи вашей игры это уже дело техники. (Способы приведены в порядке уменьшения сложности реализации).
Что значит получить доступ к этому потоку ?
Офлайн
Значит ситуация такая.
Подключил инжектом 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()");
Офлайн
lngvar1. Так что вы хотите, вы вызвали Py_Initialize() повторно когда питон уже инициализирован, вы все что было потерли. По идее вы после этого получаете недетерменированное поведение.
Выдает один объект z , как и при подключении к любой другой программе.
lngvar2. Ровно никакого значения не имеет. Питон нужной версии вставлен внутрь приложения именно он и используется. Очевидно можете сами спросить у него версию.
Имеет ли значение, что мой интерпретатор Python34 , а в таргете python27 ?
Отредактировано doza_and (Июль 16, 2019 09:32:44)
Офлайн
doza_andЯ не буду с Вами спорить, как говорится - ростом еще не вышел. Но я слышал, что возможно вызвать в процессе два разных интерпретатора. И к тому же таргет подгружает дополнительно python34.dll.
1. Так что вы хотите, вы вызвали Py_Initialize() повторно когда питон уже инициализирован, вы все что было потерли. По идее вы после этого получаете недетерменированное поведение.
doza_andвот тут готов возразить, это исполняется в пространстве с++, а у нас видите ли, отступы имеют декоративный смысл ) как во всех культурных языках ))
4. И самое ГЛАВНОЕ!!! точки с запятой не обязательны. Они сразу выдают в вас человека пишущего на C.
Офлайн
lngvarПолный код сбрось. Не надо на словах пересказывать.
Подключил инжектом dll
doza_andОн просто кусок кода сбросил, это функции из C API
4. И самое ГЛАВНОЕ!!! точки с запятой не обязательны.
Офлайн
py.user.nextОй да. это мои кривые глаза с утра показалось что точки с запятой внутри кавычек.
Он просто кусок кода сбросил
lngvarМожет их и можно сделать два. Только я хоть убей не понимаю зачем? Вы хотите получить доступ к интерпретатору используемому вашей игрой. Вместо этого вы запускаете второй интерпретатор никак не связанный с первым. Очевидно если вы его не проинициализировали то с ним работать нельзя. Но он вообще не нужен. Ну либо я вообще не понимаю что вы хотите сделать.
Но я слышал, что возможно вызвать в процессе два разных интерпретатора.
Офлайн
Это 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
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)
Офлайн
lngvarВсе хитрости возникают в вашем воображении и реализуются вашими руками. Тут все просто как дважды-два.
Есть какие то хитрости, попасть в его пространство ?
lngvarКакое пространство! Вы в процессе с динамическими библиотеками, там одно адресное пространство.
Есть какие то хитрости, попасть в его пространство ?
Отредактировано doza_and (Июль 16, 2019 23:18:50)
Офлайн
doza_andКак раз над этим сейчас работаю, но поверьте, это всего лишь код.
Вызывать просто надо функции того интерпретатора с которым хотите работать.
Отредактировано lngvar (Июль 16, 2019 23:35:30)
Офлайн