вопрос по контролу.асм

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by DooD, 27 Mar 2011.

  1. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    Здрасте.у меня будет два вопроса.
    1)по нажатию кнопки у меня должен текст из edit контрола записываться в файл,вот как я делаю
    Code:
    .IF ax==ButtonID
    shr eax,16
    .IF ax==BN_CLICKED
    invoke GetWindowText,hwndEdit,ADDR buffer,512
    invoke WriteFile,hFile,addr buffer,512,addr htemp,0
    .ENDIF 
    
    но файл так и остается пуст.подскажите что не так,или может как по другому можно текст из edit записать в файл по нажатию кнопки(код определения нажатия кнопки вроде ж правильный)

    и 2)
    допустим в opendialog я выбрал какой либо файл,как записать путь к нему в edit?
     
  2. 57005

    57005 New Member

    Joined:
    8 May 2009
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    1) С каким режимом доступа открывали файл ( GENERIC_READ,GENERIC_WRITE )?
    2) В структуре OPENFILENAME, lpstrFile является указателем на буфер, который содержит имя файла.

    invoke SendMessage,hWndControl,WM_SETTEXT,0,OPENFILENAME.lpstrFile
     
  3. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    с режимом доступа Generic_write
     
  4. Sams

    Sams Member

    Joined:
    18 Apr 2009
    Messages:
    247
    Likes Received:
    70
    Reputations:
    17
    1. Покажи как ты объявляешь buffer.
    2. Проверь содержимое buffer после GetWindowText.
    3. Проверь, чему равна htemp после WriteFile.

    Да и вообще, по отрывку кода из программы что-то советовать - это как пальцем в небо. Порой бывает и во всем коде разобраться не можешь.
    Учись пользоваться ollydbg. Хорошо владеющий отладчиком программист, почти никогда не задает вопросов такого типа.
     
  5. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    буфер обьявляю так
    buffer db 512 dup(?)

    насчет оли это да,может посоветуешь что почитать?а то я как то так все вручную да вручную...

    насчет куска кода:просто это и есть самая важная часть,все остальное это создание окна и контролов.
     
  6. Sams

    Sams Member

    Joined:
    18 Apr 2009
    Messages:
    247
    Likes Received:
    70
    Reputations:
    17
    Ну тогда вот эти данные выложи:
    Почитать? Рикардо Нарваха, цикл статей "Введение в крэкинг с нуля, используя OllyDbg". Там не то, что бы по полочкам расписано, там как для людей, которые еще не умеют толком работать в Windows, но уже хотят уметь отлаживать программы :D
     
    #6 Sams, 27 Mar 2011
    Last edited: 27 Mar 2011
  7. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    всмысле?как?вобще в msgbox-e выдается тот текст что я ввожу,а в файл чето не пишется.нащет статей это на wasm прямиком?
     
  8. Sams

    Sams Member

    Joined:
    18 Apr 2009
    Messages:
    247
    Likes Received:
    70
    Reputations:
    17
    Да.

    Покажи код, где ты используешь CreateFileA
     
  9. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    капец,я тупанул....все нашел,разобрался,спасибо за чтиво,а тогда еще вопрос,заранее кол-во символов в edite неизвестно,как определить скоко записывать?
    так :bufff dd $-buf ?
     
    #9 DooD, 28 Mar 2011
    Last edited: 28 Mar 2011
  10. Sams

    Sams Member

    Joined:
    18 Apr 2009
    Messages:
    247
    Likes Received:
    70
    Reputations:
    17
    Записывать в смысле считывать в буфер? Мм, думаю никак. Делаешь буфера приблизительно с запасом, и считываешь туда. Отвыкай от динамических безразмерных массивов высокоуровневых ЯП ;)

    если честно, я даже представить не могу что из этого получиться :) По идее у тебя в bufff вообще окажется какое-то смещение. $ (текущий адрес) - buf (адрес метки), в итоге получишь просто смещение метки buf относительно адреса переменной bufff. По идее. Хотя я могу ошибаться. Я такими записями редко пользуюсь и только в одном случае - подсчета размера каких либо данных:
    buff1 db 1,2,3,4,5,6,7
    buff2 equ $-buff1
     
    #10 Sams, 28 Mar 2011
    Last edited: 28 Mar 2011
  11. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    та да,на высокоуровневых языках с этим полегче
    записывать файл,к примеру сделать буфер размером 512 байт, и записать всего 3-4 символа,то 508-509 байт запишутся как пустота.вот я имел ввиду как етого избежать.
     
  12. Sams

    Sams Member

    Joined:
    18 Apr 2009
    Messages:
    247
    Likes Received:
    70
    Reputations:
    17
    Кстати, по поводу буфера считывание...Можно пользоваться стеком ;) Тогда не нужно будет выделять под буфер память, и соответственно программа будет меньше занимать места, а так же не нужно мудрить с размером буфера.
    Только с этим делом нужно очень аккуратно быть, а то существует очень замечательная уязвимость "Stack overflow".
     
  13. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    пример?:)пушить?
     
  14. Sams

    Sams Member

    Joined:
    18 Apr 2009
    Messages:
    247
    Likes Received:
    70
    Reputations:
    17
    Нет, ты что пушать, это же с ума сойти можно.

    Например ты читаешь 512 байт из файла. Ты хочешь что бы данные содержались в стеке. Адрес буфера вычисляешь по формуле:
    Code:
    <Текущий адрес стека> - <512> = <адрес буфера>
    Почему отнимаем 512? Потому что стек растет сверху вниз, и когда в него будет происходит записать при помощи ReadFile допустим, то данные будут забиваться снизу вверх. Таким образом мы "резервируем" в стеке 512 байт под наши данные, и всё делаем аккуратненько ничего не затирая.

    Code:
          +-------------------------+
    1000h | Текущее положение стека |
          +-------------------------+
          |                         |
          |   512 байт под буфер    |
          |                         |
          +-------------------------+
    488h  | Адрес буфера            |
          +-------------------------+
    Вот тебе небольшой пример. Но я не стал читать из файла, просто переписал данные, заранее забитые в буфер, расположенный в секции данных, в стек.
    Главное понять принцип, дальше работу с файлами освоишь сам.

    Code:
    .386
    .model flat, stdcall
    
    option casemap:none
    include \masm32\include\windows.inc
    include \masm32\include\kernel32.inc
    include \masm32\include\user32.inc
    
    includelib \masm32\lib\kernel32.lib
    includelib \masm32\lib\user32.lib
    
    .data
    buff db 1,2,3,4,5,6,7,8,9
         db 1,2,3,4,5,6,7,8,9
         db 1,2,3,4,5,6,7,8,9
         db 1,2,3,4,5,6,7,8,9
    buff_size equ $-buff
    	 
    .code
    start:
    	mov esi,offset buff
    	mov edi,esp
    	sub edi,buff_size
    	mov ecx,buff_size
    	rep movsb
    	
    	push 0
    	call ExitProcess
    end start
    Увидеть результат можно только под отладчиком. Если ты заглянешь в стек, то увидишь там buff.
     
    1 person likes this.
  15. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    понятно...так конечно геморнее чем писать напрямую,но все же спасибо,мб заюзаю.
     
  16. fluffylion

    fluffylion Member

    Joined:
    22 Feb 2010
    Messages:
    55
    Likes Received:
    10
    Reputations:
    0
    GetWindowTextLength
     
    1 person likes this.
  17. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    угу спасибо:)