Есть чему удивиться ... GetLastError

Тема в разделе "WASM.WIN32", создана пользователем PROFi, 3 июл 2007.

  1. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    Попробуйте дезассемблировать функцию GetLastError из kernel32.dll найдете много интересного... И никогда бы не подумал что в XP такой kernel32 (да на самом деле вызывается ... из ...)

    Код (Text):
    1. GetLastError:
    2. 7C80903D| 4E                           dec         esi
    3. 7C80903E: 54                           push        esp
    4. 7C80903F: 44                           inc         esp
    5. 7C809040: 4C                           dec         esp
    6. 7C809041: 4C                           dec         esp
    7. 7C809042: 2E                           cs:
    8. 7C809043: 52                           push        edx
    9. 7C809044: 746C                         je         .07C8090B2 --↓1
    10. 7C809046: 47                           inc         edi
    11. 7C809047: 65                           gs:
    12. 7C809048: 744C                         je         .07C809096 --↓2
    13. 7C80904A: 61                           popad
    14. 7C80904B: 7374                         jae        .07C8090C1 --↓3
    15. 7C80904D: 57                           push        edi
    16. 7C80904E: 696E3332457272               imul        ebp,d,[esi][33],072724532
    17. 7C809055: 6F                           outsd
    18. 7C809056: 7200                         jb         .07C809058 --↓4
    19. 7C809058| 4E                          4dec         esi
     
  2. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    хех, W32Dasm пишет, что нельзя найти экспортируемую ф-ию!
    завтра на иде проверю

    ЗЫ: а приведённая простыня чем получена?
     
  3. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    ... Win32GetLastError из нтдлл на сколько помню. Да и сама функция 3 или 4 строчки. Вопрос только в том, что здесь удивительного:)
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    PROFi
    GetLastError db 'NTDLL.RtlGetLastWin32Error',0
    Если это перевести в байты то и получишь то что у тебя в листинге.
     
  5. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Гм старость не радость. RtlGetLastWin32Error
    Код (Text):
    1.   MOV EAX,DWORD PTR FS:[18]
    2.   MOV EAX,DWORD PTR DS:[EAX+34]
    3.   RETN
    xp sp2
     
  6. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    asd


    В том что в ntdll.dll она назывется _RtlGetLastError а в приложении (exe шнике) она импортируется из kernel32.dll т.е. происходит подстановка вместо GetLastError _RtlGetLastError. Вопрос в том что в Си происходит замена функций еще на стадии компиляции, а здесь замена идет в уже откомпилированном приложении. Ктати как по вашему GetProcAddress какой адрес выдаст? ведь мы ее вызываем для модуля kernel32 и ни как не для ntdll
     
  7. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    [deleted]
     
  8. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    PROFi
    Читать про редирект(как же оно по научному называется?) при экспорте. Она не одна такая.
    GetProcAddress выдаст адрес из ntdll
     
  9. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    asd

    Про редирект читал, но сдесь немного другая технология function forwarder.
    #pragma comment(linker, "/export:SomeFnk=Otherdll.OtherFunc")
    А как в исходной библиотеке это размешено - это было для меня открытие.
     
  10. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Да нет, она самая. М.б. я её только назвал не так. Адрес GetLastError указывает на строку NTDLL.RtlGetLastWin32Error и находится в пределах Export Directory. тот кто определяет адрес GetLastError увидив, что адрес указывает внутрь Export Directory должен взять имя новой библиотеки и функции и искать там.
     
  11. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    asd

    Пожалуй тему можно закрыть ответ выше.