Сейчас на форуме: hgdagon, asfa, bartolomeo (+6 невидимых)

 eXeL@B —› Программирование —› Debug API + Delphi
Посл.ответ Сообщение

Ранг: 260.2 (наставник)
Активность: 0.190
Статус: Участник

Создано: 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.



Ранг: 384.1 (мудрец)
Активность: 0.250
Статус: Участник
www.int3.net

Создано: 03 августа 2006 14:13
· Личное сообщение · #2

наступал на такие грабли, смотри внимательно на параметры
if not CreateProcessA(nil,PChar(GetStartDir+'xxxx.exe'),nil,nil,False,
NORMAL_PRIORITY_CLASS,nil,nil,strucStInfo,strucPrInfo) then begin

-----
Подписи - ЗЛО! Нужно убирать!




Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

Создано: 03 августа 2006 14:16
· Личное сообщение · #3

sniperZ пишет:
Подскажите статьи по Debug API.


www.progers.ru/articles/425.htm
www.podgoretsky.com/ftp/Docs/Asm/IczTutor/ (на асме)




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 03 августа 2006 15:11
· Личное сообщение · #4

ZeroMemory(@SI,SizeOf(TStartUpInfo)) иначе на некоторых ОС может не работать. На ХП например.

-----
Yann Tiersen best and do not fuck




Ранг: 260.2 (наставник)
Активность: 0.190
Статус: Участник

Создано: 03 августа 2006 17:05
· Личное сообщение · #5

nice, PE_Kill, не работает!
Жду помощи!




Ранг: 1288.1 (!!!!), 273thx
Активность: 1.290
Статус: Участник

Создано: 03 августа 2006 17:34 · Поправил: Ara
· Личное сообщение · #6

http://exelab.ru/art/?action=view&id=75
http://exelab.ru/art/?action=view&id=74
Покури статьи Hex'a...



Ранг: 116.1 (ветеран), 5thx
Активность: 0.060
Статус: Участник

Создано: 03 августа 2006 17:47
· Личное сообщение · #7

Замени '' на nil
Вот так попробуй
CreateProcess(PChar(Edit.Text),nil,nil,nil,false,DEBUG_PROCESS+DEBUG_O NLY_THIS_PROCESS,
nil,nil,SI,PI);

Удачи!



Ранг: 174.2 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 03 августа 2006 18:55
· Личное сообщение · #8

BoOMBoX/TSRh пишет:
Замени '' на nil

Именно так. Второй параметр должен быть равен первому или nil. Остальное вроде и так правильно.




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 03 августа 2006 19:59 · Поправил: Hellspawn
· Личное сообщение · #9

у мну так

if CreateProcess(nil,PChar(exe_name),nil,nil,false,NORMAL_PRIORITY_CLASS or
DEBUG_ONLY_THIS_PROCESS or CREATE_SUSPENDED,nil,nil,sti,lpPi)=FALSE then
begin
log('[Failed to create process]');
Exit;
end;

...

resumethread(lpPi.hThread);
log('-> Run...');


-----
[nice coder and reverser]




Ранг: 384.1 (мудрец)
Активность: 0.250
Статус: Участник
www.int3.net

Создано: 03 августа 2006 20:56
· Личное сообщение · #10

deNULL
Не брат, первый параметр, Hellspawn правильно написал

-----
Подписи - ЗЛО! Нужно убирать!




Ранг: 116.1 (ветеран), 5thx
Активность: 0.060
Статус: Участник

Создано: 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
);




Ранг: 283.6 (наставник), 56thx
Активность: 0.130
Статус: Участник
Author of GeTaOEP

Создано: 03 августа 2006 22:04
· Личное сообщение · #12

BoOMBoX/TSRh пишет:
Первый параметр не может быть nil

...странно,вы как будто не читали MSDN...
lpApplicationName -- это указатель на имя модуля,который должен быть исполнен.Если он равен нулю,то используется первый член командной строки,определяемой с помощью lpCommandLine.Если же последний равен нулю,то в качестве командной строки используется строка,указанная в lpApplicationName.
А вообще я согласен с вариантом BoOmBoX'a.

-----
the Power of Reversing team





Ранг: 103.3 (ветеран), 8thx
Активность: 0.060
Статус: Участник

Создано: 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]




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 03 августа 2006 22:14 · Поправил: Hellspawn
· Личное сообщение · #14

если второй параметр nil, а в первом путь, иногда получается странная ситуация, отлажеваемая программа не видит файл настройки, а он в свою очередь оказался в диресктории с отладчиком, странно да? так что выходит первый нил, а второй путь (подсмотривел в нескольких примерах)

адд // хотя вроде ща попробовал и так и так пашет...

-----
[nice coder and reverser]




Ранг: 116.1 (ветеран), 5thx
Активность: 0.060
Статус: Участник

Создано: 03 августа 2006 22:22
· Личное сообщение · #15

Полностью cогласен с DillerInc.
Первый параметр может быть nil, просто у меня предпочтение, чтобы все параметры функции были на своем месте.
И человеку, у которого есть трудности с работой функции, проще разобраться.



Ранг: 116.1 (ветеран), 5thx
Активность: 0.060
Статус: Участник

Создано: 03 августа 2006 22:25
· Личное сообщение · #16

Я в качестве параметра lpApplicationName всегда указываю полный путь к запускаемому файлу, и никогда с работой функции не было проблем.




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 03 августа 2006 22:35 · Поправил: Hellspawn
· Личное сообщение · #17

смотрим как это делает олли

0078C140 00000000 |ModuleFileName = NULL
0078C144 0078C5F0 |CommandLine = """C:\WINDOWS\Рабо.ий стол\ПАКЕРЫ\Не пакованные\TestDebugger.EXE"""
0078C148 00000000 |pProcessSecurity = NULL
0078C14C 00000000 |pThreadSecurity = NULL
0078C150 00000000 |InheritHandles = FALSE
0078C154 04000022 |CreationFlags = DEBUG_ONLY_THIS_PROCESS|NORMAL_PRIORITY_CLASS|CREATE_DEFAULT_ERROR_MOD E
0078C158 00000000 |pEnvironment = NULL
0078C15C 0078DC7C |CurrentDir = "C:\WINDOWS\Рабо.ий стол\ПАКЕРЫ\Не пакованные\"
0078C160 0078C3A4 |pStartupInfo = 0078C3A4
0078C164 0078C2B4 \pProcessInfo = 0078C2B4

я думаю всем всё ясно

-----
[nice coder and reverser]




Ранг: 116.1 (ветеран), 5thx
Активность: 0.060
Статус: Участник

Создано: 03 августа 2006 22:58
· Личное сообщение · #18

Oleh Yuschuk respect!
А вообще кому, что удобнее.




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 03 августа 2006 23:20 · Поправил: Hellspawn
· Личное сообщение · #19

кстати кто нить может объяснить про третий флаг "CREATE_DEFAULT_ERROR_MODE" прочитал хелп,
да что то я мало понял, для чего он нужен то?

Новый процесс не наследует error mode вызывающего процесса

как это отразится при дальнейшей отладке?

-----
[nice coder and reverser]




Ранг: 260.2 (наставник)
Активность: 0.190
Статус: Участник

Создано: 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;




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 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





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 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




Ранг: 72.3 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 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;




Ранг: 283.6 (наставник), 56thx
Активность: 0.130
Статус: Участник
Author of GeTaOEP

Создано: 04 августа 2006 16:35
· Личное сообщение · #24

sniperZ
С какой ошибкой хоть падает-то??
Что находится в Edit.Text -- полное имя,часть его??
И из параметра dwCreationFlags не стоит делать масло-масляное -- если указываешь флаг DEBUG_ONLY_THIS_PROCESS,то процесс и так создаётся в замороженном состоянии,т.е. не надо ещё указывать CREATE_SUSPENDED.

-----
the Power of Reversing team




Ранг: 260.2 (наставник)
Активность: 0.190
Статус: Участник

Создано: 04 августа 2006 19:41
· Личное сообщение · #25

DillerInc пишет:
С какой ошибкой хоть падает-то??

Просто прога ВИСИТ!?
Ничего не помогло из советов.

Edit.text-полный путь к EXE.

Вот сорцы.


1eb8_04.08.2006_CRACKLAB.rU.tgz - Project.rar




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 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]





Ранг: 283.6 (наставник), 56thx
Активность: 0.130
Статус: Участник
Author of GeTaOEP

Создано: 04 августа 2006 21:59
· Личное сообщение · #27

sniperZ
Значит так:

1. В качестве параметра dwCreationFlags выставляем только DEBUG_ONLY_THIS_PROCESS.Если кто-то не согласен,то пускай попробует это отладить -- процесс-то создастся,но функция WaitForDebugEvent тут же вывалится от такого масла-масляного.

2. У тебя неправильно обрабатывается отладочный цикл -- ты начинаешь цикл функцией WaitForDebugEvent и должен в любом случае его закончить/продолжить функцией ContinueDebugEvent,чтобы потом его опять начать сначала.У тебя же функция ContinueDebugEvent вызывается,только если произойдёт исключение.А исключение может просто-напросто не произойти.И тогда,по твоему коду,ты начинаешь заново отладочный цикл,не закончив/продолжив его.

Должно быть что-то в этом роде:

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,nil,false,DEBUG_ONLY_THIS_PROCE SS,
nil,nil,SI,PI);
While true do
begin
WaitForDebugEvent(DE,INFINITE); // Начинаем отладочный цикл
if DE.dwDebugEventCode = EXCEPTION_DEBUG_EVENT then
begin
ContinueDebugEvent(DE.dwProcessId,DE.dwThreadId,DBG_CONTINUE); // если выполняется условие
end;
ContinueDebugEvent(DE.dwProcessId,DE.dwThreadId,DBG_CONTINUE); // а это в любом случае
end;
end;


Да,и когда-то надо всё-таки наверно выйти из цикла(Break) -- иначе зациклишься.

-----
the Power of Reversing team





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 06 августа 2006 13:53
· Личное сообщение · #28

Так ясен перец что висит. Надо же если с CREATE_SUSPEND то ResumeThread делать. sniperZ и вообще непонятно тебе дают один код а ты раз за разом постишь абсолютно другой. Даже у меня в примере нет SUSPEND_THREAD.

-----
Yann Tiersen best and do not fuck



 eXeL@B —› Программирование —› Debug API + Delphi
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати