помогите найти ошибку

Тема в разделе "WASM.NETWORKS", создана пользователем UnW1n, 25 ноя 2006.

  1. UnW1n

    UnW1n New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2006
    Сообщения:
    13
    доброго времени суток всем.
    помогите найти ошибку в коде
    заранее сорри за размеры кода
    вот вариант на С++

    [в аттаче]

    А вот мой вариант на АСМ

    [в аттаче]

    так вот проблема :
    у меня сорс на С++ чудесно шлет пакеты со всеми полями заполненными корректно
    Сорс на асме тоже шлет отлично но неправильно считает контрольную сумму TCP заголовка. сумма IP считается нормально и сниффер грит что она CORRECT а TCP - incorrect. ткните носом где ошибка, недели полторы парюсь
     
  2. UnW1n

    UnW1n New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2006
    Сообщения:
    13
    скорее всего неправильно структуры заполняю или отаю на подсчет.. но вроде все как на С++
     
  3. Proteus

    Proteus Member

    Публикаций:
    0
    Регистрация:
    19 июн 2004
    Сообщения:
    344
    Адрес:
    Russia
    Так пошли одинаковые пакеты и сравни...
     
  4. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    UnW1n
    Ну вот, собрался ответить, а код уже вырезан :dntknw:
    Видимо дело в том, что ты в checksum повторно пушишь ebp и в результате считаешь контрольную сумму адреса возврата. Отключи автогенерацию пролога и эпилога (option prologue:none и т.д.)
     
  5. UnW1n

    UnW1n New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2006
    Сообщения:
    13
    я не увидел же опция. посмотрел по линкеру и компилеру опции - там нет. MASM32 9 версии
     
  6. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    UnW1n
    Неужели ты думаешь, что линкер может иметь какое-то отношение к генерации прологов/эпилогов? Ты хоть знаешь что это вообще такое? Открой документацию масма и внимательно почитай.
     
  7. UnW1n

    UnW1n New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2006
    Сообщения:
    13
    2 протеус : я совершенно одинаковые посылаю
    вот что на выходе :

    С++ / АСМ
    000C6E89DFA400C0DF13E48C080045000028F44D000080064C56FAB23D23C0A801AE067E01BD6E3000000000000050024000FF460000
    000C6E89DFA400C0DF13E48C0800450000289E1F0000800699EA5D12E35DC0A801AE067E01BD6E3400000000000050024000FF460000

    внимательный читатель увидит разницу только в 2х байтах - это ТЦП ЦРЦ
     
  8. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    а я насчитал 9 отличающихся байтов =)
     
  9. Proteus

    Proteus Member

    Публикаций:
    0
    Регистрация:
    19 июн 2004
    Сообщения:
    344
    Адрес:
    Russia
    Потрясно..
     
  10. spencer

    spencer New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2005
    Сообщения:
    277
    внимательный читатель увидел разницу в 15 байт )
     
  11. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    spencer
    Сколько бит в твоем байте? 4?
     
  12. UnW1n

    UnW1n New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2006
    Сообщения:
    13
    :)
    да блин. почему црц то не совпадает?
    в сорсе ошибок нет?
     
  13. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.568
    Адрес:
    Russia
    Вам leo все сказал уже.. Почитай его пост внимательно.
     
  14. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    UnW1n
    А где им ещё быть? Посмотри на свой экзешник в дизассемблере.
     
  15. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    UnW1n
    Есть конечно, но ты или не вьезжаешь или не слушаешь, что тебе говорят ;)
    В глаза бросаются две серъезные ошибки:

    1) Неверный порядок передачи параметров при вызове checksum - сначала нужно пушить размер lsize, а потом указатель на буфер lpbuffer, а у тебя наоборот. При stdcall параметры пушатся в стек, начиная с конца, и в итоге при входе в функцию первый параметр оказывается ближе к вершине стека [ebp+8], а следущие идут по нарастающим смещениям [ebp+0Ch] и т.д. А у тебя все наоборот, как при pascal-вызове

    2) Proc это макрос, который сам генерит пролог push ebp + mov ebp,esp и заменяет инструкцию ret на макрос ret, выполняющий эпилог mov esp,ebp + pop ebp + retn param_size. А ты к этому прологу в checksum proc еще добавляешь push ebp - в результате смещения входных параметров относительно ebp увеличиваются на 4 и [ebp+8] указывает уже не на lpbuffer, а на ret_address, а [ebp+0Ch] должна по логике указывать на lpbuffer, но т.к. ты передаешь параметры задом наперед, то в [ebp+0Ch] оказывается размер. В итоге ты всегда считаешь контрольную сумму куска кода фикс.размера, следующего за call checksum.
    (Кстати, если бы ты передавал параметры в правильном порядке, то скорее всего нарвался бы на Access Violation)

    Есть два варианта исправления:
    1) Использовать стандартный пролог\эпилог, выкинув push\pop ebp
    Код (Text):
    1. checksum proc  lbuffer:dword, lsize: dword
    2.     ;push   ebp           ;УБРАТЬ
    3.     ;mov    ebp, esp      ;УБРАТЬ
    4.     sub    esp, 0Ch
    5.     mov    eax, lpbuffer  ;= mov eax, [ebp+8]
    6.     mov    [ebp-8], eax
    7.     mov    ecx, lsize     ;= mov ecx, [ebp+0Ch]
    8.     mov    [ebp-0Ch], ecx
    9.     .................
    10.     ;mov    esp, ebp     ;УБРАТЬ
    11.     ;pop    ebp          ;УБРАТЬ
    12.     ret
    13. checksum endp
    2) Отключить стандартный пролог\эпилог и заменить ret на ret 8
    Код (Text):
    1. checksum proc  lbuffer:dword, lsize: dword
    2. option prologue : none ;отключаем автогенерацию пролога\эпилога
    3. option epilogue : none
    4.    push ebp
    5.    mov ebp,esp
    6.    ...........
    7.    mov esp,ebp
    8.    pop ebp
    9.    ret 8            ;!!! удаляем входные параметры из стека
    10. option prologue : prologuedef ;восстанавливаем
    11. option epilogue : epiloguedef
    12. checksum endp
     
  16. UnW1n

    UnW1n New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2006
    Сообщения:
    13
    ухты
     
  17. UnW1n

    UnW1n New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2006
    Сообщения:
    13
    поправил все как сказали. вот что получилось. (црс инкоррект серано)