Доброго времени всем, сложилась вот такая проблема: Собственно, имеется бинарник, который для своего корректного запуска как я понял, должен читать какую-то строку из какого-то файла. Кусок этого кода привожу тут: Код (Text): .text:00401284 sub_401284 proc near ; CODE XREF: sub_40137D+59p .text:00401284 .text:00401284 File= dword ptr -108h .text:00401284 Source= byte ptr -104h .text:00401284 var_E9= byte ptr -0E9h .text:00401284 var_4= dword ptr -4 .text:00401284 .text:00401284 push ebp .text:00401285 mov ebp, esp .text:00401287 sub esp, 108h .text:0040128D push esi .text:0040128E push edi .text:0040128F mov ecx, 6 .text:00401294 mov esi, offset aAbcdefghijklmn .text:00401299 lea edi, [ebp+Source] .text:0040129F rep movsd .text:004012A1 movsw .text:004012A3 movsb .text:004012A4 mov ecx, 39h .text:004012A9 xor eax, eax .text:004012AB lea edi, [ebp+var_E9] .text:004012B1 rep stosd .text:004012B3 stosb .text:004012B4 push 6 ; Count .text:004012B6 lea eax, [ebp+Source] .text:004012BC push eax .text:004012BD push offset Dest .text:004012C2 call ds:strncpy .text:004012C8 add esp, 0Ch .text:004012CB push 6 ; Count .text:004012CD push offset Source .text:004012D2 push offset Dest .text:004012D7 call ds:strncat .text:004012DD add esp, 0Ch .text:004012E0 mov dword_4052BC, 0 .text:004012EA push 6 ; Count .text:004012EC push offset a_abcdefghijklm .text:004012F1 push offset Dest .text:004012F6 call ds:strncat .text:004012FC add esp, 0Ch .text:004012FF push offset a__ ; ".!." .text:00401304 push offset Dest .text:00401309 call strcat .text:0040130E add esp, 8 .text:00401311 mov [ebp+var_4], offset Dest .text:00401318 mov ecx, [ebp+var_4] .text:0040131B add ecx, 1 .text:0040131E mov [ebp+var_4], ecx .text:00401321 mov edx, [ebp+var_4] .text:00401324 push edx .text:00401325 push offset Dest .text:0040132A call strcpy .text:0040132F add esp, 8 .text:00401332 push offset Mode ; "r" .text:00401337 push offset Dest ;в итоге имеем Dest db 'bcdef7890ab' db 63h ;c db 64h ;d db 65h ;e db 66h ;f db 2Eh ;. db 61h ;a db 62h ;b db 63h ;c db 64h ;d db 65h ;e db 2Eh ;. db 21h ;! db 2Eh ;. .text:0040133C call ds:fopen .text:00401342 add esp, 8 .text:00401345 mov [ebp+File], eax .text:0040134B cmp [ebp+File], 0 .text:00401352 jz short loc_40136B .text:00401354 mov eax, [ebp+File] .text:0040135A push eax .text:0040135B call ds:fclose .text:00401361 add esp, 4 .text:00401364 mov eax, 1 .text:00401369 jmp short loc_401377 .text:0040136B ; --------------------------------------------------------------------------- .text:0040136B .text:0040136B loc_40136B: ; CODE XREF: sub_401284+CEj .text:0040136B mov dword_4052BC, 1 .text:00401375 xor eax, eax .text:00401377 .text:00401377 loc_401377: ; CODE XREF: sub_401284+E5j .text:00401377 pop edi .text:00401378 pop esi .text:00401379 mov esp, ebp .text:0040137B pop ebp .text:0040137C retn .text:0040137C sub_401284 endp .text:0040137C .text:0040137D происходит последовательная загрузка и объединение строк, результатом которых будут в итоге последовательности Код (Text): bcdef7890ab cdef.abcde.!. они "складываются" перед вызовом функции открытия файла Код (Text): .text:0040133C call ds:fopen Я не могу разобраться где в этих строках имя файла, его расширение и последовательность считываемая бинарником для корректного запуска. Подскажите, если есть какие-то соображения.
Во-первых, имя файла не обязательно должно укладываться в формат FILENAME.EXT, т.е. 8 символов / точка / 3 символа. Так, например, у меня в Arch Linux, при создании файла-«пустышки», система просто спросила имя, не намекая на то, что к нему обязательно нужно дописывать расширение (да и зачем, если определение типа файла автоматическое, по заголовку). Во-вторых, никакой «последовательности для запуска» просто не существует. Обратите внимание на 00401352: при успешном открытии мы немедля попадаем на вызов fclose. [UPD:] И, да — так оно выглядит в запущенном виде из-под WINE 1.3.31:
>>во-вторых, никакой «последовательности для запуска» просто не существует. Обратите внимание на 00401352: при успешном открытии мы немедля попадаем на вызов fclose. CMP DWORD PTR SS:[EBP-0108h],0 JE @read_fail MOV EAX,DWORD PTR SS:[EBP-0108h] PUSH EAX CALL fclose ADD ESP,04h MOV EAX,01h JMP 000401377h @read_fail: MOV DWORD PTR DS:[04052BCh],01h XOR EAX,EAX все верно, в случае ошибки открытия файла функция возвращает 0, в случае успеха - 1
а потом смотришь где идет обращение к VA 04052BCh для сравнения его с еденицей (маркер того, что считать файл не удалось), это здесь 00401C58 |> \833D BC524000>CMP DWORD PTR DS:[4052BC],0 00401C5F |. 74 08 JE SHORT lab3.00401C69 патчишь JE на JMP и прога удачно запускается
loleg ящетаю, достаточно заменить Код (Text): .text:0040128F mov ecx, 6 на Код (Text): .text:0040128F jmp far loc_401364 или, побайтно, B9 06 00 00 00 → E9 D0 00 00 00. =)
Спасибо loleg, но замену JE на JMP знаю ))) Я в первом посте не указал одно из требований - запустить программу без модификации кода. Вот и бьюсь над этим.
пробовал создавать в директории с бинарником файл (txt и просто без расширения. ), чередуя в его названии и содержимом те самые строки bcdef7890ab cdef.abcde.!. пока не получается. (
Alastor, ну так тогда единственное, что ему для щастья надо — это наличие в папке рядом с ним (ну, или в доступной через $PATH) файла-«пустышки» с именем
DEEP спасибо ))) заработало. я почему-то не додумался использовать строки вместе :О а только чередовал их. теперь понимаю, почему IDA показала в строке по адресу Код (Text): .text:00401337 push offset Dest обе строки, одну как объявление Код (Text): db 'bcdef7890ab' , а вторую посимвольно - отталкиваясь от этого и думал что одна строка название файла, а вторая содержимое. спасибо!