Сейчас на форуме: Rio, tyns777, zombi-vadim (+7 невидимых) |
eXeL@B —› Программирование —› C# Вызвать функцию по адресу |
Посл.ответ | Сообщение |
|
Создано: 05 ноября 2014 21:12 · Личное сообщение · #1 |
|
Создано: 05 ноября 2014 21:34 · Личное сообщение · #2 |
|
Создано: 05 ноября 2014 22:21 · Личное сообщение · #3 |
|
Создано: 05 ноября 2014 22:26 · Личное сообщение · #4 Uz_ Подробней опишите условия. Я бы например добавил атрибут MarshalByRefObject к нужному мне методу, прогрузил бы приложение через свой лоадер в отдельный AppDomain и вызывал бы требуемый метод из этого лоадера. Но это не сработает в ряде случаев. ----- Флэш, ява, дотнет - на завтрак, обед и ужин. Unity3D на закуску. |
|
Создано: 05 ноября 2014 22:45 · Личное сообщение · #5 4kusNick пишет: Подробней опишите условия. Есть значит игруха, ее процесс - Gothic2.exe, в игре по адресу 00402AF0 находится конструктор класса zSTRING, воот. Нужно вызвать этот конструктор, а позже и другие функции. На C++ можно подгрузить dll в процесс и вызвать через ассемблерную вставку по типу call адресс. |
|
Создано: 05 ноября 2014 23:09 · Личное сообщение · #6 На C# примерно так же, только надо еще .NET Runtime сначала загрузить в процесс, потом загрузить сборку, в ней создать делегат и заюзать |
|
Создано: 05 ноября 2014 23:16 · Личное сообщение · #7 |
|
Создано: 06 ноября 2014 00:09 · Поправил: Nimnul · Личное сообщение · #8 Есть такой это будет выглядеть как то так: ... ldarg.0 calli ... Будет вызвана функция по адресу adr. Но если тебе нужно передать в функцию параметры, их нужно перед вызовом положить на стек. Если тебе известна сигнатура вызываемой функции напиши ее, я помогу с msil ----- have a nice day |
|
Создано: 06 ноября 2014 00:19 · Личное сообщение · #9 Мне тут проще вариант дали, только вот нужные функции типа Write и флаг All не нашел, а так: Code:
Добавлено спустя -58 минут Нашел так-же такое дело на Delphi: Code:
|
|
Создано: 06 ноября 2014 00:27 · Поправил: Nimnul · Личное сообщение · #10 |
|
Создано: 06 ноября 2014 00:28 · Личное сообщение · #11 Nimnul пишет: Что то ничего простого не вижу . Я как то мутил вызов функций через подмену возвращаемого адреса, и то выглядело менее страшно и работало почте таже быстро как обычный call Мне бы примерчик. Добавлено спустя -59 минут Nimnul пишет: Что то ничего простого не вижу . Я как то мутил вызов функций через подмену возвращаемого адреса, и то выглядело менее страшно и работало почти также быстро как обычный call Блин, и вообще, через dll не желательно в моем случае. |
|
Создано: 06 ноября 2014 00:32 · Личное сообщение · #12 |
|
Создано: 06 ноября 2014 00:37 · Личное сообщение · #13 А по делу - не говори если не знаешь. А я продолжаю утверждать, что никак. Вначале нам надо заинжектить свой Т.к. целевой процесс сам по себе не на дотнете, то, как вы понимаете, некоторые из описанных тут вариантов ну вообще не подходят. Но, допустим, заинжектились и всё получилось. Дальше вы начинаете вызвать этот конструктор, а позже и другие функции (цитата). И тут вы понимаете, что тупо дергать функции из другого приложения - вообще не лучшая идея. Они могут быть связаны друг с другом объектами синхронизации, инициализировать глобальные переменные, синглтоны. В общем, скорее всего, желаемые результат не будет достигнут. Поэтому возвращаемся к сокращённому варианту "НИКАК". Вы просто неправильно решаете задачу. ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 06 ноября 2014 00:41 · Личное сообщение · #14 ARCHANGEL пишет: А по делу - не говори если не знаешь. А я продолжаю утверждать, что никак. Вначале нам надо заинжектить свой говнокод на дотнете, который для этих целей ну совсем не подходит. Как это сделать, описано --> тут <-- Т.к. целевой процесс сам по себе не на дотнете, то, как вы понимаете, некоторые из описанных тут вариантов ну вообще не подходят. Но, допустим, заинжектились и всё получилось. Дальше вы начинаете вызвать этот конструктор, а позже и другие функции (цитата). И тут вы понимаете, что тупо дергать функции из другого приложения - вообще не лучшая идея. Они могут быть связаны друг с другом объектами синхронизации, инициализировать глобальные переменные, синглтоны. В общем, скорее всего, желаемые результат не будет достигнут. Поэтому возвращаемся к сокращённому варианту "НИКАК". Вы просто неправильно решаете задачу. То что я пытаюсь сделать - уже реализовано, и не через dll. |
|
Создано: 06 ноября 2014 00:44 · Поправил: ARCHANGEL · Личное сообщение · #15 Пока писал, появились и другие посты. Т.е. оказывается, что и классические способы для вас подходят, и вы всё ещё не оставили планов на изврат. Ну, тогда всё достаточно тривиально. Определяетесь с разрядностью игры, я так понял, что там х86. Потом выделяете память в другом процессе, пишете туда шеллкод, передаёте на него управление. Пройдёмся по этапам. Выше код уже привели, разберём суть. 1. Выделить память. Для этого юзается VirtualAlloEx. Для его вызова нам нужен дескриптор процесса, в котором память будет выделяться. Для этого дёргаем OpenProcess. 2. Шеллкод в самом простом случае - набор инструкций push и retn в конце. push передают параметры (если соглашение stdcall или cdecl), а последние push retn эмулируют call. Так просто писать проще, потому что push базонезависимы. 3. Выполнить это можно, дёрнув CreateRemoteThread. И, конечно, это всё же не очень удобно на дотнете. Но я практически уверен, что это не то, что нужно сделать. Вот опишите задачу, какая ваша конечная цель? Зачем вам дёргать эту функцию? ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 06 ноября 2014 00:45 · Поправил: Uz_ · Личное сообщение · #16 Nimnul пишет: Еще раз если я правильно понял у тебя есть C# из него тебе надо вызвать Native по адресу? Есть процесс игры, в нем по некому адресу лежит функция, мне эту функцию надо вызвать. Проще говоря, представим программу(a.exe) в которой есть функция, к примеру: void Func(){ MessageBox.Show("abc"); } Функция располагается допустим по адресу 00402AF0 А мы, через нашу программу на C#(b.exe) вызываем эту функцию из памяти программы a.exe Мы вызываем и получаем MessageBox с текстом abc. |
|
Создано: 06 ноября 2014 01:10 · Личное сообщение · #17 Uz_ я вот тут все это читал.. и молчал.. все что касается .НЕТ както хорошо обсуждалось с пол года назад.. НЕТУ ТАМ по факту адресов.. .НЕТ предкомпиляцию делает.. код перед выполнением. я может сильно не прав.. но как по мне.. надо решать вопрос либо на стадии патчинга, чтоб уже в память разворачивался правильный попатченный код, либо уже в памяти ловить. вообще то все это попахивает дурным скрещиванием гибона с насорогом ----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме.... |
|
Создано: 06 ноября 2014 03:07 · Личное сообщение · #18 Uz_ пишет: А мы, через нашу программу на C#(b.exe) вызываем эту функцию из памяти программы a.exe Ну тогда вызов функции это меньшее из проблем что тебя ожидает. Тут надо делать инъекцию длл. А делать инъекцию .Net длл, в процесс не .Net это жесть, потому что нужно подгрузить весь рантайм. Правильно делать dll на C и мутить дальше. ----- have a nice day |
|
Создано: 06 ноября 2014 03:23 · Личное сообщение · #19 Nimnul пишет: Ну тогда вызов функции это меньшее из проблем что тебя ожидает. Тут надо делать инъекцию длл. А делать инъекцию .Net длл, в процесс не .Net это жесть, потому что нужно подгрузить весь рантайм. Правильно делать dll на C и мутить дальше. я вот человеку пытаюсь об этапах рассказать.. но чую что не был услышан ----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме.... |
|
Создано: 06 ноября 2014 13:01 · Поправил: Uz_ · Личное сообщение · #20 Nimnul пишет: Ну тогда вызов функции это меньшее из проблем что тебя ожидает. Тут надо делать инъекцию длл. А делать инъекцию .Net длл, в процесс не .Net это жесть, потому что нужно подгрузить весь рантайм. Правильно делать dll на C и мутить дальше. Проехали, пробовал на С++ - ничего. Инжектил dll'ку и через нее исполнял команды - программа не реагирует а dll'ка останавливается на вызове. Вот собсна код вызова:взят из проекта Gothic 2 Ext Code:
И на Delphi пробовал, но там программа попросту висла Добавлено спустя -58 минут VodoleY пишет: Uz_ я вот тут все это читал.. и молчал.. все что касается .НЕТ както хорошо обсуждалось с пол года назад.. НЕТУ ТАМ по факту адресов.. .НЕТ предкомпиляцию делает.. код перед выполнением. я может сильно не прав.. но как по мне.. надо решать вопрос либо на стадии патчинга, чтоб уже в память разворачивался правильный попатченный код, либо уже в памяти ловить. вообще то все это попахивает дурным скрещиванием гибона с насорогом Может мы друг друга не так поняли? В .Net нет адресов, но я то через программу на Net работаю с обычной программой? Почему бы и нет? Ведь в Net есть Write\Read ProcessMemory Добавлено спустя -55 минут Вот кстати код dll'ки и инжектора на Delphi http://rghost.ru/private/58913448/cae3293cf30e222b4edb776d09dc6b65 |
|
Создано: 06 ноября 2014 13:19 · Личное сообщение · #21 Uz_ Возвращаемся к пройденному материалу. Они могут быть связаны друг с другом объектами синхронизации, инициализировать глобальные переменные, синглтоны. В общем, скорее всего, желаемые результат не будет достигнут. Но в вашем случае виной всему какие-то корявые реализации людей, пишущих какой-то наркоманский код: Code:
Это вообще тут к чему? Мне влом это комментировать, но я не могу придумать, как через этот макрос вызвать что-то, кроме краша. Посмотрите в иде, как делается вызов функции. ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 06 ноября 2014 13:24 · Личное сообщение · #22 |
|
Создано: 06 ноября 2014 13:28 · Личное сообщение · #23 В IDA Pro. Вы ж как-то нашли адрес, где, по вашему мнению, начинается код конструктора. Вот там и посмотрите, как выглядит вызов фунции. В Ida это можно сделать поиском xref. (Х на функции надавите, и счастье). ----- Stuck to the plan, always think that we would stand up, never ran. | Сообщение посчитали полезным: Uz_ |
|
Создано: 06 ноября 2014 13:28 · Личное сообщение · #24 Кстати мне тот код через CheatEngine удалось заинжектить в процесс. Добавлено спустя -56 минут ARCHANGEL пишет: В IDA Pro. Вы ж как-то нашли адрес, где, по вашему мнению, начинается код конструктора. Вот там и посмотрите, как выглядит вызов фунции. В Ida это можно сделать поиском xref. (Х на функции надавите, и счастье). А, понял, спасибо вам. Щас попробую Добавлено спустя -46 минут Ну, вызов осуществляется через Code:
|
|
Создано: 06 ноября 2014 17:27 · Поправил: Nimnul · Личное сообщение · #25 Uz_ пишет: Проехали, пробовал на С++ - ничего. Инжектил dll'ку и через нее исполнял команды - программа не реагирует а dll'ка останавливается на вызове. Вот собсна код вызова:взят из проекта Gothic 2 Ext Если у вас не получилось сделать на C++ то на C# подавно не получиться. Этож класика инъекция длл в процесс, по этому поводу есть куча мануалов и примеров. А раз программа не реагирует, это не значит что язык плохой... Нужно брать отладчик и разбираться что произошло. Возможно вы использовали не то соглашение о вызове функций их несколько... Или банально не те размеры переменных лежат на стеке, например должно было лежать 2х байтовое число, а у вас на стеке 4х байтовое... Возможно у вас не правильный адрес возврата или миллион других причин может быть. А если в проге используются потоки, то без глубокого реверсинга вобще не обойтись. Поскольку есть вероятность, что вам и не нужно вызывать код функций, а нужно заинлайнить callback на ваш код, когда происходит штатный вызов функции проги в контексте того потока в котором она работает, в народе это называется hook ----- have a nice day |
|
Создано: 06 ноября 2014 17:36 · Личное сообщение · #26 Я, пожалуй, соглашусь с Nimnulом. Ну, про 2-х байтовое число на стеке - перебор, я думаю, в остальном же всё так. Uz_ Не сочтите за грубость, нет абсолютно никакой цели кого-то обидеть. Просто я знаю, как это происходит. Вы сидели, писали какие-то программки на шарпе, а потом подумали, что вы уже умеет программировать, и решили, что пора писать читы (или зачем оно вам всё это надо?). Где-то что-то прочитали мельком, погуглили, и в бой. А по факту - ассемблера толком не знаете, про конвенции вызовов не слышали (в шарпе-то какие конвенции), чем длл от сборки отличается представления мало. А нужно теперь изучить системное программирование под винду, почитать что-то на тему реверс-инженерии, попробовать что-то попроще и вот тогда уже браться за читы. Конкретно здесь, может, всё получится, но особого понимания процесса оно вам не принесёт. ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 06 ноября 2014 17:40 · Личное сообщение · #27 |
|
Создано: 06 ноября 2014 21:15 · Личное сообщение · #28 Windows. Создание эффективных Win32-приложений с учётом специфики 64-разрядной версии Windows Джеффри Рихтер Глава 22. Внедрение DLL и перехват API вызовов. Я сам на C# пишу. Но для этих целей лучше C/C++/ASM. На геймЭнджин вроде автоматизировать можно действия, в IDA тоже. | Сообщение посчитали полезным: Uz_ |
|
Создано: 07 ноября 2014 00:57 · Личное сообщение · #29 |
eXeL@B —› Программирование —› C# Вызвать функцию по адресу |