Не могли бы объяснить почему так получается? Есть код такого вида (см. ниже). При работе под Олли и под системой возвращаемое количество символов в eax функцией lstrlen различно, при подсчете символов с помощью инструкции lodsb (см. приаттаченный архив со скринами экрана и исходниками) ситуация повторяется. Так же в архиве небольшой пример, в котором копируемый файл определен заранее и функция lstrlen уже возвращает правильное количество символов под системой и под отладчиком. .386 .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc include \masm32\include\masm32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\masm32.lib .data real_path db 256 dup (?) new_file db "C:\lumpy.exe" .code start: invoke GetCommandLine invoke lstrcpy,addr real_path,eax invoke lstrlen,eax ;mov byte ptr [real_path+eax-1], 0 ;отладчик mov byte ptr [real_path+eax-2], 0 ; система ;int 03 invoke CopyFile,addr real_path+1,addr new_file,0 invoke MessageBox,0, addr real_path+1, addr new_file, 0 ret end start
"...\lodsb.asm": yuran666666, вы переписываете часть скопированной строки: Код (Text): ;... xchg eax,esi ; [esi] = "...\lodsb.exe",0,??? @1: lodsb test al,al jnz @1 ; if flagz.zf=1 then [esi] = ??? mov byte ptr[esi-3],00h ; [esi-3] = "x","e",0,??? mov byte ptr[esi-2],00h ; [esi-3] = "e",0,???
ну там в коде одна из инструкций закомментирована вообще то, и после нее идет еще комментарий под системой или под отладчиком будет корректно работать
Для простоты вызова OllyDbg при неустранимых ошибках или в целях отладки: \меню Options\подменю Options...\вкладка Just-in-time\нажмите кнопку Set OllyDbg. Для генерации исключения используйте hlt вместо int: писать короче и
Я забыл: кавычки могут быть, а могут и нет, что зависит от среды. В некоментированном коде вы точно перепишете последнюю букву.
вы попробуйте потрассировать коды из архивов.. или запустить под системой с int 03 (он там закомментирован) и аттачем к процессу - кавычки есть во всех случаях, а вот количество посчитанных символов под отладчиком (если трассировать программу с начала) и системой (про аттаче к процессу) будет различаться
При выполнении под олли можно заметить, что в конце командной строки приписан один пробел. lstrlen возвращает длину правильно.
KeSqueer, мне о-очень трудно говорить по-русски, но я это делаю исключительно с уважения к вам, пренебрегая английским z)
Бактрейс: Код (Text): SHELL32.ReplaceParameters SHELL32.SetCommand@CShellExecute@@IAEHXZ SHELL32.DoExecCommand@CShellExecute@@IAEXXZ SHELL32.TryInvokeApplication@CShellExecute@@IAE SHELL32.ExecuteNormal@CShellExecute@@QAEXPAU_SHE SHELL32.ShellExecuteNormal@4 SHELL32.ShellExecuteExW ReplaceParameters() ищет строку "%1" %* и форматирует имя, переданное в ShellExecute(), собственно она пробел и дописывает, а затем имя передаётся в CreateProcess(), которая запустит процесс и сформирует среду окружения(в частности коммандную строку). Олли не использует функционал оболочки, а сама запускает процесс средствами CreateProcess(), поэтому и пробелов нет, в отличие от проводника.
Clerk сэр, спасибо вам) вы поняли вопрос и дали валидный ответ.. я бы наверное голову поломал, хотя пробел уже тоже успел заметить)