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

Запись данных лежащих в регистре в файл


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

Добрый день.

Есть необходимость записать скрытую информацию (не выводимую на экран) в файл(.txt). Исследуемая игра не важна, я хочу понять суть. Правильно ли  думаю, что это можно сделать через AOB injection ?

На данный момент прочитал книгу по ассемблеру (МАSM x86-64), понимаю что происходит в диссасемблере, но не понимаю как использовать win api для записи нужных данных в файл. Ткните носом, куда смотреть :)

В сторону dll injection  не смотрел, так как не хватает знаний по плюсам.

 

 

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

1. Смотришь винапи, связанные с записью файлов. 

2. Смотришь правила вызова функций по соглашению stdcall в языке ассемблера

3. Пишешь код вызова нужных функций

4. PROFIT!!!

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

Еще есть другой вариант.
1. Ставишь хук на нужную точку или функцию
2. При срабатывании хука запоминаешь нужные тебе регистры
3. Выписываешь все в файл
4. Возвращаешь управление игровой функции

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

49 минут назад, roma912 сказал:

Еще есть другой вариант.

В смысле "другой"? Твой третий пункт - как раз 4 пункта моего "варианта". Вопрос топикстартера был в том, как использовать винапи, а ты ему проговариваешь его же вариант, по сути ) 

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

В 26.05.2021 в 22:53, investigator сказал:

На данный момент прочитал книгу по ассемблеру (МАSM x86-64), понимаю что происходит в диссасемблере, но не понимаю как использовать win api для записи нужных данных в файл.

Зачем винапи и ассемблер в этой задаче? Мне кажется лучше поставить бряк и написать код для логгирования на lua(если мы про cheat engine говорим) .

В 26.05.2021 в 22:53, investigator сказал:

Ткните носом, куда смотреть

например на функцию lua debugger_onBreakpoint. На форуме даже где-то статья или тема про это была и скорее всего не одна.

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

Я в свое время делал что-то подобное. Мне нужно было сохранить часть выделенной памяти в СЕ в файл в момент выполнения определенной игровой инструкции. Делал я это используя WinApi. Игра была 64 битная, поэтому было достаточно просто.

Вот большая часть кода. Я не помню сейчас уже что там и к чему в точности. Не хочется вспоминать. Но из некоторых комментарием должно быть понятно.

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

Как написал @Xipho, нужно лишь прочитать про соглашения, про правила передачи аргументов.

Спойлер

//-------------------------- Calculate Size For File
xor rax,rax
xor rcx,rcx
mov rax,r13
mov rcx,18 // 4 byte * 6 addresses of matrix
mul rcx
mov [File_Play_Write_Size],rax
//-------------------------- Get User Documents Folder Path
xor r13,r13
lea r13,[File_Folder_Ptr]
xor rdx,rdx
//---------
mov [rsp+20],r13
xor r9,r9
xor r8,r8
mov rdx,5
xor rcx,rcx
call SHGetFolderPathW
//-------------------------- Add To Path Name String "DR5Tool_Data"
xor rcx,rcx
xor r15,r15
xor r14,r14
//---------
lea r15,[File_Folder_Ptr]
lea r14,[Folder_For_Saveing_Playground_Data]
call Read_Objs_For_File_Save_scr_1_Combine_Folder_Name
//-------------------------- Check If "DR5Tool_Data" Folder Already Exist
xor rax,rax
xor rcx,rcx
//---------
lea rcx,[File_Folder_Ptr]
call PathFileExistsW
//-------------------------- Create Foler "DR5Tool_Data" If Not Exist Yet
cmp rax,1
je @f
xor rcx,rcx
//---------
xor rdx,rdx
lea rcx,[File_Folder_Ptr]
call CreateDirectoryW
//-------------------------- Combine Folder Name And FileName
@@:
xor rcx,rcx
xor r15,r15
xor r14,r14
//---------
lea r15,[File_Folder_Ptr]
lea r14,[DIRT5.exe+1E194E4] // Filename (withour path and extension)
lea r13,[File_Extension]
call Read_Objs_For_File_Save_scr_1_Combine_Folder_Name_And_FileName
//-------------------------- Create File
xor rax,rax
xor rdx,rdx
mov [rsp+28],rdx
mov [rsp+20],rdx
xor rcx,rcx
//---------
mov qword ptr [rsp+30],0
mov [rsp+28],#128
mov [rsp+20],2
xor r9,r9
xor r8,r8
mov rdx,40000000
lea rcx,[File_Folder_Ptr]
call CreateFileW
mov [File_Fandle],rax
//-------------------------- Write To File
xor r8,r8
xor rdx,rdx
xor rcx,rcx
//---------
mov qword ptr [rsp+20],0
xor r9,r9
mov r8,[File_Play_Write_Size]
lea rdx,[Obj_Data_Ram_Storage_For_Save_Load_Temp]
mov rcx,[File_Fandle]
call WriteFile
//-------------------------- Close Handle
xor rcx,rcx
//---------
mov rcx,[File_Fandle]
call CloseHandle
//-------------------------- Clear Memory Of File_Folder_Ptr
xor rcx,rcx
xor r15,r15
lea r15,[File_Folder_Ptr]
call Read_Objs_For_File_Save_scr_1_File_Folder_Ptr_Clear_Mem

 

 

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

  • 2 недели спустя...
В 28.05.2021 в 10:21, youneuoy сказал:

Зачем винапи и ассемблер в этой задаче? Мне кажется лучше поставить бряк и написать код для логгирования на lua(если мы про cheat engine говорим) .

например на функцию lua debugger_onBreakpoint. На форуме даже где-то статья или тема про это была и скорее всего не одна.

Правильно ли я понимаю план достижения цели (получения game state из игры) :

1. Находим по одиночке каждый интересующий параметр в игре с помощью СЕ.

2. Ставим на каждый адрес найденного параметра бряк.

3. Находим интересующее нас место в исполняемом коде (из бряка) и инжектим туда lua script , который будет сохранять нужные параметры на диск.

4. Профит ?!

 

Если так, то пошел курить lua.

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

8 часов назад, investigator сказал:

инжектим туда lua script

Это ты сможешь сделать только с помощью СЕ. Если твоя цель - достать эти данные, то вполне себе вариант. А если тебе нужно оформить это в виде отдельной программы, то лучше это делать на ассемблере.

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

В 10.06.2021 в 22:45, investigator сказал:

Правильно ли я понимаю план достижения цели (получения game state из игры) :

ага, примерно так и есть. Очень удобно на самом деле. Пример посмотри здесь, да и вообще рекомендую почитать немного СЕ вики.

Ещё можно вызывать lua функции из СЕ ассемблера, но с брейкпоинтами проще.

17 часов назад, Xipho сказал:

А если тебе нужно оформить это в виде отдельной программы, то лучше это делать на ассемблере.

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

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

7 часов назад, youneuoy сказал:

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

Я имел в виду вариант экстернал чита, который делает инжект кода. А если делать интернал - то да, можно не заморачиваться.

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

  • 1 месяц спустя...

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

Смотри, я бы посоветовал ДЛЛку на сях))

и использовать fstream самый быстрый(по кол-ву кода) способ.

что-то типо этого... да, это весь логер. fout(полное имя файла, все папки должны существовать, файл не обязательно), всегда в файл будет добавлятся так как папаметр std::ios_base::app - аппенд...

Это в принципе быстро и удобно)

void Logger::Out(const char* str)
{
	std::ofstream fout(this->m_strLogFileName.c_str(), std::ios_base::app);
	fout << std::string(str).c_str();
	fout.close();
}

Если будет интересно, пни в дискорде, расскажу как реализовать логер(тут я просто с своего кода дёрнул кусок, лениво было писать) Wi11ka#4371

 

Если принципиально надо вин-апи, то...

работае это примерно так

CreateFile - с параметром  OPEN_ALWAYS(0x04 вроде), он подойдет в случае если файла нету, то будет создан новый, если файл есть, то будет открыт существующий. 

Далее нам надо узнать, сколько занимает файл, что бы не писать в него с нуля и не перезаписывать инфу в нём. Остальные параметны можешь найти на MSDN я на память не помню.

 

GetFileSize(HANDLE - его возвращает CreateFile, NULL)

 

дале узнав размер ставим указатель на конец файла

SetFilePointer(HANDLE, Результат GetFileSize, 0, FILE_BEGIN(Вроде этот макрос равен 0))

 

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

для С++ я бы использовал sprintf... есть ли какие-то аналоги на WINAPI я без понятия, тут не подскажу.... Но чисто технически её можно будет вызвать

из рантайм библиотеки сишной, но это чисто технически, я извращенец ещё тот, но не на столько :D

 

Далее записать строку в файл WriteFile(

HANDLE,

Указатель на строку,

размер строки,

указатель на буфер, в который вернется кол-во записаных байт, 

NULL)

 

ну и закрыть хэндл 

CloseHandle(HANDLE) 

 

ну опять же учитывая, то что ты написал или то, что я понял из этого, вызвать эти функции ты сможешь, и передать им параметры :)

Надеюсь нечего не забыл, очень давно не юзал WINAPI. 

 

 

Изменено пользователем temtriss
СтолькА ГрамАтичИских АшибАк... вроде часть исправил)
Ссылка на комментарий
Поделиться на другие сайты

  • 3 недели спустя...
  • Xipho закрыл тема
Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...

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

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