Проблемы(масм)

Тема в разделе "WASM.BEGINNERS", создана пользователем core, 9 июн 2007.

  1. core

    core New Member

    Публикаций:
    0
    Регистрация:
    9 июн 2007
    Сообщения:
    24
    Уважаемые спецы, помогите решить 2 проблемы.

    Проблема1.
    Есть buffer в который считываеться информация с файла: InetBufferRead db 1024 DUP(?) нужно записать данную информацию в переменную типа: BufferSetPos textequ <string>

    Если делать так: BufferSetPos textequ <offset InetBufferRead> данные записываються, но если главный буфер изменён, то и данные изменяються, следовательно они передаються по ссылке, а мне так не нужно. Надо сделать чтобы информация в переменной была эквивалентна: newvar textequ <текст>.

    Код неправильного примера:
    BufferSetPos textequ <offset InetBufferRead>
    Array (inlink, TextSetPos(%BufferSetPos, #char1#, #char2#)) - здесь данные обрабатываються макро-функцией: TextSetPos(), передаються и записываються в массив, который можно вызвать так: inlink0(для получения первого элемента), inlink_length - длинна массива.

    Вот пример рабочего примера, но без буфера, а с работой напрямую:
    BufferSetPos textequ <#char1# yandex.ru #char2#>
    Array (inlink, TextSetPos(%BufferSetPos, #char1#, #char2#))
    как видите различий не много.

    Проблема2.
    Есть строка типа textequ, нужно записать её в текстовый файл:
    strings textequ <mystring>
    .....открытие/создание файла
    .....запись

    Пишет то он пишет, но получаеться так, что вместе с искомой строкой оказываеться все хранилища данных, пример:

    Код (Text):
    1. .486
    2. .model flat, stdcall
    3. option casemap: none
    4.  
    5. include \masm32\include\windows.inc
    6. include \masm32\include\user32.inc
    7. include \masm32\include\kernel32.inc
    8. includelib \masm32\lib\user32.lib
    9. includelib \masm32\lib\kernel32.lib
    10.  
    11. .data?
    12. hFileOpen HANDLE ?
    13. ProcessReadWrite DWORD ?
    14.  
    15. .code
    16.  
    17. start:
    18. WriteStringFile MACRO file:REQ, string:REQ
    19. LOCAL crString, crFileOut
    20.  
    21. .data
    22. crString db string, 0
    23. crFileOut db file, 0
    24.  
    25. .code
    26.               ;Создание файла
    27.               invoke CreateFile, ADDR crFileOut, GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ,\
    28.               NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL
    29.               mov hFileOpen, eax
    30.                    
    31.               ;Запись полученных данных    
    32.               .IF hFileOpen != NULL
    33.                    invoke WriteFile, hFileOpen, ADDR crString, 1024, ADDR ProcessReadWrite, NULL
    34.               .ENDIF
    35.              
    36.               ;уничтожаем указатели              
    37.               invoke CloseHandle, hFileOpen
    38.  
    39. EXITM <>
    40. ENDM
    41.  
    42. WriteStringFile ("outfile.txt", "строка")
    43. WriteStringFile ("outfile2.txt", "строка2")
    44.  
    45. invoke ExitProcess, 0
    Вот такая белебердистика получаеться: строка outfile.txt строка2 outfile2.txt 0, в большом проекте хуже, там оказываються все возможные данные, ниже вызова.

    Примичание: если сбрасывать другой буфер, или дескриптор соединения, то всё записываеться нормально, но мне нужен текстовый вывод определённых строк, генерируемых программой. Есть ли решение данной проблемы?
     
  2. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    1. Скопируй побайтно символы в новый буфер
    2.
    Код (Text):
    1. invoke WriteFile, hFileOpen, ADDR crString, 1024, ADDR ProcessReadWrite, NULL
    1024 - длина записываемой строки, нужно ставить реальную длину. Её можно получить с помощью lstrlen (kernel32)
     
  3. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    TEXTEQU Это не тип переменной.

    Кури хелп по MASMу.

    Как я понял тебе нужно переслать подстроку из буфера на место другого буфера. Или я чё-то не доганяю?
    Где хранится строка в секции или в стеке (локальный буфер)?
     
  4. core

    core New Member

    Публикаций:
    0
    Регистрация:
    9 июн 2007
    Сообщения:
    24
    S_Alex - Edmond(Руководство по проектированию макросов)
    varstr textequ <текст>
    Это не что иное, как переменная: varstr , которая содержит "текст".

    RamMerLabs - спасибо большое, проблема решена.

    Попробую.
     
  5. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    core
    Ошибаешься, varstr это символическое обозначение строковой константы "текст"
    А объявление переменной это
    crString db varstr, 0
    что эквивалентно записи
    crString db "текст",0
     
  6. core

    core New Member

    Публикаций:
    0
    Регистрация:
    9 июн 2007
    Сообщения:
    24
    Если это константа, она не изменит своё значение:

    Код (Text):
    1. stds textequ <строка1>
    2. %echo stds ;; вывод: строка1
    3. stds textequ <строка2>
    4. %echo stds ;; вывод: строка2
    stds textequ <строка1> ;текстовый макро
     
  7. core

    core New Member

    Публикаций:
    0
    Регистрация:
    9 июн 2007
    Сообщения:
    24
    RamMerLabs - не получаеться скопировать, выводиться какае-то ересь, натолкни на суть. Напомню: нужно переместить буфер1 побайтно в буфер2 а потом передать буфер2 в строку, или функцию - обработчик, которая разобьёт эту строку на более мелкие строки.

    Кто поможет? Заранее благодарен.
     
  8. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    core
    leo прав
    Он не говорил, что это константа. Он сказал, что это ее символическое обозначение.
    В Вашем примере Вы этому символическому обозначению просто поставили в соответствие другую строковую константу.
     
  9. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    копай в сторону lstrcpy из kernel32.
    да и гугль вроде работает... :)
     
  10. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    WinHelp32 SDK
     
  11. core

    core New Member

    Публикаций:
    0
    Регистрация:
    9 июн 2007
    Сообщения:
    24
    Всем спасибо, сейчас попробую.

    Пока не особо.
     
  12. core

    core New Member

    Публикаций:
    0
    Регистрация:
    9 июн 2007
    Сообщения:
    24
    Не помогло, пробовал две API функци:
    invoke lstrcpy, ADDR RecordBuffer, ADDR InetBufferRead
    invoke lstrcat, ADDR RecordBuffer, ADDR InetBufferRead
    суть - это указатель на объект, тоесть если изменить сам объект, то и копия измениться, пример:

    Код (Text):
    1. invoke lstrcpy, ADDR RecordBuffer, ADDR InetBufferRead
    2. mov InetBufferRead, NULL
    3. invoke MessageBox, NULL, ADDR RecordBuffer, NULL, MB_OK
    получим NULL, или остаток недобитого буфера, но он будет идентичен содержимому: ADDR InetBufferRead, нам нужно получить самостоятельный буфер не зависящий от InetBufferRead после извлечения текста.

    Сформирую попроще, нужно сделать идентичное следующему коду, только с чтением из буфера заранее неизвестной, сформированной по определённым правилам информацией:

    Код (Text):
    1. BufferSetPos textequ  <#BLNK#http://yandex.ru/Index.html#ELNK#>
    2. Array (inlink, TextSetPos(%BufferSetPos, #BLNK#,  #ELNK#))
    3. InetGetFile (@CatStr(!",%inlink0!"), "TEXT", "HTML.txt")
    TextSetPos вырезает содержимое между "#BLNK#" и "#ELNK#" копируя содержимое в массив: inlink с индексом 0. InetGetFile извлекает содержимое массива inlink0 и загружает информацию по ссылке http://yandex.ru/Index.html, которая должна оказаться в этом массиве и сохраняет в файл HTML.txt. Этот пример обсалютно рабочий, хотя и не автоматизированный, макроблоками FOR, или REPT, нужно сделать аналог с чтением из буфера, с заменой только одной строки:
    Код (Text):
    1. BufferSetPos textequ <#BLNK#http://yandex.ru/Index.html#ELNK#>
    Проблемка не без геммороя, но а как вы хотели.
     
  13. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    что-то я вопроса (проблемы) не понял...
    приведи код, может так будет проще...
     
  14. core

    core New Member

    Публикаций:
    0
    Регистрация:
    9 июн 2007
    Сообщения:
    24
    Проблема:
    BufferSetPos textequ <#BLNK#http://yandex.ru/Index.html#ELNK#> - так обрезаеться и массив получает: http://yandex.ru/Index.html

    Так не работает:
    BufferSetPos textequ <OFFSET ADDR RecordBuffer>

    или так(эффект один):
    BufferSetPos textequ <OFFSET InetBufferRead>

    ну и третий вариант:
    Array (inlink, TextSetPos(OFFSET InetBufferRead, #BLNK#, #ELNK#))

    Возможно(скорее всего) передаёться не строка BufferSetPos а ссылка на InetBufferRead, поэтому строка не может быть изменена и выходит: #BLNK#http://yandex.ru/Index.html#ELNK#, вместо: http://yandex.ru/Index.html

    Код приводить пока не буду, так как он вовсе не абстрагирует проблему.
     
  15. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    ты это делаешь при инициализации данных (.data), или при выполнении кода?

    если при инициализации, то BufferSetPos - константа, её ты никак не изменишь;
    если при выполнении - textequ не будет работать.

    может стОит так:

    .data?
    BufferSetPos db 256 dup(?)
    InetBufferRead db 256 dup(?)
    .code
    ;при выполнении заполняем InetBufferRead сторокой типа "#BLNK#http://yandex.ru/Index.html#ELNK#"
    ;преобразуем в "http://yandex.ru/Index.html"
    invoke lstrcpy, addr BufferSetPos, addr InetBufferRead
     
  16. core

    core New Member

    Публикаций:
    0
    Регистрация:
    9 июн 2007
    Сообщения:
    24
    Хорошо, как ты преобразуешь, если преобразует макрос, состоящий из локальных переменных типа textequ: LOCAL result, buffnewstr, pos1, pos2, stringoutbseath, outstringr, stringlength

    В том то и проблема, что он возращает строку обратно, в первозданном виде. В случае:
    BufferSetPos textequ <#BLNK#http://yandex.ru/Index.html#ELNK#>, вернёться: http://yandex.ru/Index.html
     
  17. core

    core New Member

    Публикаций:
    0
    Регистрация:
    9 июн 2007
    Сообщения:
    24
    Кажеться начинаю понимать суть проблемы, думаю сам решу, всем спасибо за помощь.
     
  18. G13

    G13 New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2006
    Сообщения:
    499
    core, ты уверен, что понимаешь, как работает механизм макроподстановок?

    Эта сентенция:
    Код (Text):
    1. Foo textequ <"bar">
    просто означает, что в твоём коде перед компиляцией будут заменены все символические обозначения Foo на непосредственное значение "bar". Т.е. код

    Код (Text):
    1. String1   db "Sample tool",Foo,0
    примет вид
    Код (Text):
    1. String1   db "Sample tool","bar",0
    Написать лоадер для малвара, не зная масма.... Задача и впрямь не из лёгких… Х)
     
  19. core

    core New Member

    Публикаций:
    0
    Регистрация:
    9 июн 2007
    Сообщения:
    24
    Когда я последний раз отписывался, я уже понял суть проблемы, а она проста:
    при вызове макроса, происходила макроподстановка текста и выполнялся код вроде:
    InetGetFile ("http://yandex.ru/Index.html", "TEXT", "report.txt") и именно он уже загружал страницу при запуске программы. Не спорю, некоторых тонкостей я не знаю, но я справлюсь, опыт прийдёт со временем, немного подправлю код и всё будет работать.

    Спасибо всем, кто натолкнул меня на верную мысль, особенно: RamMerLabs
    Тему можно закрыть, проблема решена.