Реверсю демона, опыта у меня с гулькин нос, вот только пришлось плотно взяться, раньше были только азы... И вот добрался уже до нужного мне места вроде как, и столкнулся с нелогичной ситуацией, как мне кажется.. И вот понять не могу, или я не правильно читаю код, или это IDA запуталась? У кого есть опыт, подскажите, что это, шум или ловушки от дизасма? Или все нормально, так и должно быть? Первая функция, она на основе базового значения берет из массива 16 байтного зашитое число и вычисляет значение нужное для алгоритма расчета ключа, вроде все понятно, не понятное в конце, когда вызывается _some_sub_function. Код (ASM): _generate_magic_number ; int __cdecl generate_magic_number(int baseConst) _generate_magic_number _generate_magic_number _generate_magic_number ; __unwind { _generate_magic_number 000 PUSH {R4,LR} _generate_magic_number+4 008 MOV R4, R0 ; $r4 = 65537 _generate_magic_number+8 008 MOV R0, #0 ; timer _generate_magic_number+C 008 BL time _generate_magic_number+10 008 BL srand _generate_magic_number+14 008 BL rand _generate_magic_number+18 008 CMP R4, #65536 ; If base == 65536 _generate_magic_number+1C 008 BEQ loc_88A540 ; Then flag = 0 _generate_magic_number+20 008 LDR R3, =65537 _generate_magic_number+24 008 CMP R4, R3 ; else if base == 65537 _generate_magic_number+28 008 BEQ loc_88A51C ; flag = 1 _generate_magic_number+2C 008 CMP R4, #0 ; else if base == 0 _generate_magic_number+30 008 MOVEQ R2, #2 ; flag = 2 _generate_magic_number+34 008 BEQ loc_88A520 _generate_magic_number+38 008 MOV R1, #0 ; else (base != 0) $r1 = 0 _generate_magic_number+3C 008 BL _some_sub_function ; and to gen function passed random number, getted at start _generate_magic_number+40 008 MOV R0, R1 ; return 0 _generate_magic_number+44 008 POP {R4,PC} _generate_magic_number+48 _generate_magic_number+48 loc_88A51C ; flag = 1 _generate_magic_number+48 008 MOV R2, #1 _generate_magic_number+4C _generate_magic_number+4C loc_88A520 _generate_magic_number+4C 008 LDR R12, =someKeyData _generate_magic_number+50 008 ADD LR, R12, R2,LSL#3 _generate_magic_number+54 008 LDR R2, [LR,#28] ; "mac_num" _generate_magic_number+58 008 ADD R1, R12, R2,LSL#2 _generate_magic_number+5C 008 LDR R1, [R1,#16] ; seed2 _generate_magic_number+60 008 BL _some_sub_function _generate_magic_number+64 008 MOV R0, R1 _generate_magic_number+68 008 POP {R4,PC} _generate_magic_number+6C _generate_magic_number+6C loc_88A540 ; Then flag = 0 _generate_magic_number+6C 008 MOV R2, #0 _generate_magic_number+70 008 B loc_88A520 _generate_magic_number+70 ; End of function _generate_magic_number _generate_magic_number+70 Код (ASM): _some_sub_function ; int __cdecl some_sub_function(int seed1) _some_sub_function _some_sub_function _some_sub_function 000 CMP R1, #0 _some_sub_function+4 000 BEQ loc_97B674 _some_sub_function+8 000 PUSH {R0,R1,LR} _some_sub_function+C 00C BL _magic_function _some_sub_function+10 00C POP {R1,R2,LR} _some_sub_function+14 000 MUL R3, R2, R0 _some_sub_function+18 000 SUB R1, R1, R3 _some_sub_function+1C 000 BX LR _some_sub_function+1C ; End of function _some_sub_function _some_sub_function+1C Первое что смущает, что нету пролога функции, что переход вначале идет на метку функции выше (_magic_function), где r0 устанавилвается в -1, если r0 == 0, и вызывается функция генерирующая исключение = 8: Код (ASM): _magic_function+1E0 loc_97B674 _magic_function+1E0 000 CMP R0, #0 _magic_function+1E4 000 MOVNE R0, #0xFFFFFFFF _magic_function+1E8 000 B raise_signal_8 _magic_function+1E8 ; End of function _magic_function raise_signal_8 raise_signal_8 raise_signal_8 000 PUSH {R1,LR} raise_signal_8+4 008 MOV R0, #8 ; sig raise_signal_8+8 008 BL raise raise_signal_8+C 008 POP {R1,PC} raise_signal_8+C ; End of function raise_signal_8 У меня закралась мысль, что может _some_sub_function, это типа макроса, проверяющий r1 и генерирующий исключение, но тогда он должен возвращать управление туда, где его вызывали же.. а там пролог начинается.. и еще смущает, что _some_sub_function после POP какие-то вычисления еще происходят, а возвращаемое значение не устанавливается и не проверяется после ее вызова, да и magic_function, там какие то арифмитические операции только, плюс на нее ссылается очень много кода, а там то же пролога нет и какая-то чехорда, как по мне.. Но у меня опыта нет, потому это может только мне кажется!? Код (ASM): _magic_function _magic_function _magic_function 000 SUBS R2, R1, #1 _magic_function+4 000 BXEQ LR _magic_function+8 000 BCC loc_97B674 _magic_function+C 000 CMP R0, R1 _magic_function+10 000 BLS loc_97B658 _magic_function+14 000 TST R1, R2 _magic_function+18 000 BEQ loc_97B664 _magic_function+1C 000 CLZ R3, R0 _magic_function+20 000 CLZ R2, R1 _magic_function+24 000 SUB R3, R2, R3 _magic_function+28 000 RSBS R3, R3, #0x1F _magic_function+2C 000 ADDNE R3, R3, R3,LSL#1 _magic_function+30 000 MOV R2, #0 _magic_function+34 000 ADDNE PC, PC, R3,LSL#2 _magic_function+38 000 NOP _magic_function+3C 000 CMP R0, R1,LSL#31 _magic_function+40 000 ADC R2, R2, R2 _magic_function+44 000 SUBCS R0, R0, R1,LSL#31 _magic_function+48 000 CMP R0, R1,LSL#30 _magic_function+4C 000 ADC R2, R2, R2 _magic_function+50 000 SUBCS R0, R0, R1,LSL#30 _magic_function+54 000 CMP R0, R1,LSL#29 _magic_function+58 000 ADC R2, R2, R2 _magic_function+5C 000 SUBCS R0, R0, R1,LSL#29 _magic_function+60 000 CMP R0, R1,LSL#28 _magic_function+64 000 ADC R2, R2, R2 _magic_function+68 000 SUBCS R0, R0, R1,LSL#28 _magic_function+6C 000 CMP R0, R1,LSL#27 _magic_function+70 000 ADC R2, R2, R2 _magic_function+74 000 SUBCS R0, R0, R1,LSL#27 _magic_function+78 000 CMP R0, R1,LSL#26 _magic_function+7C 000 ADC R2, R2, R2 _magic_function+80 000 SUBCS R0, R0, R1,LSL#26 ............. Буду признателен за помощь)
Ты по-моему чем-то не тем занят. Код выглядит абсолютно валидно. Пролог процедуре нужен для организации локальных переменных или сохранения значений регистров. Если ничего похожего нет, значит ничего такого и не надо. "Какая-то скучная арифметика" гоняет биты через cf-флаг и складывает в отдельном регистре, что это за арифметическая функция такая? Это криптография, и вероятно то, что ты ищешь. Но вместо этого над какими-то исключениями и прологами дрочишься.
Да просто меня смутило, что переход из одной функции в метку другой идет, это нормально? Не охота сидеть над задачей в пустую, если я что-то не правильно понимаю, т.к. опыта нет, буду разбирать дальше, а окажется, что это IDA глюкнула) Вот сомнения и проверяю свои... --- Сообщение объединено, 26 май 2023 --- Подскажите еще вот в этом фрагменте: Код (ASM): _generate_magic_number+4C 008 LDR R12, =someKeyData _generate_magic_number+50 008 ADD LR, R12, R2,LSL#3 _generate_magic_number+54 008 LDR R2, [LR,#0x1C] ; "mac_num" Регистр LR работает как обычный регистр? Он разве не указывает на текущий адрес выполнения? Или он сохраняется там только при переходах B ?
Если внимательно присмотреться, это регистр, содержащий адрес возврата, а не счетчик команд. Здесь он используется чтобы данные адресовать, обычный базонезависимый код, галка в компилере.