libc.lib в masm32

Тема в разделе "WASM.ASSEMBLER", создана пользователем acdel1, 5 ноя 2005.

  1. cresta

    cresta Active Member

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




    Так нет там такой ф-ции. Есть

    ___crtGetEnvironmentStringsA

    И в то же время есть

    __crtGetEnvironmentStringsW и

    __imp__GetEnvironmentStringsW@0
     
  2. acdel1

    acdel1 New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2005
    Сообщения:
    35
    2 cresta в том то и дело что в kernel32.inc

    есть:
    Код (Text):
    1. \\------------------------------------------------
    2. GetEnvironmentStringsA PROTO
    3. GetEnvironmentStrings equ <GetEnvironmentStringsA>
    4.  
    5. GetEnvironmentStringsW PROTO
    6. \\------------------------------------------------


    и если я буду пользовать GetEnvironmentStrings в своих

    *.asm файлах то, я думаю, всё будет OK, но в libc.lib

    имеем:
    Код (Text):
    1. \\---------------a_env.obj libc.lib IDA-------------
    2. ...
    3.     push    ebp
    4.     mov ebp, dword ptr ds:__imp__GetEnvironmentStringsW@0
    5.     push    esi
    6.     push    edi
    7.     xor ebx, ebx
    8.     xor esi, esi
    9.     xor edi, edi
    10.     cmp eax, ebx
    11.     jnz short loc_0_52
    12.     call    ebp ; __imp__GetEnvironmentStringsW@0
    13.     mov esi, eax
    14.     cmp esi, ebx
    15.     jz  short loc_0_33
    16.     mov ds:_?f_use@?1??__crtGetEnvironmentStringsA@@9@9, 1
    17.     jmp short loc_0_5B
    18. ; --------------------------------------------------
    19.  
    20. loc_0_33:              
    21.     call    dword ptr ds:__imp__GetEnvironmentStrings@0
    22.     mov edi, eax
    23.     cmp edi, ebx
    24. ...
    25.     extrn __imp__GetEnvironmentStrings@0:near
    26.     extrn __imp__GetEnvironmentStringsW@0:near
    27. ...
    28. \\---------------a_env.obj libc.lib IDA-------------


    то есть __imp__GetEnvironmentStringsW@0 линкер устраивает, а

    __imp__GetEnvironmentStrings@0 нет. Вопрос: почему?

    Я предположил что это из за того что в kernel32.dll _GetEnvironmentStringsW@0

    присутствует а _GetEnvironmentStrings@0 нет. может я и неправ...
     
  3. bober

    bober New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2005
    Сообщения:
    153
    acdel1

    А из какой либы это (_?ClockWin@@3VClockObj@@A) - я должен сам икать или напишеш? Передирать надо уметь однако:) Я откомпилю, но как будет работать это не ко мне:) Например самый тяжелый случай сделаю (LoadLibrary + offset) я так много раз делал.



    А причем сдесь libc.lib? Чтобы разговор поддержать:)
     
  4. acdel1

    acdel1 New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2005
    Сообщения:
    35
    2 cresta как я показал выше в a_env.obj присутствует



    extrn __imp__GetEnvironmentStrings@0:near



    я думаю что __imp_ приставку IDA добавляет когда

    функция вызывается не непосредственно из этого места,

    то есть когда выполняется код:

    call dword ptr ds:__imp__GetEnvironmentStrings@0

    например, то управление передаётся не в kernel32.dll, а сначала в

    ту часть исполняемого модуля где находятся "операции перехода"

    (не знаю как это правильно назвать -:) ) и там выполняется команда

    jmpf address

    где address это кусок памяти содержащий адрес точки входа в вызываемую

    функцию в данном случае GetEnvironmentStrings.

    Я так думаю орентируясь на PE исполняемые файлы но возможно я и не прав...

    тем более, что все эти размышления не объясняют почему линкер не видит

    __imp__GetEnvironmentStrings@0 находящийся в libc.lib



    2 bober ?ClockWin@@3VClockObj@@A находится в ClockObj.asm

    и представляет собой:

    _BSS SEGMENT

    ?ClockWin@@3VClockObj@@A DB 0268H DUP (?) ; ClockWin

    _BSS ENDS

    строка 153

    а насчёт "передирать" вы погорячились... -:dntknw:

    может быть вам будет удобнее если я также и с сорцы выложу?
     
  5. bober

    bober New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2005
    Сообщения:
    153
    acdel1



    а насчёт "передирать" вы погорячились... -:dntknw:

    думаю что __imp_ приставку IDA добавляет

    IDA это у вас среда разработки?:)

    ?ClockWin@@3VClockObj@@A - если это твоя функция, почему ее кмпилятор ненаходит? Если не хотел показывать код сделал бы заглушку.



    Лично я много передираю и строить из себя благородного рыцаря не вижу необходимости.
     
  6. acdel1

    acdel1 New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2005
    Сообщения:
    35
    2 bober это не функция это часть _BSS сегмента

    размером 268H байт.
     
  7. acdel1

    acdel1 New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2005
    Сообщения:
    35
    2 bober

    IDA это у вас среда разработки?:)

    нет. просто дезассемблирование производилось

    с включенным "Rename DLL entries".
     
  8. acdel1

    acdel1 New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2005
    Сообщения:
    35
    2 bober Приношу глубокие извинения за неправильно написанный ник
     
  9. bober

    bober New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2005
    Сообщения:
    153
    acdel1





    Тогда обознач ее как-нибудь по другому, а то у меня вот что на нее выскакивает:

    " unresolved external symbol _?ClockWin@@3VClockObj@@A "



    Если у тебя есть сишный код то его наверно проще переписать на асм самому, чем это делать через IDA.
     
  10. acdel1

    acdel1 New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2005
    Сообщения:
    35
    2 bober я переименовал ?ClockWin@@3VClockObj@@A в ClockWin@@3VClockObj

    надеюсь это поможет хотя у меня такое имя ошибки не вызывало, не знаю в

    чём тут дело -:dntknw:



    Если у тебя есть сишный код то его наверно проще переписать на асм самому, чем это делать через IDA.

    Я не пользовался IDA для получения *.asm, листинги сгенерированы MSVC

    за исключением файла new_del.asm

    [​IMG] _1708379992__ScreenClock.rar
     
  11. bober

    bober New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2005
    Сообщения:
    153
    Результат не изменился. Это вероятно из-за старой версии ml.exe(6.14.8444) и link.exe(5.12.8078). Но я не понял какой ты хочеш получить бонус с этой затеи(компилирование на MASM) если даже рунтайм весь переносиш? Даже теоретически должно быть одинаково. А на си еще есть оптимизатор так что вроде плюсов больше.
     
  12. acdel1

    acdel1 New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2005
    Сообщения:
    35
    2 bober Собственно никакого бонуса с этого проекта мне нет

    это просто пример использования libc.lib.

    А по поводу оптимизатора:

    Например самый тяжелый случай сделаю (LoadLibrary + offset)

    вы вроде как нашли места где возможна оптимизация...

    а по поводу ClockWin@@3VClockObj: у вас только это компилятор не находит или что то ещё?
     
  13. acdel1

    acdel1 New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2005
    Сообщения:
    35
    2 bober у link.exe у меня такая же версия а у ml.exe я вкладки с версией не обнаружил -:)
     
  14. bober

    bober New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2005
    Сообщения:
    153
    acdel1

    Вот чего у меня пишет. А насчет оптимизации - это просто рассуждение.

    [​IMG] _726492421__erros.txt
     
  15. acdel1

    acdel1 New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2005
    Сообщения:
    35
    2 bober А вы не пробовали собирать с помощью make.bat

    или то же самое?
     
  16. bober

    bober New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2005
    Сообщения:
    153


    Собралось - но не работает. В make.bat пауза стоит не по делу перед (\masm32\bin\Link)
     
  17. acdel1

    acdel1 New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2005
    Сообщения:
    35
    2 bober

    В make.bat пауза стоит не по делу перед (\masm32\bin\Link)

    Извиняюсь забыл убрать

    А можно посмотреть что получилось?

    И если не секрет что у вас за libc.lib?
     
  18. bober

    bober New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2005
    Сообщения:
    153
    acdel1



    \vs70builds\3077\.......

    size 2,58 MB (2 707 332 bytes)

    [​IMG] _883524516__Clock.rar
     
  19. acdel1

    acdel1 New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2005
    Сообщения:
    35
    2 bober что то у него с секцией импорта не так:

    у меня просходит ошибка по адресу 004011сb а в этом

    месте должен быть вызов CreateSolidBrush из gdi32.dll



    \vs70builds\3077\.......

    size 2,58 MB (2 707 332 bytes)


    а нельзя ли её где нибудь в интернете взять?

    (что то я не понял что есть \vs70builds\3077\ -:) )
     
  20. acdel1

    acdel1 New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2005
    Сообщения:
    35
    2 bober проверил. с секцией импорта всё OK

    неверно сделаны вызовы. все (или основная масса)

    в случае с CreateSolidBrush имеем:

    call ds:00401fb6

    а нужно

    call ds:00409030

    и т.д.