Есть фрагмент кода (достаточно большой), состоящий целиком из операций test над битами в байтах и переходов в зависимости от результатов. Довольно запутанный. Есть ли какой-либо алгоритм быстрого превращения такого кода в высокоуровневые конструкции типа .IF?
Думаю, автоматического нет для этого. Помню, сам анализировал такой код, приходилось очень вдумчиво восстанавливать алгоритм.
green Думаю, получится то же самое Код не человеком запутан, он стал таким после разворачивания сложных условий.
Broken Sword Есть один вариант... Я так понимаю, код получен в ИДА? Если так, то выложи интересующую тебя процедуру в виде asm-файла (желательно без cross-ref, без опкодов и комментариев). Положительного решения не обещаю, но попробую, вдруг получится?
crypto, там 30 страниц A4 Я по странице в час где-то осиливаю, просто интересовал сам алгоритм, а он есть, я уверен. Еще страниц 5 осилю и алгоритм нарисуется сам собой )
Вроде в тему. В принципе, в Олли дебаггере что-то подобное используется. Там опция есть - трактовать последовательность сравнений как кейс...
Broken Sword А в виде текстового файла нет? Выложи ради интереса. asmfan Дык, ИДА тоже может определять кейсы для некоторых случаев. А для подобных конструкций: sub eax, 3 jz @1 dec eax jnz @2 ... @1: sub eax, 34 ja @3 jb @4 ... ... ИДА бессильна.
Пожалуйста. сори за код, не заметил аттача "в быстром ответе", в понедельник прицеплю Да, это эвристика nod32 полностью расколупанная. Значения 90% флагов уже известны.
Broken Sword Вот что выдал мой анализатор кода. К сожалению, здесь только структура и некоторые конструкции еще не охвачены (сам увидишь, какие). Я попробую совокупить два текста, но наверное тебе самому проще проверить некоторые места. Код (Text): if (!=) { } if (!=) { } if ((!= || !=) && != && != && (!= || !=) && != && != && !=) { } if (!= && != && != && != && != && != && != && !=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (>= || !=) { } if (!= || (!= && !=) || != || (!= && !=) || != || (!= && !=) || != || (!= && !=) || !=) { } if (!= && !=) { } if (!= && != && !=) { } if (!= && != && !=) { } if ((!= && !=) || ((!= || !=) && !=)) { } if (!= && !=) { } if ((!= && (!= || !=)) || (!= && !=)) { } if ((!= && (!= || !=)) || !=) { } if (!=) { } if ((!= || !=) && (!= || !=)) { } if (!= || != || !=) { } if (!= && (!= || !=)) { } if (!= && != && != && !=) { } if (!= && !=) { if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (>=) { } } if (!= && != && !=) { } if (!= && !=) { } if (!= || (!= && !=)) { } if ((!= && !=) || (!= && !=) || != || !=) { } if (!=) { } if (!=) { } if (!= || !=) { } if (!=) { } if (!=) { } if (!= || !=) { } if (!=) { } if (>=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (>=) { } if (< && != && != && != && (!= || !=)) { } else { } if (!=) { } if (!= || !=) { } if (!=) { } if (!=) { } if (==) { } if ((== || == || == || !=) && != && != && == && >) { } if (!= && (!= || !=)) { } B96 == && == B97 == || (== && ==) J97 @96 b1 loc_138CB51 @97 b1 j1 loc_138CB56 if (!= && != && ((!= && !=) || !=)) { } if (!= || !=) { } if (!= || != || !=) { } if (!= || (!= && !=) || != || != || != || !=) { } if (!= || != || !=) { } if (!= || !=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } B124 (!= || != || != || !=) && >= && >= @123 j1 loc_138CCD6 B125 == || == || == || == || == || == B126 > J126 @124 b1 loc_138CD19 J123 @125 b1 loc_138CD26 @126 b1 j1 loc_138CD2C if (!= && != && != && != && != && != && != && != && <) { } if (!= && != && !=) { } if (!=) { } if (!= && != && != && !=) { } if ((== || (== && <=)) && != && != && ==) { } if (!= && != && != && (!= || !=) && (!= || !=)) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (== || <) goto loc_138CEC4 if (!= || !=) { goto loc_138CECA } if (!= || !=) { if (!=) { } if (!= || !=) { } if (!=) { } if (!=) { } else { if (!=) { } } if (!= || !=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { if (!=) { } else { } } if (!=) { } if (!=) { if (== && ==) { } else { } } if (!=) { } if (> || (>= && <) || (>= && ==)) { } } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!= && != && >=) { } if ((!= && !=) || (!= && (!= || !=))) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!= && !=) { } if ((!= || !=) && (>= || (>= && <))) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (>=) { } if (!= && != && != && != && != && != && != && != && != && != && != && != && == && < && <) { } if (!= && (!= || (!= && !=)) && <=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!= && >=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (!=) { } if (>) { } if (!= && <= && (!= || != || !=)) { } if (!=) { if (<= && !=) { } } if (!= && != && <=) { } if (!= && <=) { } if (!= && <=) { } if (!= && <=) { } if (!= && <=) { } if (!= && != && <=) { } if (!=) { } if (!= && <= && ==) { } if (!= && != && <=) { }
Broken Sword Дык, != в твоем случае означает, что условие не выполняется, например if (ARA_byte_VirusCharacteristics & 0x40 != 0) { ARA_byte_VirusCharacteristics |= 0x20; }
Он еще на стадии разработки, как ты видел некоторые конструкции он еще не разбирает. Не хочется выпускать сырой продукт.