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

Как работать в заинжекченой dll


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

Во общем есть dll'ка, она инжектится к D3D9 игре и через D3D хук, выводит там текст "000" по координатам.

Вопрос такой: каким образом я могу изменить этот текст и координаты из своего приложения что б dll'ка не выводила один и тот же текст а на пример я мог его как то задавать непосредственно из своего приложения? Или такое сделать нельзя?

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

/*---------------------------------------------------------------------------*/

Привет!

Между модулями PE файла можно сделать "общую" секцию памяти, которая будет

видна из обоих (всех) модулей. Называется это shared memory section. Подробнее

можно почитать [тут] или спросить у [Coder]'а, у него и видеоуроки на эту тему

были.

/*---------------------------------------------------------------------------*/

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

Так, правильно ли я понял, есть игра, я инжектю в нее длл которая создает "shared memory section" и потом я из своего совсем левого приложения программно могу что-то записать в эту секцию и моя заинжекченная дллка это сможет прочесть и заюзать да?

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

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

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

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

И так для справки, это единственный способ взаимодействия в заинжекченной дллкой?

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

Ну меня в чем задумка то... Хочу сделать dll'ку которая будет просто выводить заданный текст по заданным координатам в окне игры. И что б эту dll'ку можно было инжектить в процесс игры, изменять значение выводимого текста, координат, размера шрифта итд,..

Например: Пишу приложение на C#, инжектю мою dll'ку в процесс игры, запускаю свое приложение написанное на C#, ввожу в поле нужный мне текст "OneTwoThre", dll'ка принимает этот текст и в окне игры выводит его, меняю текст на другой, жму применить, и dll'ка выводит уже другой текст...

Вот какой мне метод под такую идею подойдет лучше всего? Думаю тут только "shared memory section" и прокатит...

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

Ну меня в чем задумка то... Хочу сделать dll'ку которая будет просто выводить заданный текст по заданным координатам в окне игры. И что б эту dll'ку можно было инжектить в процесс игры, изменять значение выводимого текста, координат, размера шрифта итд,..

Например: Пишу приложение на C#, инжектю мою dll'ку в процесс игры, запускаю свое приложение написанное на C#, ввожу в поле нужный мне текст "OneTwoThre", dll'ка принимает этот текст и в окне игры выводит его, меняю текст на другой, жму применить, и dll'ка выводит уже другой текст...

Вот какой мне метод под такую идею подойдет лучше всего? Думаю тут только "shared memory section" и прокатит...

Тут вы мне вынесли мозг, что мешате открыть сокет сервер на стороне dll ? И выводить всё, что присылают.

Что мешает читать текст из пайпы и выводить его?

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

/*---------------------------------------------------------------------------*/

А зачем нужен сокет в чисто настольком приложении? По мне так достаточно

EditBox и ReadProcessMemory \ WriteProcessMemory, но shared-секция удобнее -

её один раз организовать и никаких дополнительных функций вызывать не придётся.

/*---------------------------------------------------------------------------*/

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

shared секция подразумевает единое адресное пространство в пределах этой секции у приложений A, B, C, D (неогр.) и т.д.

Никакие сокеты, пайпы и другая лабуда не нужна! Прекратите путать человека уже наконец!

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

Ну меня в чем задумка то... Хочу сделать dll'ку которая будет просто выводить заданный текст по заданным координатам в окне игры. И что б эту dll'ку можно было инжектить в процесс игры, изменять значение выводимого текста, координат, размера шрифта итд,..

Например: Пишу приложение на C#, инжектю мою dll'ку в процесс игры, запускаю свое приложение написанное на C#, ввожу в поле нужный мне текст "OneTwoThre", dll'ка принимает этот текст и в окне игры выводит его, меняю текст на другой, жму применить, и dll'ка выводит уже другой текст...

Вот какой мне метод под такую идею подойдет лучше всего? Думаю тут только "shared memory section" и прокатит...

Та прога который я дал, делает тоже самое, Только немного надо понастроить, и будет работать на всех версиях ДиректИкса и где хочешь там и будет выводить сообщение, плюс, С++ там не участвует, все на C# и длл тоже. (ссылку дал на прошлой теме). (Ну... Это все к тому, если тебя тянет на С#))

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

Та прога который я дал, делает тоже самое, Только немного надо понастроить, и будет работать на всех версиях ДиректИкса и где хочешь там и будет выводить сообщение, плюс, С++ там не участвует, все на C# и длл тоже. (ссылку дал на прошлой теме). (Ну... Это все к тому, если тебя тянет на С#))

Имеешь введу там реализовано тоже через "shared memory section"?

Ну а так то я понимаю что возможно там и будет работать но я как бы учусь, и интересно реализовать самому, при том что уже как бы есть рабочая dll'ка с хуком...

Во общем понятно, буду копать инфу об "shared memory section", если что еще спрошу по этой теме.

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

Во общем почитал, написал код и работает все просто замечательно. но как всегда есть проблема...

Короче как из c# передать char* в dll'ку?

пробовал передавать: string, StringBuilder, IntPtr ничего не работает, на одних зависает игра, на других кракозябры вместо текста...

Подскажите как нужно писать в коде(c#) что б передать строку(char*) в dll'ку.

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

Все таки проблема во общем не в передаче данных, через StringBuilder все нормально передается, но проблема получается черт знает в чем даже, во общем вот код:

extern "C" __declspec(dllexport) void SetOptions(char* string);#pragma data_seg("sms")char* viewString = "Test1";#pragma data_seg()#pragma comment(linker, "/section:sms,RWS")extern "C" __declspec(dllexport)void SetOptions(char* string = "Test1"){	MessageBox(NULL, string, "FromDll", 0); // Выводит правильно	viewString = string;	MessageBox(NULL, viewString, "FromDll", 0); // Выводит правильно тоже...}// А вот проблема скорее всего вот тут:HRESULT WINAPI hookedEndScene(LPDIRECT3DDEVICE9 pDevice){	RECT pRect = RECT{ 50, 50, 150, 150 };	// Вот скорее всего вот в этих строках создания и вывода текста.	D3DXCreateFont(pDevice, 16, 0, FW_NORMAL, 0, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, ANTIALIASED_QUALITY, DEFAULT_PALETTE | FF_DONTCARE, "Arial", &font);	font->DrawText(NULL, viewString, -1, &pRect, 0, D3DCOLOR_ARGB(255, 230, 230, 230));}

Во общем гляньте в чом может быть косяк?

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

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

	D3DXCreateFont(pDevice, 16, 0, FW_NORMAL, 0, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, ANTIALIASED_QUALITY, DEFAULT_PALETTE | FF_DONTCARE, "Arial", &font);	font->DrawText(NULL, viewString, -1, &pRect, 0, D3DCOLOR_ARGB(255, 230, 230, 230));

Вот и спрашиваю гляньте что в этих строках может быть кривое, что давало бы такой результат вывода текста на экран? Но с другой стороны если просто заинжектить dll'ку с дефолтным viewString = "Test1", то выводит нормально...

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

Ну а вот я тут подумал, а если не char* принимать а char[], а потом его перевести в char* уже в dll'ке, стоит пробовать такое или будет тот же результат?

А по этому что выше сейчас попробую проверить что в строке прямо перед выводом и после вывода.

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

Короче да, понятия не имею как, но текст, уже перед выводом в моей "hookedEndScene" искажается, такое ощущение что читается не тот указатель...Но почему? Я же записал эту переменную в секцию разделяемой памяти... что за ппц...

 

Ох, и вот что мне пишет при компиляции еще(только что заметил)

"LINK : warning LNK4092: shared writable section 'sms' contains relocations; image may not run correctly"

 

Да уж, рано я обрадовался что с первого раза все заработало...


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

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

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

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

Да жесть просто какая-то!

Нашел вот такую вот реализацию:

#pragma data_seg("sms")char viewString[512] = "Test1";#pragma data_seg()#pragma comment(linker, "/section:sms,RWS")extern "C" __declspec(dllexport)void SetOptions(char* string = "Test1"){    lstrcpy(viewString, string); // Вот тут копирую string в viewString}

Ну и выводит теперь нормально, но через секунд 10-20 забивается 16ГБ памяти и все... Я так понял где то надо дисповсить что-то, но что черт пойми...  Нук гляньте может увидите вы...

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

Я не понимаю, как она может создаватся так много раз если я юзаю SetOptions(), только один раз, забиваю туда строку и все..

А в хуке эта переменная только используется.

 

Или все не так?, я не догоню впритык...

 

И что именно нужно освобождать? В самом хуке надо освобождать я так понимаю да?

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

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

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

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