首页
课程
问答
CTF
社区
招聘
峰会
发现
排行榜
知识库
工具下载
看雪20年
看雪商城
证书查询
登录
注册
首页
社区
课程
招聘
发现
问答
CTF
排行榜
知识库
工具下载
峰会
看雪商城
证书查询
社区
编程技术
发新帖
1
0
[求助]求教Delphi调试技术
发表于: 2008-9-23 08:48
5056
[求助]求教Delphi调试技术
panti
2008-9-23 08:48
5056
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{调试信息处理过程}
procedure DebugPro;
var
si: _STARTUPINFOA; (进程启动信息}
pi: _PROCESS_INFORMATION; {进程信息}
Flage: DWORD;
DebugD: DEBUG_EVENT; {调试事件}
Rc: Boolean;
CodeCount: DWORD; {运行的指令数}
ThreadHandle: Thandle; {主线程句柄}
Context: TContext;
begin
{建立调试进程}
CodeCount := 0;
ConText.ContextFlags := CONTEXT_CONTROL;
Flage := DEBUG_PROCESS or DEBUG_ONLY_THIS_PROCESS;
GetStartupInfo(si); {初始化si结构,不然无法正常建立进程}
if not CreateProcess(nil, Pchar('C:\windows\NOTEPAD.EXE'), nil, nil,
False, Flage, nil, nil, si, pi) then
begin
MessageBox(Application.Handle, '建立被调试进程失败', '!!!', MB_OK or MB_ICONERROR);
exit;
end;
while WaitForDebugEvent(DebugD, INFINITE) do
begin {根据事件代码进行相应处理}
case DebugD.dwDebugEventCode of
EXIT_PROCESS_DEBUG_EVENT:
begin
MessageBox(Application.Handle, '被调试进程中止', '!!!', MB_OK or MB_ICONERROR);
Break;
end;
CREATE_PROCESS_DEBUG_EVENT:
begin
ThreadHandle := DebugD.CreateProcessInfo.hThread;
MessageBox(Application.Handle, '被调试进程建立', '!!!', MB_OK or MB_ICONERROR);
end;
EXCEPTION_DEBUG_EVENT:
begin
if (DebugD.Exception.ExceptionRecord.ExceptionCode <> EXCEPTION_SINGLE_STEP) and
(DebugD.Exception.ExceptionRecord.ExceptionCode <> EXCEPTION_BREAKPOINT) then
Rc := False {如果被调试程序产生了异常,让它自己处理}
else
begin
GetThreadContext(ThreadHandle, Context);
{将标志寄存器的陷井标志设为TRUE,这样CPU将会处于单步模式}
Context.EFlags := Context.EFlags or $100;//单步执行
Inc(CodeCount);
Form1.Label1.Caption := IntToStr(CodeCount);
SetThreadContext(ThreadHandle, Context);
Rc := True;
end;
end;
end;
if Rc then
ContinueDebugEvent(DebugD.dwProcessId, DebugD.dwThreadId,
DBG_CONTINUE)
else
ContinueDebugEvent(DebugD.dwProcessId, DebugD.dwThreadId,
DBG_EXCEPTION_NOT_HANDLED);
end;
CloseHandle(pi.hProcess);
Closehandle(pi.hThread);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
ThreadHandle, ThreadID: THandle;
begin
ThreadHandle := CreateThread(nil, 0, @DebugPro, nil, 0, ThreadID);
end;
end.
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
收藏
・
1
免费
・
0
支持
分享
分享到微信
分享到QQ
分享到微博
赞赏记录
参与人
雪币
留言
时间
查看更多
赞赏
×
1 雪花
5 雪花
10 雪花
20 雪花
50 雪花
80 雪花
100 雪花
150 雪花
200 雪花
支付方式:
微信支付
赞赏留言:
快捷留言
感谢分享~
精品文章~
原创内容~
精彩转帖~
助人为乐~
感谢分享~
最新回复
(
4
)
panti
雪 币:
1602
活跃值:
(14)
能力值:
( LV2,RANK:10 )
在线值:
发帖
18
回帖
254
粉丝
0
关注
私信
panti
2
楼
程序执行后在DEBUGBREAKPOINT单步执行,可我想在程序入口开始,请教论坛上的人帮我改改代码,先行谢过!
2008-9-23 08:51
0
rock
雪 币:
225
活跃值:
(173)
能力值:
( LV2,RANK:10 )
在线值:
发帖
28
回帖
323
粉丝
1
关注
私信
rock
3
楼
帮顶,就是停在OEP?
2008-9-23 09:25
0
panti
雪 币:
1602
活跃值:
(14)
能力值:
( LV2,RANK:10 )
在线值:
发帖
18
回帖
254
粉丝
0
关注
私信
panti
4
楼
就是啊。修改了EIP的值,但还是不行,求诸位指点一下。
2008-9-25 09:15
0
wr960204
雪 币:
126
活跃值:
(179)
能力值:
( LV3,RANK:20 )
在线值:
发帖
3
回帖
76
粉丝
0
关注
私信
wr960204
5
楼
调试的基本概念.
把入口代码处改成$CC.也就是Int 3.调试中断
就会中断在这里.
执行的时候把原来的代码添回去.把线程上下文的EIP成员减1.退回一个字节.开始执行就行了.
2008-9-25 16:54
0
游客
登录
|
注册
方可回帖
回帖
表情
雪币赚取及消费
高级回复
返回
panti
18
发帖
254
回帖
10
RANK
关注
私信
他的文章
[分享]“中国黑客”病毒染毒文件手工修复
1899
[求助]请问如何在驱动中获取进程的上下文
3521
[求助]XueTr的HOOK哪去了?
6618
[推荐]Delphi全API创建窗体、工具栏、按钮
8246
[求助]能够应对电脑死机的软件
3805
关于我们
联系我们
企业服务
看雪公众号
专注于PC、移动、智能设备安全研究及逆向工程的开发者社区
看原图
赞赏
×
雪币:
+
留言:
快捷留言
为你点赞!
返回
顶部