точнее поставлю вопрос нужно в приложение заинжектить си функцию, только размер(конец) как? что-бы знать сколько кода копироавть
так вот и трабла со 2 у тебя какие вариант в конце фукции определять метку и эта разнгость и будет рзмером?
doesn Код (Text): // hel1.cpp : Defines the entry point for the console application. // #include "stdafx.h" using namespace std; void alfa(int* abx,int* bbx=0) { ++*abx; *bbx+=*abx; MessageBoxA(NULL, "alfa", "", MB_OK); }; void betta() { // bla-bla puts("betta"); }; int _tmain(int argc, _TCHAR* argv[]) { unsigned char buf [100]; size_t sizecode =(char*)betta - (char*)alfa; memcpy((void*)&buf, (void*)&alfa, sizecode); puts("start\n"); getchar(); VirtualProtect(buf, sizeof buf, PAGE_EXECUTE | PAGE_READWRITE, NULL) ; memcpy((void*)&buf, (void*)&alfa, sizecode); typedef void(__cdecl *kh)(int* , int*); kh assa = (kh)&buf[0]; int ab =10, bb = 1; (assa)(&ab, &bb); cout << ab << endl; cout << bb << endl; getchar(); return 0; } заголовочные то сам риделаеш
wsd немного неверно Даже с откл. оптимизацией в некоторых случаях генерятся джампы. Т.е. на выходе получается такой код Код (Text): jmp alfa .... (другие джампы на другие функции) jmp beta ..... (тут может быть что угодно... другие джампы, код или какие-то данные) alfa: (функции могут находится произвольно. Не обязательно рядом и не обязательно последовательно) .... beta: .... таким образом, size_t sizecode =(char*)betta - (char*)alfa; в sizecode - у тебя будет расстояние между двумя джампами, а не функциями. Непосредственно тела функций будут в совершенно других местах программы. И не факт что функции будут идти последовательно. Прежде чем что-то от чего-то отнимать, сперва желательно проверить первый байт функции. Если 0xE9 - скорректировать действительные адреса.
Magnum Hi так там всё на этапе копиляции вычисляется а ты имел ввиду IAT?там всё без её участия мы также вырывнивание тянем имхо я так понял что мс располагает функции в бинаре в обратным порядке
wsd Нет, я не имел ввиду IAT После сборки ВАШИ функции могут идти либо непосредственно друг за другом, либо по &myfunc будет jmp на тело myfunc, а не сама myfunc Вот смотри простой проект void myfunc1(int a, int b) { return; }; void myfunc2(int a) { return; } после сборки это может выглядеть так jmp myfunc1 jmp myfunc2 ........ myfunc1: ... myfunc2: ... и вот такой вот код a = &myfunc1 вернет адрес jmp-a на myfunc1, но никак не адрес тела самой функции ЗЫ: я говорю именно про ваши функции. Наличие или отуствие импорта тут вообще ни при чем.
достаточно функу объявить как внешнюю и она даже при оптимизации останется функой. Те не будет слита с другой или отброшена если нет явного использования. А переведение комбинации 'call xxx; ret;' в 'jmp xxx;' можно отключить хотя зачем это надо - не знаю.
wsd Мне кажется, что лучше всего на указателях. Но ! Компиллер в праве разместить или за инлайнить или еще чего сделать с кодом ) потому ты должен принудительно задать порядок размещения в коде ф-ций. Дальше разность указателей, плюс убавить полученное на размер области байтов с 0xCC значением.
wsd Еще при внедрении в файл учти, что в ф-ции следует избегать вызова импортируемых ф-ций, да и другие ф-ции тоже следует избегать Ведь то что было в твоей программе-инжектор не есть такие же адреса в программе-жертва
wsd если инжектируемые группы фунок оформить в отдельных файлах, то оптимизация не помешает. И даже переходы внутри одного файла будут нормальными. Только глобальных переменных юзать нельзя. Только локальные и классированые. А еще, инжектируемую прогу можно слинковать в подобие сом файла (PIC) и в инжектер в виде массива.
EvilsInterrupt cамо сабой релоки и парсы тогда спасибо за участие! _basmp_ да это я пробы пера на эксплоитах, хотел основную часть на си а потом вынуть спасибо!