Демку все же удалось запустить, но она работает не корректно, IL инжект не проходит выдавая встроенное исключение.
[UPD]
И так, я все же нашел работающую версию этой [Ссылки могут видеть только зарегистрированные пользователи. ] -> нужно было скачать "Previous version binaries and demo" или "Previous version source code". Код у меня таки не скомпилился выдав это -> [Ссылки могут видеть только зарегистрированные пользователи. ]. В уже скомпиленых файлах работающими оказались только 2 -> "Test_x64_DotNet20_Release" и "Test_x64_DotNet35_Release", остальные запускались, но в тексбоксе писали это -> "Initialization is failed with error [Error_CLRNotFound]!".
Обрадовавшись что код осказался впринципи работающим, я решил просто закинуть класс "InjectionHelper" в свой проект и затестить его там. Нужная dll -> "Injection32(64)" загрузилась нормально, а вот дальше в текст бокс выкинуло вот эту ошибку -> "Initialization is failed with error [Error_DbgHelpNotFound]!". Я попробывал закинуть к исполняемому файлу программы папку в которой судя по статье находятся эти файлы, а именно -> "х64", но это не помогло. Значит эти файлы нужно привязать к своей программе как-то иначе. Вот, помогите разобраться в этом господа)
Оп оп, подхватываю тему, попытаюсь сделать рабочую демку на основе текущей демки xD
________________
We are Ducks. We are birds. We like bread. We cryack. Cryack.
Оп оп, подхватываю тему, попытаюсь сделать рабочую демку на основе текущей демки xD
Будет круто таки)
Подсоблю немного, покопавшить в файлах исходного кода, нашел .cpp файл -> "PdbHelper", которого не хватает моей программе, по адресу -> "source_code_20121105\Injection\", а вообще я так понял, мой код не работает из-за того, что всей этой папки нет в проекте, но опять же, если ее подключить в проект - это не поможет.
[UPD]
Парам пам пам, у меня вышло запусить код в свой проге! НО, есть 2 проблемы:
1. Сделал я это очень карявым способом - переместил 3 папки -> "cache", "PDB_symbols", "x64" из релиза скаченого с кодепрожекта к исполняемому файлу моей проги.
2. Работает это чудо только на NET Framework 2.0 - 3.5 (самая большая проблема - не знаю как пофиксить)
[UPD2]
Радовался раньше времени, простые действия типо арефметики и вывода строки работают на ура. А вот более сложные ,циклы или сравнения уже не компилятся, выкидывая исключение -> "Среда выполнения Common Language Runtime обнаружила недопустимую программу." Еще более сложные функции вообще проверять не стал(
Последний раз редактировалось lxxl; 27.09.2015 в 14:15.
Будет круто таки)
Подсоблю немного, покопавшить в файлах исходного кода, нашел .cpp файл -> "PdbHelper", которого не хватает моей программе, по адресу -> "source_code_20121105\Injection\", а вообще я так понял, мой код не работает из-за того, что всей этой папки нет в проекте, но опять же, если ее подключить в проект - это не поможет.
[UPD]
Парам пам пам, у меня вышло запусить код в свой проге! НО, есть 2 проблемы:
1. Сделал я это очень карявым способом - переместил 3 папки -> "cache", "PDB_symbols", "x64" из релиза скаченого с кодепрожекта к исполняемому файлу моей проги.
2. Работает это чудо только на NET Framework 2.0 - 3.5 (самая большая проблема - не знаю как пофиксить)
[UPD2]
Радовался раньше времени, простые действия типо арефметики и вывода строки работают на ура. А вот более сложные ,циклы или сравнения уже не компилятся, выкидывая исключение -> "Среда выполнения Common Language Runtime обнаружила недопустимую программу." Еще более сложные функции вообще проверять не стал(
Значит что-то не учтено. Потому что если тело функции с одним IL-ом работает, а потом когда его опять заменяют => работать должно.
________________
We are Ducks. We are birds. We like bread. We cryack. Cryack.
Значит что-то не учтено. Потому что если тело функции с одним IL-ом работает, а потом когда его опять заменяют => работать должно.
Хм, а можно ваш пример, где есть цикл например? Может я действительно что-то не так делаю...
[UPD]
Понял в чем беда, оказывается если оставить тело метода пустым, и пытаться инжектить в него - получишь исключение. Если написать в нем хотя бы объявление каких-либо переменных, все будет работать. Пойду тестить дальше)
Последний раз редактировалось lxxl; 27.09.2015 в 16:42.
Хм, а можно ваш пример, где есть цикл например? Может я действительно что-то не так делаю...
[UPD]
Понял в чем беда, оказывается если оставить тело метода пустым, и пытаться инжектить в него - получишь исключение. Если написать в нем хотя бы объявление каких-либо переменных, все будет работать. Пойду тестить дальше)
Пока нету рабочего образца, руки не дотянутся, возьмите process hacker, запустите приложение, измените il, сдампите процесс, откройте в рефлекторе/spy-е и гляньте тело метода - оно стало как до изменения или после? Это кстате самый главный вопрос
________________
We are Ducks. We are birds. We like bread. We cryack. Cryack.
Никто не хочет поговорить, ех =( А я тут нашел новую странность. И так, имеем 2 метода:
Код:
public static void Fix(Func<int> f, byte[] b)
{
RuntimeHelpers.PrepareMethod(f.Method.MethodHandle);
System.Threading.Thread.Sleep(350);
if (InjectionHelper.GetStatus() == InjectionHelper.Status.Ready)
InjectionHelper.UpdateILCodes(f.Method, b);
else
System.Windows.Forms.MessageBox.Show(InjectionHelper.GetStatus().ToString());
System.Threading.Thread.Sleep(100);
}
public static void Fix(Func<int> f, Func<int> f2)
{
byte[] b = f2.Method.GetMethodBody().GetILAsByteArray();
List<string> l = new List<string>(b.Select(x => x.ToString()));
l.ForEach(x => System.IO.File.AppendAllText(Environment.CurrentDirectory + "\\" + f2.Method.Name + ".txt", x + ' '));
RuntimeHelpers.PrepareMethod(f.Method.MethodHandle);
System.Threading.Thread.Sleep(350);
if (InjectionHelper.GetStatus() == InjectionHelper.Status.Ready)
InjectionHelper.UpdateILCodes(f.Method, b);
else
System.Windows.Forms.MessageBox.Show(InjectionHelper.GetStatus().ToString());
System.Threading.Thread.Sleep(100);
}
Делают они все одно и тоже, различия только в том что первый принимает в качестве 2го аргумента непосредственно массив IL опкодов, а второй принимает в качестве 2го аргумента функцию, из которой потом будет извлечено этот массив IL опкодов + во второй функции мы запишем этот массив в файл.
Но вот работает только 2й метод, первый же выдает неясную ошибку:
Необработанное исключение типа "System.IO.IOException" в mscorlib.dll
Дополнительные сведения: Заданного параметра реестра не существует.
Ошибка эта вылетает в функции куда должен быть выполнен инжект. Я в замешательстве