Суть проблемы: есть прога, привязана ключом хасп. В ключе есть память. Прогу от ключа отучил, осталось самое легкое - эмулировать память ключа. Итак - вместо вызова функции чтения слова с ключа помещаю свой код. Было: Код (Text): :004D9CD3 8D45E4 lea eax, dword ptr [ebp-1C] :004D9CD6 50 push eax :004D9CD7 8D45E8 lea eax, dword ptr [ebp-18] :004D9CDA 50 push eax :004D9CDB 8D45EC lea eax, dword ptr [ebp-14] - адрес буфера :004D9CDE 50 push eax :004D9CDF 8D45F0 lea eax, dword ptr [ebp-10] - номер слова :004D9CE2 50 push eax :004D9CE3 6854140000 push 00001111 :004D9CE8 68534E0000 push 00001111 :004D9CED 6A00 push 00000000 :004D9CEF 6A64 push 00000064 :004D9CF1 6A03 push 00000003 :004D9CF3 E87CECFFFF Call 004D8974 Стало: :004D9CD3 EB0E jmp 004D9CE4 :004D9CD5 9090909090909090909090909090 - строка из 14 символов :004D9CE4 ??? :004D9CF3 9090909090 И вот в оставшиеся 20 байт надо втиснуть код который по номеру слова берет соответствующее слова из массива (004D9CD5) и кладет в буфер. Я уже весь день извращался... дожал код до 21 байта =8-((((( Один байт... Код (Text): 8D45EC lea eax, dword ptr [ebp-14] 8B18 mov ebx, dword ptr [eax] - в ебх адрес буфера 8D45F0 lea eax, dword ptr [ebp-10] номер слова C1E004 shl eax, 02 - умножили на 2 668B800C954A00 mov ax, word ptr [eax+004A950C] 668903 mov word ptr [ebx], ax Народ, может кто видет где еще можно сэкономить байтик??? Строку уменьшить нельзя. сверху и снизу код раздвинуть тоже нельзя - всюду джампы, а перелопачивать все 53метра листинга полное безумие (еще 3 метра и будет рулон туалетной бумаги). Заранее спасибо.
Код (Text): 8D45F0 lea eax,[ebp-10h] 8D04850C954A00 mov eax,[eax*4+4A950Ch] 668945EC mov [ebp-14h],ax 15 байт
skifi Можно было бы найти неиспользуемое пространство (или цепочку таких пространств) и впихнуть код с переходами по jmp.
ИХМО так и надо делать, а не извращаться с уменьшением размера. А неиспользуемое пространство найти легко, т.к. выравниваие кода будет полюбому. Полистай листснг найдеш без труда, в листинге IDA обозначает его как align X, где Х - число неиспользуемых байт для обеспечения выравнивания.