[Asm] Прочитать фаил и ....

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by ChernoHod, 26 Oct 2011.

  1. ChernoHod

    ChernoHod New Member

    Joined:
    20 Mar 2011
    Messages:
    10
    Likes Received:
    0
    Reputations:
    0
    Всем привет.
    Есть фаил с данными "ip:port" вот типо этого:

    127.0.0.1:80
    127.0.0.2:8080

    Как проще считать эти данные?Чтоб было вот так:

    ip1 dd ? - тут первый ip адресс
    ip2 dd ? - тут второй ip адресс

    port1 dd ? - тут первый порт
    port2 dd ? - тут второй порт

    Начало делаю так:



    Code:
    format PE GUI 4.0
    entry start
    include 'win32a.inc'   
    
    
    start:
    
         invoke   _lopen,proxylist,0           ; открыл фаил
    
         mov      [hFile],eax                  ; сохранил его хенд
    
         invoke   _lread,[hFile],buffer,500    ; считал данные в "buffer"
        
    
         ret                                   ; выход из проги
    
    
    proxylist    db  'pr.txt',0  
    ip1          dd  ?
    ip2          dd  ?
    
    port1        dd  ?
    port2        dd  ?
    
    buffer       rb  500  
    
    
    
    section '.idata' import data readable writeable
     library kernel32,'KERNEL32.DLL',\
              user32,'USER32.DLL'
    
    
      include 'api/kernel32.inc'
      include 'api/user32.inc'
    Открыл фаил,прочитал из него данные.Как дальше?Подскажите.
     
  2. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    Ну лично я бы или делал маппинг, либо GetFileSize + VirtualAlloc для буфера.
    Для перевода IP в число воспользуйся функцией inet_addr

    А алгоритм прост. Выделяешь 4 байтный указатель или регистр для фиксации смещения.
    Например так char *p=buffer; далее выделяешь щетчик 4 байтный или регистр... типа int uk=0;
    Запускаешь цикл пока указатель uk меньше размера буфера
    Читаешь буфер до ':', ставишь вместо него 0 (buffer[uk]=0) - теперь у тебя по указателю p будет строка ip адрес - передаешь ее в функцию inet_addr сохраняешь результат.
    присваиваешь p=&b[uk];
    идешь по буферу дальше натыкаешься на "\n" - 0x0A (насколько помню) ставишь buffer[uk]=0 теперь у тебя p указывает на строку порта - тебе нажо ее перевести в число... ставишь опять p на нужную позицию...

    Вот и весь разбор.
    А вообще на ассемблере можно много интересных способов придумать
     
    _________________________