доброго времени суток всем. помогите найти ошибку в коде заранее сорри за размеры кода вот вариант на С++ [в аттаче] А вот мой вариант на АСМ [в аттаче] так вот проблема : у меня сорс на С++ чудесно шлет пакеты со всеми полями заполненными корректно Сорс на асме тоже шлет отлично но неправильно считает контрольную сумму TCP заголовка. сумма IP считается нормально и сниффер грит что она CORRECT а TCP - incorrect. ткните носом где ошибка, недели полторы парюсь
UnW1n Ну вот, собрался ответить, а код уже вырезан Видимо дело в том, что ты в checksum повторно пушишь ebp и в результате считаешь контрольную сумму адреса возврата. Отключи автогенерацию пролога и эпилога (option prologue:none и т.д.)
UnW1n Неужели ты думаешь, что линкер может иметь какое-то отношение к генерации прологов/эпилогов? Ты хоть знаешь что это вообще такое? Открой документацию масма и внимательно почитай.
2 протеус : я совершенно одинаковые посылаю вот что на выходе : С++ / АСМ 000C6E89DFA400C0DF13E48C080045000028F44D000080064C56FAB23D23C0A801AE067E01BD6E3000000000000050024000FF460000 000C6E89DFA400C0DF13E48C0800450000289E1F0000800699EA5D12E35DC0A801AE067E01BD6E3400000000000050024000FF460000 внимательный читатель увидит разницу только в 2х байтах - это ТЦП ЦРЦ
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): checksum proc lbuffer:dword, lsize: dword ;push ebp ;УБРАТЬ ;mov ebp, esp ;УБРАТЬ sub esp, 0Ch mov eax, lpbuffer ;= mov eax, [ebp+8] mov [ebp-8], eax mov ecx, lsize ;= mov ecx, [ebp+0Ch] mov [ebp-0Ch], ecx ................. ;mov esp, ebp ;УБРАТЬ ;pop ebp ;УБРАТЬ ret checksum endp 2) Отключить стандартный пролог\эпилог и заменить ret на ret 8 Код (Text): checksum proc lbuffer:dword, lsize: dword option prologue : none ;отключаем автогенерацию пролога\эпилога option epilogue : none push ebp mov ebp,esp ........... mov esp,ebp pop ebp ret 8 ;!!! удаляем входные параметры из стека option prologue : prologuedef ;восстанавливаем option epilogue : epiloguedef checksum endp