использование .lib из MASM в MS Visual Studio

Тема в разделе "WASM.BEGINNERS", создана пользователем vanilly_cpp, 8 янв 2008.

  1. vanilly_cpp

    vanilly_cpp New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2007
    Сообщения:
    68
    Всем здрасте! )
    Создаю MASM-ом dll, с ней вместе получается lib.

    .asm
    Код (Text):
    1.  .686
    2.  .model flat, stdcall
    3.  option casemap:none
    4.  
    5.  
    6.  include c:/masm32/include/windows.inc
    7.  include c:/masm32/include/ole32.inc
    8.  include c:/masm32/include/kernel32.inc
    9.  include c:/masm32/com/include/oaidl.inc
    10.  includelib c:/masm32/lib/ole32.lib
    11.  include c:/masm32/include/user32.inc
    12.  
    13.  includelib c:/masm32/lib/user32.lib
    14.  includelib c:/masm32/lib/kernel32.lib
    15.  
    16.  
    17.  include string/Strings.mac
    18.  
    19.  
    20.  
    21.  
    22.  include bits/bits_get_structs.asm
    23.  
    24. .data
    25.  
    26.  
    27.  
    28. .code
    29.     include bits/bits_get_sender.asm
    30.  
    31.     include base64/b64_enc.asm
    32.     include base64/b64_dec.asm
    33.  
    34.  
    35. SendRequest proc lp: DWORD
    36.     invoke  CreateJob, lp, $CTA0("C:\\bx.tmp")
    37.         ret
    38. SendRequest  endp
    39.  
    40.  
    41. end
    .def
    Код (Text):
    1. LIBRARY main
    2. EXPORTS SendRequest
    make.bat
    Код (Text):
    1. @echo off
    2.  
    3. if exist "%1.obj" del "%1.obj"
    4. if exist "%1.dll" del "%1.dll"
    5.  
    6. c:\masm32\bin\ml /c /coff /Cp "%1.asm"
    7. if errorlevel 1 goto errasm
    8.  
    9. c:\masm32\bin\Link /DLL /NOENTRY /def:"%1.def"  /subsystem:windows "%1.obj"
    10. if errorlevel 1 goto errlink
    11.  
    12. dir "%1.*"
    13. goto TheEnd
    14.  
    15. :errlink
    16. echo _
    17. echo Link error
    18. goto TheEnd
    19.  
    20. :errasm
    21. echo _
    22. echo Translation Error
    23. goto TheEnd
    24.  
    25. :TheEnd
    далее мне необходимо получившуюся при этом (.lib) подключить в один из проэктов в Visual Studio
    я делаю так:

    Properties->Linker->Command Line->путь к библиотеке

    создаю .h файл
    Код (Text):
    1. #pragma once
    2.  
    3. void SendRequest(DWORD lp);
    подключаю к проэкту

    делаю вызов в коде вышеупомянутой ф-ии

    билдю

    и

    win_exe error LNK2019: unresolved external symbol "void __cdecl SendRequest(unsigned long)" (?SendRequest@@YAXK@Z) referenced in function _WinMain@16

    Что делаю не так?
     
  2. EvilPhreak

    EvilPhreak New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    154
    Спасибо за понятный вопрос. Как пример для всех других вопросов по способу постновки. Дело в объявлении

    void SendRequest(DWORD lp);

    надо просто сделать так

    external "C" void SendRequest(DWORD lp);
     
  3. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    EvilPhreak
    + __stdcall
     
  4. vanilly_cpp

    vanilly_cpp New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2007
    Сообщения:
    68
    >>EvilPhreak
    Я старалcя! ))) И вам спасибо!

    >>q_q
    Спасибо!

    Так все работает

    extern "C" __stdcall void SendRequest(DWORD lp);
     
  5. nabl3

    nabl3 New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2009
    Сообщения:
    17
    А если только .lib?

    MASM v10:
    ml /c /coff kernel.asm
    link /LIB kernel.obj

    MSVC9:
    #pragma once
    #pragma comment (lib, "kernel.lib")
    extern "C" void __stdcall Register();

    Все собирается, но прога при запуска выдает ошибку и вырубается.
    "Ошибка при инициализации приложения (0x00000005). Для выхода из приложения нажмите кнопку "ОК"."

    Что может быть не так?
     
  6. nabl3

    nabl3 New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2009
    Сообщения:
    17
    Создал чистый проект в MSVC 2008

    main.h
    Код (Text):
    1. #include <windows.h>
    2. #include <ntsecapi.h>
    3.  
    4. #pragma comment (lib, "ntoskrnl.lib")
    5.  
    6. #ifdef __cplusplus
    7. extern "C" {
    8. #endif
    9.  
    10. NTSYSAPI
    11. VOID
    12. NTAPI
    13. RtlInitUnicodeString(
    14.     __out PUNICODE_STRING DestinationString,
    15.     __in_opt PCWSTR SourceString
    16.     );
    17.  
    18. #ifdef __cplusplus
    19. } /* End Of Extern */
    20. #endif
    main.cpp
    Код (Text):
    1. #include <windows.h>
    2. #include "main.h"
    3.  
    4. UNICODE_STRING U;
    5. char A[]="blabla";
    6.  
    7. void main()
    8. {
    9. RtlInitUnicodeString(&U, (PCWSTR) A);
    10. }
    // набивал по памяти, а не копипастом

    Все компилится, все пучком, но при запуске таже ошибка.
     
  7. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    nabl3
    во первых если "void main()"
    то
    на
    Код (Text):
    1. "ntdll.lib"
     
  8. nabl3

    nabl3 New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2009
    Сообщения:
    17
    wsd, ntoskrnl.lib взят специально. Чтобы получать адреса ядерных функций. Или так не получится?
     
  9. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    nabl3
    напиши конечную цель своего колдовства?
     
  10. nabl3

    nabl3 New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2009
    Сообщения:
    17
    wsd
    Все просто. Нужно получить адреса ядерных функций (например RtlInitUnicodeString) чтобы потом их вызывать с привилегиями r0
    Т.е. из адресного пространства r3 (моя прога) ,будут вызываться функции r0
    На данный момент все работает. но проблема именно в адресах функций, не знаю как их лучше получать.
     
  11. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    nabl3
    нет
    если хочеш легально вызывать р0 из р3 почему не использовать int2e или sysenter или ntdll?
    а ошибка у тебя вылитает из-за инициализации ntoskrnl.exe в р3 - она такого не ожидает:)))
     
  12. Blackbeam

    Blackbeam New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2008
    Сообщения:
    960
    вот - Web Browzer ketilo, интересная штука

    пытался сделать либу из длл -

    вроде делается, include сделал, не работате ничего...

    если кто сможет сделать либу и чтоб компилилось всё нормально... пасиба, нет - значит нет... :dntknw:(
     
  13. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Blackbeam
    обычно в станндартных случаях хватает
    implib.sf.net спасибо Quantum
    нужно конкретно рассмотреть твой случай
    компилиться должно по любому после implib
    , а вот работать не всегда...
    и тогда надо глючную функцию проходить в дизасме или отладчике.
    это я к примеру что можно , а иногда и нужно от некоторых, забабахивать
    функции с нестандартным C&C(конвенкция вызова).
    мож ещё что выстрелит...
     
  14. nabl3

    nabl3 New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2009
    Сообщения:
    17
    wsd
    не могу =)
    в моем случае использование таких вещей не разрешено. Ограничения делают свое дело. Поэтому я повышаю привилегии через баги винды. В данном случае получаю сразу r0.
     
  15. nabl3

    nabl3 New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2009
    Сообщения:
    17
    Если кому интересно, решил свою проблему динамически способом.

    main.cpp:
    Код (Text):
    1. #include <windows.h>
    2. #include <ntsecapi.h>
    3.  
    4. typedef NTSTATUS (NTAPI *PRTLINITSTRING) (
    5.     __out PUNICODE_STRING DestinationString,
    6.     __in_opt PCWSTR SourceString
    7. );
    8.  
    9. HMODULE                hKernel;
    10. PRTLINITSTRING                        RtlInitUnicodeString;
    11.  
    12. UNICODE_STRING U;
    13. char A[]="blabla";
    14.  
    15. void main()
    16. {
    17.     hKernel = LoadLibraryExA("ntkrnlpa.exe",0,1);
    18.     RtlInitUnicodeString = (PRTLINITSTRING) GetProcAddress(hKernel,"RtlInitUnicodeString");
    19.     RtlInitUnicodeString(&U,(PCWSTR) A);
    20. }
     
  16. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    nabl3
    ты выведи адрес загрузки
    Код (Text):
    1. cout << hKernel << endl;
    он <7fffffff, он юзермодный(р3)!!!
    она у тебя чудом согласилась инитнуться в р3. но будет много глюков, долго объяснять.
    не то ты делаеш :)
    рано ты это начал :)
     
  17. nabl3

    nabl3 New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2009
    Сообщения:
    17
    wsd
    Адрес-то юзермодный, но это не страшно.
    Багов никаких нет. Все чего хотел добился :)
     
  18. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    nabl3
    ты бы этого добился из ntdll.
    ntoskrnl специальная библиотека режима ядра.
    при вызове других функций у тебя будут большие проблемы.
    у тебя была цель вызов р0 из р3?
    ты её не достиг :dntknw:
     
  19. nabl3

    nabl3 New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2009
    Сообщения:
    17
    wsd
    да нет :)
    у меня уже 20 функций из ntoskrnl вызываются. Задача заключалась именно в получении адресов. На эти адреса я прыгаю уже и так находясь в р0. Если точнее, то поток из р0 выполняет код находящийся в теле моей р3 программы, Вызов функций р3 из р0 невозможен, поэтому и нужны родные ядерные функции. Вот я и получил адреса этих функций.
    Если б я вызвал функции из ntdll, то int 2e выкинул бы меня обратно в р3 с потерей р0 потока.
     
  20. nabl3

    nabl3 New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2009
    Сообщения:
    17
    Здесь hKernel не нужен. Это всего лишь хэндл мапа загруженного модуля.
    Вот если посмотреть чему будет равен RtlInitUnicodeString...адрес в р0