Перевод Ся на АСМ

Тема в разделе "WASM.BEGINNERS", создана пользователем wsd, 7 сен 2007.

  1. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    на С есть код(использование RasServise)
    Код (Text):
    1. RASCONN ras[20];
    2. DWORD dSize,dNumber;
    3. ras[0].dwSize = sizeof(RASCONN);
    4. dSize = sizeof( ras );
    5. int ret=RasEnumConnections( ras, &dSize, &dNumber )
    работает нормально с кодом завершения 0

    перевод(MASM32)
    Код (Text):
    1. .data
    2. dSize               dd 0
    3. rasCon              RASCONN 20 dup(<0>)
    4. dNumber             dd 0
    5. ...
    6. .code
    7. mov rasCon[0].dwSize, sizeof RASCONN
    8. mov dSize, sizeof rasCon
    9.    
    10. invoke RasEnumConnections, addr rasCon, addr dSize, addr dNumber
    ASM вариант почемуто возвращает ERROR_INVALID_SIZE....
    Какой сайз я сделал инвалидом?
     
  2. GMax

    GMax Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    218
    А что мешает самому посмотреть в отладчике?
     
  3. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Нашёл!
    Смотрел сишные хидеры, а там оказывается
    структура RASCONN меняется в размере от версии винды.
    А в масме хедере нет...
     
  4. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Кстати топик называется "Перевод Ся на АСМ"
    а не "реверсирование rasapi32.dll"
     
  5. GMax

    GMax Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    218
    Изменение размера структуры в новых версиях не должно повлиять на работу старых программ. Это называется совместимостью, для этого и передается размер структуры.
    А отладчик нужен в первую очередь для отладки своих программ.
     
  6. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    GMax
    Но в стандартных масмовских версиях хидера
    описана очень ранняя версия этой структуры.
    Пришлось руками свою по сишным хидерам делать.

    Спасибо за участие!
     
  7. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Да а на счёт совместимости
    код в начале топика хорош пример...
     
  8. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    GMax
    Тут ситуация прояснилась!
    Сначала я просто чисто текстуально искал проблему.
    А так как текстуально проблемы не было , я воспринял Ваш намёк на
    отладчик как призыв к реверсу rasapi32.dll потому что в моей как...ке
    повторяюсь текстуально проблем не было.
    И всё-таки мне эта проблема стала глубоко интересна.
    Я нашёл наконец время и реверснул маленько rasapi32.dll.
    Хорошо что там быстро нашёл свечу(.text:76ED6931) на выбор размеров вариантов структуры.
    Обычно прибегаю к реверсу крайне редко, потому как неизвестно заранее
    сколько это займёт время.
    Там действительно полная совместимость как Вы и говорили!
    5 вариантов структур!
    Всё дело оказалось в том что в ras.h в начале идут включения других хидеров
    а в них прагмами задаётся выравнивания и я это дело сразу непросёк!!!!
    А мой случай последнего варианта этой структуры просто совпал с выровненным
    размером чисто случайно.И поэтому чисто случайно и работало!!!
    И всётаки непонимаю составителей хидеров масма... Почему они сами
    не включили в структуру фиктивное выравнивающее поле?
    GMax большое спасибо за намёк!
    И извиняюсь что не так его понял:)))
     
  9. GMax

    GMax Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    218
    wsd
    Я рад, что оказался полезен.
    Когда писал по отладчик имел ввиду проверить передаваемые функции параметры.
    Запустить работающую версию программы (С) и не работающую (ASM) под отладчиком и сравнить передаваемый размер структуры.
    А составителям хидеров MASM32 надо сказать спасибо за то что не приходится все делать с нуля.
     
  10. 01478520

    01478520 New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2007
    Сообщения:
    39
    К как вот это перевести с С на АСМ:
    Код (Text):
    1.         static char szStr[256];
    2.         ZeroMemory(szStr, sizeof(szStr));
    3.  
    4.         static char szText[256];
    5.         strcpy(szText, "0123456789");
    6.  
    7.         static unsigned char buffer[256];
    8.         ZeroMemory(buffer, sizeof(buffer));
    9.  
    10.         int i = 0, k = 0;
    11.         while (TRUE)
    12.         {
    13.            
    14.         buffer[k] = (unsigned char)szText[i];
    15.                 if (!szText[i])
    16.                         break;
    17.                 k = (unsigned char)szText[i];
    18.                 i++;
    19.        
    20.         }
     
  11. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    bcc32 -S в помощь.
     
  12. 01478520

    01478520 New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2007
    Сообщения:
    39
    censored

    борланд 5? ну и что это даст, я просто не понимаю С
    char dupel[5] это dupel db 5 dup (?) ?
     
  13. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    возможно
     
  14. GMax

    GMax Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    218
    ASM:
    Код (Text):
    1. .data
    2.   szText db "0123456789",0
    3.   szStr  db 256 dup (0)
    4.   buffer db 256 dup (0)
    5.  
    6. .code
    7.     xor ecx,ecx
    8.     xor edi,edi
    9. loop:
    10.     mov al, BYTE PTR szText[ecx]
    11.     mov BYTE PTR buffer[edi],al
    12.     .if al!=0
    13.         jmp exitloop
    14.     .endif
    15.     mov dl,al
    16.     inc ecx
    17.     jmp loop
    18. exitloop:
    IMHO:
    В данном коде обнуление массивов не нужно.
    И вообще странный (не оптимальный) алгоритм.

    add:
    Сори сразу не разобрался. Поправил код.
     
  15. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
  16. 01478520

    01478520 New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2007
    Сообщения:
    39
    IceStudent

    так точно, Циклический Инкремент Пароля
    GMax
    неоптимален код вообще или на Си?
     
  17. 01478520

    01478520 New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2007
    Сообщения:
    39
    Код (Text):
    1. #include "stdio.h"
    2. #include "conio.h"
    3. #include "windows.h"
    4.  
    5. int main(int argc, char* argv[])
    6. {
    7.         static char szPassword[256];
    8.         ZeroMemory(szPassword, sizeof(szPassword));
    9.  
    10.         static char szAlphabet[256];
    11.         strcpy(szAlphabet, "ABC");
    12.  
    13.         static unsigned char bAlphabet[256];
    14.         ZeroMemory(bAlphabet, sizeof(bAlphabet));
    15.  
    16.         int i = 0, k = 0;
    17.         while (TRUE)
    18.         {
    19.            
    20.                 bAlphabet[k] = (unsigned char)szAlphabet[i];
    21.                 if (!szAlphabet[i])
    22.                         break;
    23.                 k = (unsigned char)szAlphabet[i];
    24.                 i++;
    25.        
    26.         }
    27.  
    28.         while (TRUE)
    29.         {
    30.                 __asm
    31.                 {
    32.                     nop
    33.                     nop
    34.                     pushad
    35.                     mov edi,offset szPassword
    36.                     mov ebx,offset bAlphabet
    37.                 L1: movzx eax,byte ptr [edi]
    38.                     xlat
    39.                     cmp al,0
    40.                     je L3
    41.                     mov [edi],al
    42.                     jmp L5
    43.  
    44.                 L3: xlat
    45.                     stosb
    46.                     jmp L1
    47.  
    48.                 L5: popad
    49.                     nop
    50.                     nop
    51.                 }
    52.                
    53.                 printf("%s\n", szPassword);
    54.                
    55.         }
    56.         return 0;
    57. }
    Я зацепился за xlat Не пойму как она работает.

    в Олли: xlat byte ptr [ebx+al].
    или вот что у меня в АСМБУКЕ:
    al=31
    [ebx] -> 0123
    то есть буквально: xlat byte ptr [адрес 30 + смещение 31]
    но ведь адрес [0+31] , будет гдето 0123...................................61

    или я тормоз...
     
  18. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    01478520
    Забей на xlat, если не важен размер кода.

    Код (Text):
    1. ;<< buildLmABCTable
    2. buildLmABCTable:
    3.    
    4.     push    ebx esi edi ebp
    5.    
    6.     mov esi,bLmAlphabet
    7.     mov edi,bLmAbcTable
    8.     mov ebp,[nLmAlphabet]
    9.     shr ebp,2
    10.     adc ebp,0               ; минимум 1 проход
    11.    
    12.     ; очистка таблицы
    13.     mov edx,edi
    14.     mov ecx,nAlphabetLen/4
    15.     xor eax,eax
    16.     rep stosd
    17.     mov edi,edx
    18.    
    19. align ALIGN_CYCLES
    20. @@:
    21.     movzx   eax,byte[esi]       ; 1й символ
    22.     movzx   edx,byte[esi+1]     ; 2й символ
    23.     movzx   ecx,byte[esi+2]     ; 3й символ
    24.     movzx   ebx,byte[esi+3]     ; 4й символ
    25.     mov [edi+eax],dl        ; 2й по адресу 1го
    26.     mov [edi+edx],cl        ; 3й по адресу 2го
    27.     movzx   edx,byte[esi+4]     ; 5й символ
    28.     mov [edi+ecx],bl        ; 4й по адресу 3го
    29.     mov [edi+ebx],dl        ; 5й по адресу 4го
    30.    
    31.     add esi,4
    32.     sub ebp,1
    33.     jnz @B
    34.  
    35.     mov al,[bLmAlphabet]
    36.     mov [edi],ax            ; 1й символ по адресу 0
    37.    
    38.     pop ebp edi esi ebx
    39.     ret
    40. ;>>
     
  19. 01478520

    01478520 New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2007
    Сообщения:
    39
    угу. посмотрим. спасибо.
    [megaofftop]
    а movzx обнуляет и заносит? или как?
    и где почитать про инструкции (как можно полный список) в таком виде:
    MOVZX это - ................

    Признаки ........

    Команда: MOVZX ............

    Логика: ...................

    Описание ...........................
    -------------------------------------------------------------
    Операнды Такты Обращения Байты Пример
    ............. ..... ...... .... ......
    -------------------------------------------------------------

    Примечания:
    Пример:
    PS: buildLmABCTable из какогото брута реверснул?
     
  20. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    01478520
    По поводу инструкций гугли opcodes.hlp или x86eas.hlp