Visual C++ ASM GetProcAddress Access Violation

Тема в разделе "WASM.ASSEMBLER", создана пользователем 9two, 24 дек 2017.

  1. 9two

    9two New Member

    Публикаций:
    0
    Регистрация:
    9 дек 2017
    Сообщения:
    8
    Акцэс вюлишэн на GetProcAddress , почему?
    Код (C):
    1.  
    2. char CopyFileAfunc[10] = {0};
    3. HMODULE hModule = GetModuleHandleA("kernel32.dll");
    4. lstrcpyA(CopyFileAfunc,"CopyFileA");
    5. _asm
    6. {
    7. xor eax,eax
    8. lea eax, [CopyFileAfunc]
    9. push eax
    10. push hModule
    11. call GetProcAddress
    12. push 0
    13. push file2
    14. push file1
    15. call eax
    16. }
    17.  
    вываливается на push 0
     
  2. 9two

    9two New Member

    Публикаций:
    0
    Регистрация:
    9 дек 2017
    Сообщения:
    8
    Код (Text):
    1.  
    2. char Copyfunction[10] = "CopyFileA";
    3. HMODULE hMod = GetModuleHandle("kernel32.dll");
    4. __asm
    5. {
    6. push 0;
    7. mov eax, [File1];
    8. push eax;
    9. mov eax, [File2];
    10. push eax;
    11. lea eax, [Copyfunction];
    12. push eax;
    13. mov eax, hModule;
    14. push eax;
    15. call GetProcAddress;
    16. call eax;
    17. }; // Через асм вставку, хочу вызвать функцию
    18.  
    в чём же тут дело?
     
  3. unc1e

    unc1e Active Member

    Публикаций:
    2
    Регистрация:
    28 июл 2017
    Сообщения:
    295
    Хз что у вас вылетает, у меня все норм
    [​IMG]
     
  4. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    808
    Адрес:
    Jabber: darksys@sj.ms
    Чуть оптимизовал от MsRem'a юзаю в крипторе
    Код (Text):
    1. typedef HMODULE (WINAPI* GETMODULEHANDLE)( __in_opt LPCSTR lpModuleName );
    2. PVOID GetProcAddressEx(
    3. IN PVOID Image,
    4. IN PCSTR lpProcName,
    5. IN GETMODULEHANDLE CsGetModuleHandle
    6. )
    7. {
    8. PIMAGE_DOS_HEADER dHeader = (PIMAGE_DOS_HEADER) Image;
    9. PVOID             Result = NULL;
    10. if (dHeader->e_magic == IMAGE_DOS_SIGNATURE)
    11. {
    12. PIMAGE_NT_HEADERS ntHeaders = (PIMAGE_NT_HEADERS) RVATOVA(Image, dHeader->e_lfanew);
    13. if (ntHeaders->Signature == IMAGE_NT_SIGNATURE)
    14. {
    15. ULONG ExpRVA  = ntHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]. VirtualAddress;
    16. ULONG ExpSize = ntHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]. Size;
    17. if (ExpRVA && ExpRVA < ntHeaders->OptionalHeader.SizeOfImage)
    18. {
    19. PIMAGE_EXPORT_DIRECTORY Export = (PIMAGE_EXPORT_DIRECTORY) RVATOVA(Image, ExpRVA);
    20. ULONG  NamesAddr = (ULONG)RVATOVA(Image, Export->AddressOfNameOrdinals);
    21. ULONG  NameAddr  = (ULONG)RVATOVA(Image, Export->Name);
    22. PULONG pName     = (PULONG)RVATOVA(Image, Export->AddressOfNames);
    23. ULONG r;
    24. for (r = 0; r < Export->NumberOfFunctions; r++)
    25. {
    26. BOOLEAN bFindByOrdinal = ((ULONG)lpProcName == (USHORT)lpProcName);
    27. ULONG   nOrdinal, dwFuncRva;
    28. if (r * 2 + NamesAddr == NameAddr) break;
    29. nOrdinal  = ((PUSHORT)NamesAddr)[r];
    30. dwFuncRva = ((PULONG)RVATOVA(Image, Export->AddressOfFunctions))[nOrdinal];
    31. nOrdinal += (USHORT)Export->Base;
    32. if (!bFindByOrdinal && pName && r < Export->NumberOfNames)
    33. {
    34. if (!_stricmp(lpProcName,(PCHAR)RVATOVA(Image, *pName)))
    35. {
    36. if (abs((LONG)(dwFuncRva - ExpRVA)) <= ExpSize)
    37. {
    38. CHAR  DllName[0x100];
    39. PCHAR fwdName = (PCHAR) RVATOVA(Image, dwFuncRva);
    40. PCHAR fnName  = strchr(fwdName, '.');
    41. PVOID pLibrary;
    42. if (fnName)
    43. {
    44. memset(DllName, 0, sizeof(DllName));
    45. strncpy(DllName, fwdName, fnName - fwdName);
    46. strcat(DllName, ".dll");
    47. fnName++;
    48. pLibrary = CsGetModuleHandle(DllName);
    49. if (pLibrary)
    50. {
    51. Result = GetProcAddressEx(pLibrary, fnName, CsGetModuleHandle);
    52. }
    53. }
    54. } else Result = (PVOID) RVATOVA(Image, dwFuncRva);
    55. break;
    56. }
    57. } else
    58. if (bFindByOrdinal && (nOrdinal == (USHORT)lpProcName))
    59. {
    60. Result = (PVOID)RVATOVA(Image, dwFuncRva);
    61. break;
    62. }
    63. pName++;
    64. }
    65. }
    66. }
    67. }
    68. return Result;
    69. }
     
  5. Indy_

    Indy_ Well-Known Member

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

    Нормально следует показать описание ошибки. Она всегда содержит код(ntstatus), адрес инструкции и адрес выборки данных. Почему вы это не показали ?

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

    Думаю врядле это интернал проблема. У меня вызывает сомнение инструкция lea eax, [CopyFileAfunc].
     
  6. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    808
    Адрес:
    Jabber: darksys@sj.ms
    Я лично дал исчерпывающую инфу
    ТС честно про привилегии не подумал))))
    плюс
    pushad
    popad
    и в настройках проекта надо sdcall
    инлайн асм штука капризная
     
  7. Indy_

    Indy_ Well-Known Member

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

    Вы как всегда немного отрешены от реальности, показали пример кода, но зачем, если тема резолвить ошибку.
     
  8. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    808
    Адрес:
    Jabber: darksys@sj.ms
  9. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    808
    Адрес:
    Jabber: darksys@sj.ms
    PS: жаль не сохранился старый васм(
     
  10. Prober

    Prober New Member

    Публикаций:
    0
    Регистрация:
    4 дек 2008
    Сообщения:
    20
    9two, на "push 0" не может вываливаться.

    Из исходника непонятно, что собой File1/File2 представляют. Возможно, вместо "mov eax, [File1]" надо "lea eax, [File1]" ?
     
  11. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    808
    Адрес:
    Jabber: darksys@sj.ms
    Да нафиг инлайн асм там?
     
  12. 9two

    9two New Member

    Публикаций:
    0
    Регистрация:
    9 дек 2017
    Сообщения:
    8
    проект пересобрал в другой студии и все заработало, очевидно недочеты либерарные