Перейти к содержанию

Ошибка Открытия Программы Чз Скрипт Луа


misha

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

В скрипте задался открыть программу по событию. Глянул СЕ формат оператора shellexecute, выполняю скрипт, программа запускается, но выдает ошибку сама СЕ.

Код открытия проги:


shellExecute("C:\programma.exe")

Ошибка:


Error:Failure determining what programma.exe means

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

Это специфика языка Lua. Нужно использовать двойную косую черту. Одна косая черта это специальный символ.

Пример


path = "D:\\CodeCH\\Trainer OOP\\Test\\Test.exe"
shellExecute(path)

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

Сорри, у меня там и были 2 косые черты.

А причину нашел- дебаггер СЕ не хочет воспринимать относительный адрес вида:


address="programma.exe+9076"

Если писать, явный:


address=4204534

,

то все идет, но явного адреса я не знаю, он меняется пр и каждом запуске. Как быть?

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

1) Найти адрес;

2) Найти инструкцию, которая с ним работает поставив на адрес брейкпоинт;

3) Написать автоассемблерный скрипт, который будет записывать по адресу постоянное значение.

На форуме можно найти много примеров.

Дугой вариант искать цепочку указателей. Это может оказаться довольным долгим занятием. В прочем много времени может уйти на что угодно - это зависит от конкретной игры.

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

  • 2 недели спустя...

Привет всем. По теме еще вопросик:

хочу выставить не явный путь к файлу, а сделать так. чтобы он пускался из той же папки, где лежит трейнер.

Возможно ли такое?

Вопрос отпал, уже дошло :-D

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

Спс!

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

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

Попробуй выполнить код, который я привёл в автономном .exe трейнере. Ты же наверно такой тип трейнера используешь. Если использовать другие форматы: *.CT или *.CETRAINER или tiny exe, то их исполняет программа Cheat Engeine. Соответственно путь будет в первом случае трейнера, во втором случае Cheat Engine.

Если нужно найти пути *.CT или *.CETRAINER или tiny exe, то такой функции я не нашёл. Можно конечно попробовать найти эти пути из внутренностей процесса CE, но мне лень.

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

О, я не проводил эксперименты. Темп папку вывело, потому что трейнер распаковывается в неё и запускается оттуда. Тогда остаётся ещё несколько вариантов.

1) Найти сигнатуру данных в одном из процессов трейнера, которая позволит добраться до пути;

2) Попытаться через bat-файл найти имя пути;

3) Попытаться через dll-файл это сделать;

4) Попытаться это сделать через АА-скрипт (ищем процесс по имени и получаем его путь);

5) Обратиться к Дарк Байту на форуме с этим вопросом, может он добавит Lua-команду;

Я рекомендую написать на Visual Studio С++ консольную программку, которая получает директорию исполняемого файла по имени процесса (Вариант 4). Затем подсмотреть дизассемблированный код в отладке в Visual Studio. А затем переписать этот код на AA-скрипт. В нём ты по своей метке запишешь путь директории в которой находится трейнер и через Lua прочитаешь эту строку в переменную.

Вот тебе пример с функцией PDirName. Эту функцию и надо подсмотреть в дизассемблере и переписать на АА.

Author: KriPpLer


#include <windows.h>
#include <cstdio>
#include <wtsapi32.h>
#include <psapi.h>
char procs[4096];
/*/////////////////////////////////////
//Process username from Users sid
*//////////////////////////////////////

char* GetUserFromPID(PSID pUserSid)
{
if (pUserSid == NULL)
return false;
SID_NAME_USE snu;
char szUser[_MAX_PATH];
DWORD chUser = _MAX_PATH;
PDWORD pcchUser = &chUser;
char szDomain[_MAX_PATH];
DWORD chDomain = _MAX_PATH;
PDWORD pcchDomain = &chDomain;
strcpy(szUser, "Unknown");
if (::LookupAccountSid(NULL, pUserSid, szUser, pcchUser, szDomain, pcchDomain, &snu))
{
return(szUser);
}
else
{
return("Unknown");
}
return(szUser);
}
/*/////////////////////////////////////
//Exe path from process ID
*//////////////////////////////////////
char* PDirName(DWORD PID){
HANDLE Handle;
char buffer[MAX_PATH];
Handle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, PID);
if (Handle != 0)
{
if (GetModuleFileNameEx(Handle, 0, buffer, MAX_PATH) != 0)
{
return (buffer);
}else{
return ("Unknown");
}
CloseHandle(Handle);
}
}

/*/////////////////////////////////////
//Process list
*//////////////////////////////////////
char* PrcList()
{
ZeroMemory(&procs,sizeof(procs));
PWTS_PROCESS_INFO pProcessInfo;
DWORD ProcessCount = 0;
char szUserName[255];
DWORD Id = -1;
char buffer[4096];
if (WTSEnumerateProcesses(WTS_CURRENT_SERVER_HANDLE, 0, 1, &pProcessInfo, &ProcessCount))
{
for (DWORD CurrentProcess = 0; CurrentProcess < ProcessCount; CurrentProcess++)
{
Id = pProcessInfo[CurrentProcess].ProcessId;
sprintf(buffer,"Name: %s Process Id : %d Username: %s Path: %s\n",pProcessInfo[CurrentProcess].pProcessName,Id,GetUserFromPID(pProcessInfo[CurrentProcess].pUserSid),PDirName(Id));
strcat(procs,buffer);
}
}

ZeroMemory(&pProcessInfo,sizeof(pProcessInfo));
return (procs);
}

int main()
{
printf(PrcList());
return 0;
}

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

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.