Не могу получить экспортную функцию

Тема в разделе "WASM.WIN32", создана пользователем sanny, 17 ноя 2019.

  1. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.186
    Адрес:
    подполье
    Код (Text):
    1. #include <windows.h>
    2.  
    3. DWORD GetProcAddress( HMODULE module, char* function )
    4. {
    5.     PIMAGE_DOS_HEADER dos_header = NULL;
    6.     PIMAGE_NT_HEADERS nt_header = NULL;
    7.     PIMAGE_EXPORT_DIRECTORY export = NULL;
    8.     FARPROC* export_addr_table = NULL;
    9.     char** export_name_table = NULL;
    10.     WORD* export_ord_table = NULL;
    11.     char* name = NULL;
    12.     DWORD return_addr = 0;
    13.     int i = 0;
    14.  
    15.     if( !module || !function )
    16.         return NULL;
    17.  
    18.     dos_header = static_cast<PIMAGE_DOS_HEADER>( (void*)module );
    19.  
    20.     if( dos_header->e_magic == IMAGE_DOS_SIGNATURE && dos_header->e_lfanew != NULL )
    21.     {
    22.         nt_header = reinterpret_cast<PIMAGE_NT_HEADERS>( (DWORD)module + dos_header->e_lfanew );
    23.  
    24.         if( nt_header->Signature == IMAGE_NT_SIGNATURE && nt_header->FileHeader.Machine == IMAGE_FILE_MACHINE_I386 )
    25.         {
    26.             export = reinterpret_cast<PIMAGE_EXPORT_DIRECTORY>( (DWORD)module + nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress );
    27.          
    28.             export_addr_table = (FARPROC*)( (DWORD)module + export->AddressOfFunctions );
    29.             export_name_table = (char**)( (DWORD)module + export->AddressOfNames );
    30.             export_ord_table = (WORD*)( (DWORD)module + export->AddressOfNameOrdinals );
    31.  
    32.             for(i = 0; i < export->NumberOfNames; ++i)
    33.             {
    34.                 name = (char*)( (DWORD)module + export_name_table[i] );
    35.  
    36.                 if( !strcmp(name, function) )
    37.                 {
    38.                     return_addr = (DWORD)module + (DWORD)export_addr_table[export_ord_table[i]];
    39.                     break;
    40.                 }
    41.             }
    42.         }
    43.     }
    44.  
    45.     return return_addr;
    46. }
     
    Последнее редактирование модератором: 19 ноя 2019
  2. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    Щас у ТС будет already defined и он огорчится )
     
  3. sanny

    sanny Member

    Публикаций:
    0
    Регистрация:
    28 сен 2018
    Сообщения:
    42
    Ошибка без & не исчезает)
     
  4. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    sanny, отладчиком пользуетесь? Передайте хендл вашей загруженной длл в хук и посмотрите, что за адрес туда передался и что лежит по этому адресу. Если все хорошо, там должен быть PE заголовок, вот такой:
    [​IMG]
     
  5. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Как объявлена execLogin?
     
  6. sanny

    sanny Member

    Публикаций:
    0
    Регистрация:
    28 сен 2018
    Сообщения:
    42
    TrashGen,
    Can't find 'intUNewAgeAPIexecOnEventCustom' in 'NewAge.dll'
    --- Сообщение объединено, 18 ноя 2019 ---
    Thetrik, void execLogin( FFrame& TheStack, RESULT_DECL );
     

    Вложения:

    • 444.png
      444.png
      Размер файла:
      51,1 КБ
      Просмотров:
      372
  7. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.186
    Адрес:
    подполье
    эта функцыя должна быть той, код которой в начале страницы. вы её хоть переименуйте, мож она из krnl32 дергается, я хз. ставьте брейкпоинт после неё, или вы воще без отладчика?
     

    Вложения:

  8. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    Блин, а код хука-то лежит тоже в той же загруженной либе? Или нет?

    Result = (void*)(UNewAgeApi::execLogin) не компилится? Какая ошибка?
     
  9. sanny

    sanny Member

    Публикаций:
    0
    Регистрация:
    28 сен 2018
    Сообщения:
    42
    TrashGen, переименовал, сути не поменяла, ошибка даже, возвращает NULL..
    крч я задолбался уже 4 дня с этой хренью возится. пойду извращаться в другом месте и насиловать двигло немного по-другому
    --- Сообщение объединено, 18 ноя 2019 ---
    ormoulu, да, в той же.
    Error 13 error C2440: 'type cast' : cannot convert from 'void (__thiscall UNewAgeAPI::* )(FFrame &,void *const )' to 'void *'
     
  10. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.186
    Адрес:
    подполье
    ЗАЧЕМ НУЖЕН ХУК ФУНКЦИИ В СВОЁМ ЖЕ МОДУЛЕ?
    --- Сообщение объединено, 18 ноя 2019 ---
    result = &execLogin не?
    --- Сообщение объединено, 18 ноя 2019 ---
    или чо там?
    result = &intUNewAgeAPIexecOnEventCustom
     
  11. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Просто оберни вызов обычной функцией и возвращай его. Нельзя скастовать указатель на мкембер к обычному указателю на функцию.
     
  12. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    __thiscall же и вызов из чужого кода.
     
  13. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.186
    Адрес:
    подполье
    ormoulu, это такая замануха ядрёная, только всё начинает проясняться, как оказываеццо, что ничего непонянтно, а потом обнаружываеццо, что решение было в #2 или #3
    --- Сообщение объединено, 18 ноя 2019 ---
    но это решение не работает!
     
  14. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    Трешик не переживайте так )
     
  15. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Ну типа такого:
    Код (Text):
    1. __declspec(noinline, naked) void test(char a, char b) {
    2.     CSomeClass *me;
    3.  
    4.     __asm  {
    5.         mov me, ecx
    6.     }
    7.  
    8.       return me->meth(a,b);
    9. }
     
  16. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.186
    Адрес:
    подполье
    раз в пять лет решишь написать помимо хипа и как тут не переживать?
     
    Indy_ нравится это.
  17. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    typedef void (__thiscall UNewAgeAPI::* PROC_PTR)(FFrame &,void *const );
    PROC_PTR ProcPtr = (&UNewAgeApi::execLogin);
    void* ProcPtr2 = *(void**)(&ProcPtr);
     
    sanny нравится это.
  18. sanny

    sanny Member

    Публикаций:
    0
    Регистрация:
    28 сен 2018
    Сообщения:
    42
    TrashGen, эта функция не в моем модуле, я хукнул ее чтобы посмотреть что происходит после первого запуска и ошибки по поиску функции.
    --- Сообщение объединено, 18 ноя 2019 ---
    ormoulu, спасибо, функцию передал.. правда из XMLUI ее теперь не вызовешь. Но это уже совсем другая история :) пошел копать дальше. Всем спасибо за помощь!
     
  19. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    ну раз ты стал со мной разговаривать предельно вежливо, за что тебе большое спасибо, то не могу не поискать, вот wininet например:
    [​IMG]
    --- Сообщение объединено, 19 ноя 2019 ---
    вообще говоря, ординал у функции есть всегда, а имени может не быть:
    Код (Text):
    1.  
    2. auto lib = GetModuleHandleA("kernel32.dll");
    3. auto pt1 = GetProcAddress(lib, "DeleteFileW");
    4. auto pt2 = GetProcAddress(lib, (LPCSTR)267);
    5. // на выходе pt1 = pt2
    6.  
    --- Сообщение объединено, 19 ноя 2019 ---
    не, Инде просто не шарит в формате PE и в загрузчике венды... когда он учился в институте изучения исходников WinXP, он приболел приступом аутоэрастии, и пропустил лекции на эту тему... из-за этого кстати ему не дали красный диплом в институте изучения исходников венды, и теперь он очень злой и обижен на весь мир... и особенно на тех, кто в институте изучения исходников венды не учился, но каким то удивительным образом знает про PE-формат... не обижайся на него...
     
  20. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Rel,

    Я тоже могу пройти поиском по диску и найти импорт по ординалам. Но я вот что то не помню какие то функции которые так импортятся. Довольно часто используется не штатное наименование, например стабы к криптодрайверу - systemfunctionXX". Вопрос был в том помните ли вы где хоть раз такое юзается.

    > исходников WinXP

    А у тебя наверное есть более свежие ?