Сейчас на форуме: hgdagon, asfa, bartolomeo (+6 невидимых) |
![]() |
eXeL@B —› Программирование —› Debug API + Delphi |
Посл.ответ | Сообщение |
|
Создано: 03 августа 2006 14:04 · Личное сообщение · #1 procedure TForm1.Button1Click(Sender: TObject); Var SI: TStartUpInfo; PI: TProcessInformation; DE: TDebugEvent; buf:array[0..511] of Char; begin GetStartupInfo(SI); CreateProcess(PChar(Edit.Text),'',nil,nil,false,DEBUG_PROCESS+DEBUG_ON LY_THIS_PROCESS, nil,'',SI,PI); While true do begin WaitForDebugEvent(DE,INFINITE); if DE.dwDebugEventCode=EXCEpTION_DEBUG_EVENT then ContinueDebugEvent(DE.dwProcessId,DE.dwThreadId,DBG_CONTINUE); end; end; Не хочет грузить процесс! ![]() В чём ошибка? Подскажите статьи по Debug API. ![]() ![]() |
|
Создано: 03 августа 2006 14:13 · Личное сообщение · #2 |
|
Создано: 03 августа 2006 14:16 · Личное сообщение · #3 |
|
Создано: 03 августа 2006 15:11 · Личное сообщение · #4 |
|
Создано: 03 августа 2006 17:05 · Личное сообщение · #5 |
|
Создано: 03 августа 2006 17:34 · Поправил: Ara · Личное сообщение · #6 http://exelab.ru/art/?action=view&id=75 http://exelab.ru/art/?action=view&id=74 Покури статьи Hex'a... ![]() |
|
Создано: 03 августа 2006 17:47 · Личное сообщение · #7 |
|
Создано: 03 августа 2006 18:55 · Личное сообщение · #8 |
|
Создано: 03 августа 2006 19:59 · Поправил: Hellspawn · Личное сообщение · #9 |
|
Создано: 03 августа 2006 20:56 · Личное сообщение · #10 |
|
Создано: 03 августа 2006 21:50 · Личное сообщение · #11 Первый параметр не может быть nil: BOOL CreateProcess( LPCTSTR lpApplicationName, // pointer to name of executable module LPTSTR lpCommandLine, // pointer to command line string LPSECURITY_ATTRIBUTES lpProcessAttributes, // pointer to process security attributes LPSECURITY_ATTRIBUTES lpThreadAttributes, // pointer to thread security attributes BOOL bInheritHandles, // handle inheritance flag DWORD dwCreationFlags, // creation flags LPVOID lpEnvironment, // pointer to new environment block LPCTSTR lpCurrentDirectory, // pointer to current directory name LPSTARTUPINFO lpStartupInfo, // pointer to STARTUPINFO LPPROCESS_INFORMATION lpProcessInformation // pointer to PROCESS_INFORMATION ); ![]() |
|
Создано: 03 августа 2006 22:04 · Личное сообщение · #12 BoOMBoX/TSRh пишет: Первый параметр не может быть nil ...странно,вы как будто не читали MSDN... lpApplicationName -- это указатель на имя модуля,который должен быть исполнен.Если он равен нулю,то используется первый член командной строки,определяемой с помощью lpCommandLine.Если же последний равен нулю,то в качестве командной строки используется строка,указанная в lpApplicationName. А вообще я согласен с вариантом BoOmBoX'a. ----- the Power of Reversing team ![]() |
|
Создано: 03 августа 2006 22:06 · Поправил: NaumLeNet · Личное сообщение · #13 BoOMboX/TSRh первый параметр nil ) абсолютно спокойно. почему не может быть то? [code] zeroMemory(@si, sizeOf(TStartupInfo)); si.cb := sizeOf(TStartupInfo); si.dwFlags := STARTF_USESHOWWINDOW; si.wShowWindow := SW_SHOWNORMAL; CreateProcess(nil, PChar(AFileName), nil, nil, false, 0, nil, PChar(APath), si, pi); [/code] ![]() |
|
Создано: 03 августа 2006 22:14 · Поправил: Hellspawn · Личное сообщение · #14 если второй параметр nil, а в первом путь, иногда получается странная ситуация, отлажеваемая программа не видит файл настройки, а он в свою очередь оказался в диресктории с отладчиком, странно да? ![]() адд // хотя вроде ща попробовал и так и так пашет... ----- [nice coder and reverser] ![]() |
|
Создано: 03 августа 2006 22:22 · Личное сообщение · #15 |
|
Создано: 03 августа 2006 22:25 · Личное сообщение · #16 |
|
Создано: 03 августа 2006 22:35 · Поправил: Hellspawn · Личное сообщение · #17 смотрим как это делает олли
я думаю всем всё ясно ![]() ----- [nice coder and reverser] ![]() |
|
Создано: 03 августа 2006 22:58 · Личное сообщение · #18 |
|
Создано: 03 августа 2006 23:20 · Поправил: Hellspawn · Личное сообщение · #19 |
|
Создано: 04 августа 2006 11:02 · Личное сообщение · #20 Hellspawn,исправил-всё равно не работает!!! ![]() procedure TForm1.Button1Click(Sender: TObject); Var SI: TStartUpInfo; PI: TProcessInformation; DE: TDebugEvent; buf:array[0..511] of Char; begin ZeroMemory(@SI,SizeOf(TStartUpInfo)); GetStartupInfo(SI); CreateProcess(PChar(Edit.Text),'',nil,nil,false,NORMAL_PRIORITY_CLASS or DEBUG_ONLY_THIS_PROCESS or CREATE_SUSPENDED,nil,nil,SI,PI); While true do begin WaitForDebugEvent(DE,INFINITE); if DE.dwDebugEventCode=EXCEpTION_DEBUG_EVENT then ContinueDebugEvent(DE.dwProcessId,DE.dwThreadId,DBG_CONTINUE); end; end; ![]() |
|
Создано: 04 августа 2006 11:30 · Поправил: PE_Kill · Личное сообщение · #21 Первый параметр не должен быть nil. Этот вопрос разбирался в книге "Безопасный код". Там есть примеры, доказывающие неправильность вызова CreateProcess с первым параметром = nil. Хотя работать будет. [MSDN] The first parameter, lpApplicationName, can be NULL, in which case the executable name must be in the white space-delimited string pointed to by lpCommandLine. If the executable or path name has a space in it, there is a risk that a different executable could be run because of the way the function parses spaces. The following example is dangerous because the function will attempt to run "Program.exe", if it exists, instead of "MyApp.exe". CreateProcess(NULL, "C:\\Program Files\\MyApp", ...) If a malicious user were to create an application called "Program.exe" on a system, any program that incorrectly calls CreateProcess using the Program Files directory will run this application instead of the intended application. To avoid this problem, do not pass NULL for lpApplicationName. If you do pass NULL for lpApplicationName, use quotation marks around the executable path in lpCommandLine, as shown in the example below. CreateProcess(NULL, "\"C:\\Program Files\\MyApp.exe\" -L -S", ...) [/MSDN] ----- Yann Tiersen best and do not fuck ![]() |
|
Создано: 04 августа 2006 11:38 · Личное сообщение · #22 sniperZ попробуй так: procedure TForm1.Button1Click(Sender: TObject); Var SI: TStartUpInfo; PI: TProcessInformation; DE: TDebugEvent; buf:array[0..511] of Char; begin ZeroMemory(@SI,SizeOf(TStartUpInfo)); CreateProcess(PChar(Edit.Text),nil,nil,nil,false,NORMAL_PRIORITY_CLASS or DEBUG_ONLY_THIS_PROCESS ,nil,nil,SI,PI); While true do begin WaitForDebugEvent(DE,INFINITE); if DE.dwDebugEventCode=EXCEpTION_DEBUG_EVENT then ContinueDebugEvent(DE.dwProcessId,DE.dwThreadId,DBG_CONTINUE); end; end; ----- Yann Tiersen best and do not fuck ![]() |
|
Создано: 04 августа 2006 11:39 · Личное сообщение · #23 может так: var si:STARTUPINFO; pi: PROCESS_INFORMATION; sa:_SECURITY_ATTRIBUTES; begin sa. nLength := sizeof(sa); sa.bInheritHandle := false; sa.lpSecurityDescriptor := nil; GetStartupInfo(si); CreateProcess('Project1.exe', Nil, @sa, @sa, true, NORMAL_PRIORITY_CLASS or DEBUG_ONLY_THIS_PROCESS or CREATE_SUSPENDED, Nil, Nil, si, pi); if pi.hProcess=0 then RaiseLastOSError; Бла, бла... end; ![]() |
|
Создано: 04 августа 2006 16:35 · Личное сообщение · #24 sniperZ С какой ошибкой хоть падает-то?? Что находится в Edit.Text -- полное имя,часть его?? И из параметра dwCreationFlags не стоит делать масло-масляное -- если указываешь флаг DEBUG_ONLY_THIS_PROCESS,то процесс и так создаётся в замороженном состоянии,т.е. не надо ещё указывать CREATE_SUSPENDED. ----- the Power of Reversing team ![]() |
|
Создано: 04 августа 2006 19:41 · Личное сообщение · #25 DillerInc пишет: С какой ошибкой хоть падает-то?? Просто прога ВИСИТ!? Ничего не помогло из советов. Edit.text-полный путь к EXE. Вот сорцы. ![]() ![]() |
|
Создано: 04 августа 2006 19:53 · Личное сообщение · #26 DillerInc пишет: И из параметра dwCreationFlags не стоит делать масло-масляное -- если указываешь флаг DEBUG_ONLY_THIS_PROCESS,то процесс и так создаётся в замороженном состоянии,т.е. не надо ещё указывать CREATE_SUSPENDED. разве? в хелпе ничё про это не сказано, а всего лишь DEBUG_ONLY_THIS_PROCESS If not set and the calling process is being debugged, the new process becomes another process being debugged by the calling process's debugger. If the calling process is not a process being debugged, no debugging-related actions occur. ----- [nice coder and reverser] ![]() |
|
Создано: 04 августа 2006 21:59 · Личное сообщение · #27 sniperZ Значит так: 1. В качестве параметра dwCreationFlags выставляем только DEBUG_ONLY_THIS_PROCESS.Если кто-то не согласен,то пускай попробует это отладить -- процесс-то создастся,но функция WaitForDebugEvent тут же вывалится от такого масла-масляного. 2. У тебя неправильно обрабатывается отладочный цикл -- ты начинаешь цикл функцией WaitForDebugEvent и должен в любом случае его закончить/продолжить функцией ContinueDebugEvent,чтобы потом его опять начать сначала.У тебя же функция ContinueDebugEvent вызывается,только если произойдёт исключение.А исключение может просто-напросто не произойти.И тогда,по твоему коду,ты начинаешь заново отладочный цикл,не закончив/продолжив его. Должно быть что-то в этом роде:
Да,и когда-то надо всё-таки наверно выйти из цикла(Break) -- иначе зациклишься. ----- the Power of Reversing team ![]() |
|
Создано: 06 августа 2006 13:53 · Личное сообщение · #28 |
![]() |
eXeL@B —› Программирование —› Debug API + Delphi |
Эта тема закрыта. Ответы больше не принимаются. |