SiriusED Опубликовано 17 августа, 2014 Поделиться Опубликовано 17 августа, 2014 Во общем есть dll'ка, она инжектится к D3D9 игре и через D3D хук, выводит там текст "000" по координатам.Вопрос такой: каким образом я могу изменить этот текст и координаты из своего приложения что б dll'ка не выводила один и тот же текст а на пример я мог его как то задавать непосредственно из своего приложения? Или такое сделать нельзя? Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 17 августа, 2014 Поделиться Опубликовано 17 августа, 2014 /*---------------------------------------------------------------------------*/Привет!Между модулями PE файла можно сделать "общую" секцию памяти, которая будет видна из обоих (всех) модулей. Называется это shared memory section. Подробнее можно почитать [тут] или спросить у [Coder]'а, у него и видеоуроки на эту тему были./*---------------------------------------------------------------------------*/ Ссылка на комментарий Поделиться на другие сайты Поделиться
SiriusED Опубликовано 17 августа, 2014 Автор Поделиться Опубликовано 17 августа, 2014 Так, правильно ли я понял, есть игра, я инжектю в нее длл которая создает "shared memory section" и потом я из своего совсем левого приложения программно могу что-то записать в эту секцию и моя заинжекченная дллка это сможет прочесть и заюзать да? Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 17 августа, 2014 Поделиться Опубликовано 17 августа, 2014 Почти правильно. Shared секция будет создана в адресном пространстве твоей длл-ки. И доступ туда ты сможешь получить, подгрузив эту же дллку в пространство своего процесса. Ссылка на комментарий Поделиться на другие сайты Поделиться
SiriusED Опубликовано 17 августа, 2014 Автор Поделиться Опубликовано 17 августа, 2014 Ага, вот теперь понял. Ну как с этой секцией работать думаю найду примеры в инете что б вас уже не доставать, если что не пойму то еще спрошу.И так для справки, это единственный способ взаимодействия в заинжекченной дллкой? Ссылка на комментарий Поделиться на другие сайты Поделиться
RisimO Опубликовано 18 августа, 2014 Поделиться Опубликовано 18 августа, 2014 Почитай про пайпы -> GoogleНу ещё есть сокеты -> ПримерТут ещё что то есть.Ещё тут Ссылка на комментарий Поделиться на другие сайты Поделиться
SiriusED Опубликовано 18 августа, 2014 Автор Поделиться Опубликовано 18 августа, 2014 Ну меня в чем задумка то... Хочу сделать dll'ку которая будет просто выводить заданный текст по заданным координатам в окне игры. И что б эту dll'ку можно было инжектить в процесс игры, изменять значение выводимого текста, координат, размера шрифта итд,..Например: Пишу приложение на C#, инжектю мою dll'ку в процесс игры, запускаю свое приложение написанное на C#, ввожу в поле нужный мне текст "OneTwoThre", dll'ка принимает этот текст и в окне игры выводит его, меняю текст на другой, жму применить, и dll'ка выводит уже другой текст...Вот какой мне метод под такую идею подойдет лучше всего? Думаю тут только "shared memory section" и прокатит... Ссылка на комментарий Поделиться на другие сайты Поделиться
RisimO Опубликовано 18 августа, 2014 Поделиться Опубликовано 18 августа, 2014 Ну меня в чем задумка то... Хочу сделать dll'ку которая будет просто выводить заданный текст по заданным координатам в окне игры. И что б эту dll'ку можно было инжектить в процесс игры, изменять значение выводимого текста, координат, размера шрифта итд,..Например: Пишу приложение на C#, инжектю мою dll'ку в процесс игры, запускаю свое приложение написанное на C#, ввожу в поле нужный мне текст "OneTwoThre", dll'ка принимает этот текст и в окне игры выводит его, меняю текст на другой, жму применить, и dll'ка выводит уже другой текст...Вот какой мне метод под такую идею подойдет лучше всего? Думаю тут только "shared memory section" и прокатит...Тут вы мне вынесли мозг, что мешате открыть сокет сервер на стороне dll ? И выводить всё, что присылают.Что мешает читать текст из пайпы и выводить его? Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 18 августа, 2014 Поделиться Опубликовано 18 августа, 2014 /*---------------------------------------------------------------------------*/А зачем нужен сокет в чисто настольком приложении? По мне так достаточно EditBox и ReadProcessMemory \ WriteProcessMemory, но shared-секция удобнее - её один раз организовать и никаких дополнительных функций вызывать не придётся./*---------------------------------------------------------------------------*/ Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 18 августа, 2014 Поделиться Опубликовано 18 августа, 2014 shared секция подразумевает единое адресное пространство в пределах этой секции у приложений A, B, C, D (неогр.) и т.д.Никакие сокеты, пайпы и другая лабуда не нужна! Прекратите путать человека уже наконец! Ссылка на комментарий Поделиться на другие сайты Поделиться
Laziz Опубликовано 18 августа, 2014 Поделиться Опубликовано 18 августа, 2014 Ну меня в чем задумка то... Хочу сделать dll'ку которая будет просто выводить заданный текст по заданным координатам в окне игры. И что б эту dll'ку можно было инжектить в процесс игры, изменять значение выводимого текста, координат, размера шрифта итд,..Например: Пишу приложение на C#, инжектю мою dll'ку в процесс игры, запускаю свое приложение написанное на C#, ввожу в поле нужный мне текст "OneTwoThre", dll'ка принимает этот текст и в окне игры выводит его, меняю текст на другой, жму применить, и dll'ка выводит уже другой текст...Вот какой мне метод под такую идею подойдет лучше всего? Думаю тут только "shared memory section" и прокатит...Та прога который я дал, делает тоже самое, Только немного надо понастроить, и будет работать на всех версиях ДиректИкса и где хочешь там и будет выводить сообщение, плюс, С++ там не участвует, все на C# и длл тоже. (ссылку дал на прошлой теме). (Ну... Это все к тому, если тебя тянет на С#)) Ссылка на комментарий Поделиться на другие сайты Поделиться
SiriusED Опубликовано 18 августа, 2014 Автор Поделиться Опубликовано 18 августа, 2014 Та прога который я дал, делает тоже самое, Только немного надо понастроить, и будет работать на всех версиях ДиректИкса и где хочешь там и будет выводить сообщение, плюс, С++ там не участвует, все на C# и длл тоже. (ссылку дал на прошлой теме). (Ну... Это все к тому, если тебя тянет на С#))Имеешь введу там реализовано тоже через "shared memory section"?Ну а так то я понимаю что возможно там и будет работать но я как бы учусь, и интересно реализовать самому, при том что уже как бы есть рабочая dll'ка с хуком...Во общем понятно, буду копать инфу об "shared memory section", если что еще спрошу по этой теме. Ссылка на комментарий Поделиться на другие сайты Поделиться
SiriusED Опубликовано 19 августа, 2014 Автор Поделиться Опубликовано 19 августа, 2014 Во общем почитал, написал код и работает все просто замечательно. но как всегда есть проблема...Короче как из c# передать char* в dll'ку?пробовал передавать: string, StringBuilder, IntPtr ничего не работает, на одних зависает игра, на других кракозябры вместо текста...Подскажите как нужно писать в коде(c#) что б передать строку(char*) в dll'ку. Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 20 августа, 2014 Поделиться Опубликовано 20 августа, 2014 var charArray = new char[кол-во символов]; Ссылка на комментарий Поделиться на другие сайты Поделиться
SiriusED Опубликовано 20 августа, 2014 Автор Поделиться Опубликовано 20 августа, 2014 Все таки проблема во общем не в передаче данных, через 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));}Во общем гляньте в чом может быть косяк? Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 20 августа, 2014 Поделиться Опубликовано 20 августа, 2014 Эмм... Отладка, не, не слышал?Веди отладочные логи, мы гадать на кофейной гуще не умеем. Ссылка на комментарий Поделиться на другие сайты Поделиться
SiriusED Опубликовано 20 августа, 2014 Автор Поделиться Опубликовано 20 августа, 2014 Ну я же написал что текст выводит во первых без ошибки во обще, просто выводятся кракозябры. Потом, текст приходит нормальный и записывается в переменную разделяемой памяти нормально, о чом свидетельствуют два 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", то выводит нормально... Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 20 августа, 2014 Поделиться Опубликовано 20 августа, 2014 Значит, где-то при передаче строки возникает ошибка. Твоя задача - выловить ее. Ссылка на комментарий Поделиться на другие сайты Поделиться
SiriusED Опубликовано 20 августа, 2014 Автор Поделиться Опубликовано 20 августа, 2014 Ну а вот я тут подумал, а если не char* принимать а char[], а потом его перевести в char* уже в dll'ке, стоит пробовать такое или будет тот же результат?А по этому что выше сейчас попробую проверить что в строке прямо перед выводом и после вывода. Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 20 августа, 2014 Поделиться Опубликовано 20 августа, 2014 А какая разница? И то, и другое, по сути, есть указатели на массив символов. Ссылка на комментарий Поделиться на другие сайты Поделиться
SiriusED Опубликовано 20 августа, 2014 Автор Поделиться Опубликовано 20 августа, 2014 Короче да, понятия не имею как, но текст, уже перед выводом в моей "hookedEndScene" искажается, такое ощущение что читается не тот указатель...Но почему? Я же записал эту переменную в секцию разделяемой памяти... что за ппц... Ох, и вот что мне пишет при компиляции еще(только что заметил)"LINK : warning LNK4092: shared writable section 'sms' contains relocations; image may not run correctly" Да уж, рано я обрадовался что с первого раза все заработало...Короче да, проблема именно в секции разделяемой памяти, строки там надо как то по другому записывать что б указатели на них нормально потом работали. Так что ищу помощь в этом деле... Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 20 августа, 2014 Поделиться Опубликовано 20 августа, 2014 Как вариант - в длл-ке в эту секцию выделять какой-то фиксированный буфер, а в приложении в этот буфер писать. Память разделяемая, и, по сути, буфер, я так полагаю, должен нормально считаться. Возможно, дело в том, что ты используешь решетки с их встроенным классом строк, но не берусь утверждать на сто процентов. Ссылка на комментарий Поделиться на другие сайты Поделиться
SiriusED Опубликовано 20 августа, 2014 Автор Поделиться Опубликовано 20 августа, 2014 Да жесть просто какая-то!Нашел вот такую вот реализацию:#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ГБ памяти и все... Я так понял где то надо дисповсить что-то, но что черт пойми... Нук гляньте может увидите вы... Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 20 августа, 2014 Поделиться Опубликовано 20 августа, 2014 Так у тебя при каждом вызове создается копия строки, конечно, она память скушает. Надо освобождать ее после вывода текста. Ссылка на комментарий Поделиться на другие сайты Поделиться
SiriusED Опубликовано 20 августа, 2014 Автор Поделиться Опубликовано 20 августа, 2014 Я не понимаю, как она может создаватся так много раз если я юзаю SetOptions(), только один раз, забиваю туда строку и все..А в хуке эта переменная только используется. Или все не так?, я не догоню впритык... И что именно нужно освобождать? В самом хуке надо освобождать я так понимаю да? Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения