Пытаюсь соединить два языка, в виде dll-ки на ассемблере и программы на С++, и это даже получилось сделать, но программ на С++ работает только в релизной версии, при запуске в версии Debug выдаёт исключения испорченного стека. Возможно ошибка связана с тем, что функция написанная на ассемблере как-то не так восстанавливает стек. Если возможно подскажите в чём ошибка. Код на Fasme, Код (ASM): format PE DLL entry MainDll include 'd:\asm\fasm\include\win32ax.inc' include 'd:\asm\fasm\include\encoding\win1251.inc' ;_______CODE________________________________________________________________________ section '.code' code readable executable ;------MainDll---------------------------------------------------------------------- ;Функция загрузки библиотеки proc MainDll hDllInst,fdwReason,lpvReserved; cmp [fdwReason],DLL_PROCESS_ATTACH; je attach_process; cmp [fdwReason],DLL_PROCESS_DETACH; je detach_process; cmp [fdwReason],DLL_THREAD_ATTACH; je attach_thread; cmp [fdwReason],DLL_THREAD_DETACH; je detach_thread; ret; attach_process: mov eax,TRUE; ret; detach_process: ret; attach_thread: mov eax,TRUE; ret; detach_thread: ret; endp; ;------DecStringToNumber----------------------------------------------------------- proc DecStringToNumber string:DWORD mov eax,[string]; ret; endp; ;____________________MyGetLastError___________________________________________________________________________ section '.data' data readable writeable dd ?; ;_________________Export_______________________________________________________________________________________ section '_export' export data readable export 'StringToNumber.dll', DecStringToNumber,'DecStringToNumber' ;_____________________________________________________________________________________________________________ section '.data' import data readable writeable library kernel32,'KERNEL32.DLL', user32,'USER32.DLL',gdi32,'GDI32.DLL' include 'd:\asm\fasm\include\api\kernel32.inc' include 'd:\asm\fasm\include\api\user32.inc' include 'D:\asm\fasm\include\api\gdi32.inc' ;_______________Fixusp________________________________________________________________________________________ section '_fix' fixups readable discardable dd 0,8; Код на С++ Код (C): #include <Windows.h> #include <iostream> #include <libloaderapi.h> #include <string> #include<algorithm> using namespace std; int main(int argc, char* argv[]) { setlocale(LC_ALL, "ru"); HINSTANCE hDll; const char* NameLibrary = "D:/asm/proC++/Training/14-Join/Asm_C++/StringToNumber.DLL"; hDll = LoadLibrary(NameLibrary); if (hDll == NULL) cout << "Неудалось загрузить библиотеку!!!" << endl; else { void(*DecStringToNumber)(char); (FARPROC&) DecStringToNumber = GetProcAddress(hDll, "DecStringToNumber"); //cout << "Адрес функции получен: " <<hex<< DecStringToNumber << endl; char ch[] = "1111111111"; //string str = "kkk"; //int i = 10; DecStringToNumber((char)begin(ch)); FreeLibrary(hDll); } return 0; } Скриншоты с ошибками: первое исключение: Спойлер: картинка второе исключение: Спойлер: картинка
Макрос ret в фасме правильно там все восстанавливает. Если у процедуры есть аргументы, делает стандартный фрейм push ebp - mov ebp,esp - sub esp,<> ... leave - retn <>. Даже если стек оказался бы не выравненным, leave забрало бы значение esp из ebp. В сишном исходнике объяви жестко, что это stdcall, он похоже не стдкол на эту функцию натягивает.
Точно, ты оказался прав, надо было заменить: Код (Text): void(_stdcall *DecStringToNumber)(char); (FARPROC&) DecStringToNumber = GetProcAddress(hDll, "DecStringToNumber"); А может быть ты сможешь ещё подсказать, можно ли каким-нибудь способом запихнуть заместо char шаблон? Чтобы не зависеть от типа передаваемого значения. Что-то на подобие этого: Код (Text): template <class T1> void(_stdcall *func)(T1); (FARPROC&) func = GetProcAddress(hDll,"NameFunc");
f13nd, хотел уточнить, а к студии исходники FASM без проблем подключаютя? Я почему спрашиваю, подключал исходники ассемблера к студии, написанные на MASM - все компилилось и работало без проблем. Недавно перешел на FASM и с ним еще не до конца освоился. Крис Касперски, в свое время, критиковал FASM за то, что он не поддерживает генерацию отладочной информации. Это уже все в прошлом? Допустим, если к студии можно подключить FASM-код, то в режиме дебаг его можно отладить?
Генерирует, но в своем формате .fas Фасмоисходники в студии это какое-то безумие. Очень вряд ли. Просто масм имеет некоторое отношение к майкрософту, а фасм нет.
Ну про это я в курсе. А файл в формате .fas к отладчику ж ни к какому нельзя подключить? Ну так, для общего развития попутно спросил. Поскольку вопрос к FASM имеет отношение. Мало ли? Ну вот я тоже про это подумал.
ексодия https://board.flatassembler.net/topic.php?t=20753 ольга https://board.flatassembler.net/topic.php?t=11496 ида https://board.flatassembler.net/topic.php?p=118458 было бы странно, если бы был формат, который никуда нельзя подключить.
Вот макрос для загрузки файла в Ida Pro. В конце программы в исходник не забывай вставить строки Код (Text): data fixups end data иначе не все секции файла загрузятся
CrawlUp, вы оформили фасмовскую dll правильно, но на выходе из неё, смотрите, кто чистит стек. Если используете макрос "proc", то используйте "endp", иначе стек очищайте вручную, через "leave" или "retn X" - где X кол-во параметров
Такое объявление имелось в виду? Будет работать, а то лень компилировать? Код (C): extern "C" int __stdcall DecStringToNumber(int);
Я, наверно, просто не то "ляпнул" . MASM и FASM вещи не всегда совместимые. Всего лишь, хотел убедиться в правильном ли я направлении мыслю. Вдруг вы бы в ответ написали, что нет это вообще "не в ту степь". Ну, судя повсему, направление верное - можно пробовать компилировать. Коцит, спасибо большое. Я еще внимательно не читал, так быстренько "пробежался". Вроде бы, как раз самые "сливки" - которые полезно будет почитать. Причем, не только про либы. f13nd, пользуясь случаем хотел спросить. Как-то встречал на exelab'е ваше упоминание про TRACE 32. Если не трудно, коротко поясните - это может пригодиться при реверсинге? Это программный трассировщик? Я в сети скачал какой-то мануал, но заниматься переводом для того чтобы убедиться, что это тебе не нужно - не хотелось бы. Но если коротко это не объяснить, то тогда придеться, видимо, посидеть немного с мануалом.
Это аппаратный отладчик фирмы Lauterbach, использующий их интерфейсный адаптер на JTAG/AUD. Но в нем есть возможность программной симуляции. Для реверса разумеется штука ценная, но для реверса устройств. Лучше только настоящий отладчик под нужный проц, а еще лучше лаутербаховский, но они его не хотят продавать. Теоретически его можно присоседить к неоригинальному адаптеру через DAS, но руки не дошли проверить. Китайсы кстати там прикрыли раздачу дистрибутива кому попало на trace32.com, кто успел, тот скачал)
CrawlUp, я в плюсах не шарю, но у меня в 1 проекте такое юзается Код (C++): template <DWORD module, DWORD hash, class A, class B, class C> inline LPVOID PushargEx(A a1, B a2, C a3) { typedef LPVOID(WINAPI *newfunc)(A, B, C); newfunc func = (newfunc)MyGPA(module, hash); return func(a1, a2, a3); } И т.д. Это для функции из 4 параметров. Формируется заранее хеш ес-но (не суть), и 4 параметра любые, по крайней мере работает с любыми. Повторюсь, плюсы не знаю, это копипаст.
CrawlUp, самый лучший вариант == пиши длл-ку на с/с++, а затем получай асм-портянку от компиля и правь её акь тебе надо.
M0rg0t, а я думаю, что вы так долго не отвечаете, а вы оказывается в толковых словарях сортировали самые витиеватые слова . Нет, но процентов на 90-95 солидарен с ним . А вы это тот самый, кто отвечал в ответ, что он до сих пор сидит на Win XP и у него был с Инди общий сайт и, вообще, ему лестно, что его перепутали с таким великим человеком как Инди? Инвестигейтор, анклавы, визоры, моторы... Rel, недавно кого-то здесь называл - любителем заумных терминов и непонятных аббревиатур. А еще у одного нашего форумчанина мне понравилась фраза - четко прослеживаемая индивидуальность . А вообще, это мой последний пост на подобную тему. Мне в личку прислали сообщение, что зря я взял на себя миссию Шерлока Холмса - гораздо полезней потратить это время на приобретение новых знаний и чтение нужных книг и статей. Сказали, что ну докажу я, допустим, что у Инде есть еще какие-то ники - что это изменит? Что он в срочном порядке изменит свой характер и тут же бросится объяснять, то что мне непонятно? И администрация меня предупредила, что если я не буду соблюдать правила форума, то могу отправиться вслед за Инди (в том смысле, что забанят).