C++ и dll на ассемблере

Тема в разделе "LANGS.C", создана пользователем CrawlUp, 18 фев 2019.

  1. CrawlUp

    CrawlUp Member

    Публикаций:
    0
    Регистрация:
    1 фев 2018
    Сообщения:
    90
    Пытаюсь соединить два языка, в виде dll-ки на ассемблере и программы на С++, и это даже получилось сделать, но программ на С++ работает только в релизной версии, при запуске в версии Debug выдаёт исключения испорченного стека. Возможно ошибка связана с тем, что функция написанная на ассемблере как-то не так восстанавливает стек. Если возможно подскажите в чём ошибка.
    Код на Fasme,
    Код (ASM):
    1. format PE DLL
    2. entry MainDll
    3. include 'd:\asm\fasm\include\win32ax.inc'
    4. include 'd:\asm\fasm\include\encoding\win1251.inc'
    5. ;_______CODE________________________________________________________________________
    6. section '.code' code readable executable
    7. ;------MainDll----------------------------------------------------------------------
    8.  ;Функция загрузки библиотеки
    9. proc  MainDll hDllInst,fdwReason,lpvReserved;
    10.      cmp [fdwReason],DLL_PROCESS_ATTACH;
    11.      je attach_process;
    12.      cmp [fdwReason],DLL_PROCESS_DETACH;
    13.      je detach_process;
    14.    
    15.      cmp [fdwReason],DLL_THREAD_ATTACH;
    16.      je attach_thread;
    17.    
    18.      cmp [fdwReason],DLL_THREAD_DETACH;
    19.      je detach_thread;
    20.      ret;
    21. attach_process:
    22. mov eax,TRUE;
    23. ret;
    24. detach_process:
    25. ret;
    26. attach_thread:
    27. mov eax,TRUE;
    28. ret;
    29. detach_thread:
    30.   ret;
    31. endp;
    32. ;------DecStringToNumber-----------------------------------------------------------
    33. proc DecStringToNumber string:DWORD
    34.         mov eax,[string];
    35.      
    36. ret;
    37. endp;
    38. ;____________________MyGetLastError___________________________________________________________________________
    39. section '.data' data readable writeable
    40. dd ?;
    41. ;_________________Export_______________________________________________________________________________________
    42. section '_export' export data readable
    43. export 'StringToNumber.dll', DecStringToNumber,'DecStringToNumber'
    44. ;_____________________________________________________________________________________________________________
    45. section '.data' import data  readable writeable
    46. library kernel32,'KERNEL32.DLL', user32,'USER32.DLL',gdi32,'GDI32.DLL'
    47. include 'd:\asm\fasm\include\api\kernel32.inc'
    48. include 'd:\asm\fasm\include\api\user32.inc'
    49. include 'D:\asm\fasm\include\api\gdi32.inc'
    50. ;_______________Fixusp________________________________________________________________________________________
    51. section '_fix' fixups readable discardable
    52.        dd 0,8;
    53.  
    Код на С++

    Код (C):
    1. #include <Windows.h>
    2. #include <iostream>
    3. #include <libloaderapi.h>
    4. #include <string>
    5. #include<algorithm>
    6.  
    7.  
    8.  
    9. using namespace std;
    10.  
    11. int main(int argc, char* argv[])
    12. {
    13.     setlocale(LC_ALL, "ru");
    14.     HINSTANCE hDll;
    15.     const char* NameLibrary = "D:/asm/proC++/Training/14-Join/Asm_C++/StringToNumber.DLL";
    16.  
    17.     hDll = LoadLibrary(NameLibrary);
    18.  
    19.     if (hDll == NULL)
    20.         cout << "Неудалось загрузить библиотеку!!!" << endl;
    21.  
    22.     else
    23.     {
    24.  
    25.      
    26.         void(*DecStringToNumber)(char);
    27.         (FARPROC&) DecStringToNumber = GetProcAddress(hDll, "DecStringToNumber");
    28.         //cout << "Адрес функции получен: " <<hex<< DecStringToNumber << endl;
    29.      
    30.  
    31.         char ch[] = "1111111111";      
    32.         //string str = "kkk";
    33.         //int i = 10;
    34.      
    35.         DecStringToNumber((char)begin(ch));
    36.  
    37.         FreeLibrary(hDll);
    38.     }
    39.  
    40.     return 0;  
    41. }
    42.  
    Скриншоты с ошибками:
    первое исключение:
    [​IMG]
    второе исключение:
    [​IMG]
     
    Последнее редактирование модератором: 18 фев 2019
  2. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.955
    Макрос ret в фасме правильно там все восстанавливает. Если у процедуры есть аргументы, делает стандартный фрейм push ebp - mov ebp,esp - sub esp,<> ... leave - retn <>. Даже если стек оказался бы не выравненным, leave забрало бы значение esp из ebp. В сишном исходнике объяви жестко, что это stdcall, он похоже не стдкол на эту функцию натягивает.
     
    CrawlUp нравится это.
  3. CrawlUp

    CrawlUp Member

    Публикаций:
    0
    Регистрация:
    1 фев 2018
    Сообщения:
    90
    Точно, ты оказался прав, надо было заменить:
    Код (Text):
    1.        void(_stdcall *DecStringToNumber)(char);
    2.         (FARPROC&) DecStringToNumber = GetProcAddress(hDll, "DecStringToNumber");
    3.        
    А может быть ты сможешь ещё подсказать, можно ли каким-нибудь способом запихнуть заместо char шаблон? Чтобы не зависеть от типа передаваемого значения.
    Что-то на подобие этого:
    Код (Text):
    1. template <class T1>
    2. void(_stdcall *func)(T1);
    3. (FARPROC&) func = GetProcAddress(hDll,"NameFunc");
     
  4. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.955
    Не, в цэ мои полномочия всё)
     
  5. sty

    sty Member

    Публикаций:
    0
    Регистрация:
    2 фев 2019
    Сообщения:
    102
    f13nd, хотел уточнить, а к студии исходники FASM без проблем подключаютя? Я почему спрашиваю, подключал исходники ассемблера к студии, написанные на MASM - все компилилось и работало без проблем. Недавно перешел на FASM и с ним еще не до конца освоился. Крис Касперски, в свое время, критиковал FASM за то, что он не поддерживает генерацию отладочной информации. Это уже все в прошлом? Допустим, если к студии можно подключить FASM-код, то в режиме дебаг его можно отладить?
     
  6. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.955
    Генерирует, но в своем формате .fas Фасмоисходники в студии это какое-то безумие. Очень вряд ли. Просто масм имеет некоторое отношение к майкрософту, а фасм нет.
     
  7. sty

    sty Member

    Публикаций:
    0
    Регистрация:
    2 фев 2019
    Сообщения:
    102
    Ну про это я в курсе.
    А файл в формате .fas к отладчику ж ни к какому нельзя подключить?
    Ну так, для общего развития попутно спросил. Поскольку вопрос к FASM имеет отношение. Мало ли? :)
    Ну вот я тоже про это подумал.
     
    Последнее редактирование: 18 фев 2019
  8. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.955
    ексодия https://board.flatassembler.net/topic.php?t=20753
    ольга https://board.flatassembler.net/topic.php?t=11496
    ида https://board.flatassembler.net/topic.php?p=118458
    было бы странно, если бы был формат, который никуда нельзя подключить.
     
    sty нравится это.
  9. CrawlUp

    CrawlUp Member

    Публикаций:
    0
    Регистрация:
    1 фев 2018
    Сообщения:
    90
    Вот макрос для загрузки файла в Ida Pro. В конце программы в исходник не забывай вставить строки

    Код (Text):
    1. data fixups
    2. end data
    иначе не все секции файла загрузятся
     

    Вложения:

    sty нравится это.
  10. sty

    sty Member

    Публикаций:
    0
    Регистрация:
    2 фев 2019
    Сообщения:
    102
    А я вот эту статью прочитал и успокоился, думал .fas-файл только для этого и существует. :)
     
  11. Коцит

    Коцит Active Member

    Публикаций:
    0
    Регистрация:
    31 янв 2017
    Сообщения:
    130
    CrawlUp, вы оформили фасмовскую dll правильно, но на выходе из неё, смотрите, кто чистит стек. Если используете макрос "proc", то используйте "endp", иначе стек очищайте вручную, через "leave" или "retn X" - где X кол-во параметров
     
  12. sty

    sty Member

    Публикаций:
    0
    Регистрация:
    2 фев 2019
    Сообщения:
    102
    Такое объявление имелось в виду? Будет работать, а то лень компилировать? :)
    Код (C):
    1. extern  "C" int __stdcall  DecStringToNumber(int);
     
  13. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.955
    А я что, компилятор? вроде __stdcall правильно.
     
  14. Коцит

    Коцит Active Member

    Публикаций:
    0
    Регистрация:
    31 янв 2017
    Сообщения:
    130
    sty нравится это.
  15. sty

    sty Member

    Публикаций:
    0
    Регистрация:
    2 фев 2019
    Сообщения:
    102
    Я, наверно, просто не то "ляпнул" :). MASM и FASM вещи не всегда совместимые. Всего лишь, хотел убедиться в правильном ли я направлении мыслю. Вдруг вы бы в ответ написали, что нет это вообще "не в ту степь". Ну, судя повсему, направление верное - можно пробовать компилировать.
    Коцит, спасибо большое. Я еще внимательно не читал, так быстренько "пробежался". Вроде бы, как раз самые "сливки" - которые полезно будет почитать. Причем, не только про либы.

    f13nd, пользуясь случаем хотел спросить. Как-то встречал на exelab'е ваше упоминание про TRACE 32. Если не трудно, коротко поясните - это может пригодиться при реверсинге? Это программный трассировщик? Я в сети скачал какой-то мануал, но заниматься переводом для того чтобы убедиться, что это тебе не нужно - не хотелось бы. Но если коротко это не объяснить, то тогда придеться, видимо, посидеть немного с мануалом.
     
    Последнее редактирование: 19 фев 2019
  16. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.955
    Это аппаратный отладчик фирмы Lauterbach, использующий их интерфейсный адаптер на JTAG/AUD. Но в нем есть возможность программной симуляции. Для реверса разумеется штука ценная, но для реверса устройств. Лучше только настоящий отладчик под нужный проц, а еще лучше лаутербаховский, но они его не хотят продавать. Теоретически его можно присоседить к неоригинальному адаптеру через DAS, но руки не дошли проверить. Китайсы кстати там прикрыли раздачу дистрибутива кому попало на trace32.com, кто успел, тот скачал)
     
    sty нравится это.
  17. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.574
    CrawlUp, я в плюсах не шарю, но у меня в 1 проекте такое юзается
    Код (C++):
    1. template <DWORD module, DWORD hash, class A, class B, class C>
    2.  
    3. inline LPVOID PushargEx(A a1, B a2, C a3)
    4. {
    5.     typedef LPVOID(WINAPI *newfunc)(A, B, C);
    6.     newfunc func = (newfunc)MyGPA(module, hash);
    7.     return func(a1, a2, a3);
    8. }
    9.  
    И т.д. Это для функции из 4 параметров. Формируется заранее хеш ес-но (не суть), и 4 параметра любые, по крайней мере работает с любыми. Повторюсь, плюсы не знаю, это копипаст.
     
    CrawlUp нравится это.
  18. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.087
    CrawlUp, самый лучший вариант == пиши длл-ку на с/с++, а затем получай асм-портянку от компиля и правь её акь тебе надо.
     
  19. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.574
    оффтоп

    sty, вы тот самый инвестигейтор с ехелаба, утверждающий что я - Инди?
     
  20. sty

    sty Member

    Публикаций:
    0
    Регистрация:
    2 фев 2019
    Сообщения:
    102
    M0rg0t, а я думаю, что вы так долго не отвечаете, а вы оказывается в толковых словарях сортировали самые витиеватые слова :).

    Нет, но процентов на 90-95 солидарен с ним :).
    А вы это тот самый, кто отвечал в ответ, что он до сих пор сидит на Win XP и у него был с Инди общий сайт и, вообще, ему лестно, что его перепутали с таким великим человеком как Инди? :)
    Инвестигейтор, анклавы, визоры, моторы... Rel, недавно кого-то здесь называл - любителем заумных терминов и непонятных аббревиатур. А еще у одного нашего форумчанина мне понравилась фраза - четко прослеживаемая индивидуальность :).


    А вообще, это мой последний пост на подобную тему. Мне в личку прислали сообщение, что зря я взял на себя миссию Шерлока Холмса - гораздо полезней потратить это время на приобретение новых знаний и чтение нужных книг и статей. Сказали, что ну докажу я, допустим, что у Инде есть еще какие-то ники - что это изменит? Что он в срочном порядке изменит свой характер и тут же бросится объяснять, то что мне непонятно?


    И администрация меня предупредила, что если я не буду соблюдать правила форума, то могу отправиться вслед за Инди (в том смысле, что забанят).