请问哪位大神能帮我看看我这句转得对不对 老是会出错。
vc:DWORD WINAPI debugProc(LPVOID lpParameter )
{
if(debuger1.caozuo==1)
{
RefreshThreadList(GetCurrentProcessId());
for(int i=0;i<100;i++)
{
if(lst==0)
{
break;
}
if(lst!=GetCurrentThreadId())
{
HANDLE thd=OpenThread(THREAD_ALL_ACCESS,true,lst);
SuspendThread(thd);
CONTEXT con;
con.ContextFlags=CONTEXT_CONTROL|CONTEXT_DEBUG_REGISTERS;
GetThreadContext(thd,&con);
if(debuger1.dr==0)
{
con.Dr0=debuger1.addr;
con.Dr7=con.Dr7|0x3;
}
if(debuger1.dr==1)
{
con.Dr1=debuger1.addr;
con.Dr7=con.Dr7|0xc;
}
if(debuger1.dr==2)
{
con.Dr2=debuger1.addr;
con.Dr7=con.Dr7|0x30;
}
if(debuger1.dr==3)
{
con.Dr3=debuger1.addr;
con.Dr7=con.Dr7|0xc0;
}
con.ContextFlags= CONTEXT_CONTROL|CONTEXT_DEBUG_REGISTERS;
SetThreadContext(thd,&con);
ResumeThread(thd);
}
}
}else
{
RefreshThreadList(GetCurrentProcessId());
for(int i=0;i<100;i++)
{
if(lst==0)
{
break;
}
if(lst!=GetCurrentThreadId())
{
HANDLE thd=OpenThread(THREAD_ALL_ACCESS,true,lst);
SuspendThread(thd);
CONTEXT con;
con.ContextFlags=CONTEXT_CONTROL|CONTEXT_DEBUG_REGISTERS;
GetThreadContext(thd,&con);
if(debuger1.dr==0)
{
con.Dr0=debuger1.addr;
con.Dr7=con.Dr7&~0x3;
}
if(debuger1.dr==1)
{
con.Dr1=debuger1.addr;
con.Dr7=con.Dr7&~0xc;
}
if(debuger1.dr==2)
{
con.Dr2=debuger1.addr;
con.Dr7=con.Dr7&~0x30;
}
if(debuger1.dr==3)
{
con.Dr3=debuger1.addr;
con.Dr7=con.Dr7&~0xc0;
}
con.ContextFlags= CONTEXT_CONTROL|CONTEXT_DEBUG_REGISTERS;
SetThreadContext(thd,&con);
ResumeThread(thd);
}
}
} debuger1.addr=0;
debuger1.caozuo=0;
debuger1.dr=0; return true;
}
delphi:function debugProc(lpParameter:Pointer):bool;stdcall;
var
thd:thandle;
con:TContext;
i:integer;
begin
if debuger1.caozuo=1 then begin
RefreshThreadList(GetCurrentProcessId());
for i:=0 to 99 do
if lst=0 then begin
exit;
end;
if lst<>GetCurrentThreadId() then begin
thd:=OpenThread(STANDARD_RIGHTS_REQUIRED or SYNCHRONIZE or $3ff,true,lst);
SuspendThread(thd);
con.ContextFlags:=CONTEXT_CONTROL or CONTEXT_DEBUG_REGISTERS;
GetThreadContext(thd,con); if debuger1.dr=0 then begin
con.Dr0:=debuger1.addr;
con.Dr7:=con.Dr7 or $3;
end;
if debuger1.dr=1 then begin
con.Dr0:=debuger1.addr;
con.Dr7:=con.Dr7 or $c;
end;
if debuger1.dr=2 then begin
con.Dr0:=debuger1.addr;
con.Dr7:=con.Dr7 or $30;
end;
if debuger1.dr=3 then begin
con.Dr0:=debuger1.addr;
con.Dr7:=con.Dr7 or $c0;
end;
con.ContextFlags:= CONTEXT_CONTROL or CONTEXT_DEBUG_REGISTERS;
SetThreadContext(thd,con);
ResumeThread(thd); end; end
else
begin
RefreshThreadList(GetCurrentProcessId());
for i:=0 to 99 do begin
if lst=0 then begin
exit;
end;
if lst<>GetCurrentThreadId() then begin
thd:=OpenThread(STANDARD_RIGHTS_REQUIRED or SYNCHRONIZE,true,lst);
SuspendThread(thd);
con.ContextFlags:=CONTEXT_CONTROL or CONTEXT_DEBUG_REGISTERS;
GetThreadContext(thd,con); if debuger1.dr=0 then begin
con.Dr0:=debuger1.addr;
con.Dr7 := con.Dr7 and (not $3);
end;
if debuger1.dr=1 then begin
con.Dr0:=debuger1.addr;
con.Dr7 := con.Dr7 and (not $c);
end;
if debuger1.dr=2 then begin
con.Dr0:=debuger1.addr;
con.Dr7 := con.Dr7 and (not $30);
end;
if debuger1.dr=3 then begin
con.Dr0:=debuger1.addr;
con.Dr7 := con.Dr7 and (not $c0);
end;
con.ContextFlags:= CONTEXT_CONTROL or CONTEXT_DEBUG_REGISTERS;
SetThreadContext(thd,con);
ResumeThread(thd); end;
end;
end;
debuger1.addr:=0;
debuger1.caozuo:=0;
debuger1.dr:=0;
result:=true;
end;
vc:DWORD WINAPI debugProc(LPVOID lpParameter )
{
if(debuger1.caozuo==1)
{
RefreshThreadList(GetCurrentProcessId());
for(int i=0;i<100;i++)
{
if(lst==0)
{
break;
}
if(lst!=GetCurrentThreadId())
{
HANDLE thd=OpenThread(THREAD_ALL_ACCESS,true,lst);
SuspendThread(thd);
CONTEXT con;
con.ContextFlags=CONTEXT_CONTROL|CONTEXT_DEBUG_REGISTERS;
GetThreadContext(thd,&con);
if(debuger1.dr==0)
{
con.Dr0=debuger1.addr;
con.Dr7=con.Dr7|0x3;
}
if(debuger1.dr==1)
{
con.Dr1=debuger1.addr;
con.Dr7=con.Dr7|0xc;
}
if(debuger1.dr==2)
{
con.Dr2=debuger1.addr;
con.Dr7=con.Dr7|0x30;
}
if(debuger1.dr==3)
{
con.Dr3=debuger1.addr;
con.Dr7=con.Dr7|0xc0;
}
con.ContextFlags= CONTEXT_CONTROL|CONTEXT_DEBUG_REGISTERS;
SetThreadContext(thd,&con);
ResumeThread(thd);
}
}
}else
{
RefreshThreadList(GetCurrentProcessId());
for(int i=0;i<100;i++)
{
if(lst==0)
{
break;
}
if(lst!=GetCurrentThreadId())
{
HANDLE thd=OpenThread(THREAD_ALL_ACCESS,true,lst);
SuspendThread(thd);
CONTEXT con;
con.ContextFlags=CONTEXT_CONTROL|CONTEXT_DEBUG_REGISTERS;
GetThreadContext(thd,&con);
if(debuger1.dr==0)
{
con.Dr0=debuger1.addr;
con.Dr7=con.Dr7&~0x3;
}
if(debuger1.dr==1)
{
con.Dr1=debuger1.addr;
con.Dr7=con.Dr7&~0xc;
}
if(debuger1.dr==2)
{
con.Dr2=debuger1.addr;
con.Dr7=con.Dr7&~0x30;
}
if(debuger1.dr==3)
{
con.Dr3=debuger1.addr;
con.Dr7=con.Dr7&~0xc0;
}
con.ContextFlags= CONTEXT_CONTROL|CONTEXT_DEBUG_REGISTERS;
SetThreadContext(thd,&con);
ResumeThread(thd);
}
}
} debuger1.addr=0;
debuger1.caozuo=0;
debuger1.dr=0; return true;
}
delphi:function debugProc(lpParameter:Pointer):bool;stdcall;
var
thd:thandle;
con:TContext;
i:integer;
begin
if debuger1.caozuo=1 then begin
RefreshThreadList(GetCurrentProcessId());
for i:=0 to 99 do
if lst=0 then begin
exit;
end;
if lst<>GetCurrentThreadId() then begin
thd:=OpenThread(STANDARD_RIGHTS_REQUIRED or SYNCHRONIZE or $3ff,true,lst);
SuspendThread(thd);
con.ContextFlags:=CONTEXT_CONTROL or CONTEXT_DEBUG_REGISTERS;
GetThreadContext(thd,con); if debuger1.dr=0 then begin
con.Dr0:=debuger1.addr;
con.Dr7:=con.Dr7 or $3;
end;
if debuger1.dr=1 then begin
con.Dr0:=debuger1.addr;
con.Dr7:=con.Dr7 or $c;
end;
if debuger1.dr=2 then begin
con.Dr0:=debuger1.addr;
con.Dr7:=con.Dr7 or $30;
end;
if debuger1.dr=3 then begin
con.Dr0:=debuger1.addr;
con.Dr7:=con.Dr7 or $c0;
end;
con.ContextFlags:= CONTEXT_CONTROL or CONTEXT_DEBUG_REGISTERS;
SetThreadContext(thd,con);
ResumeThread(thd); end; end
else
begin
RefreshThreadList(GetCurrentProcessId());
for i:=0 to 99 do begin
if lst=0 then begin
exit;
end;
if lst<>GetCurrentThreadId() then begin
thd:=OpenThread(STANDARD_RIGHTS_REQUIRED or SYNCHRONIZE,true,lst);
SuspendThread(thd);
con.ContextFlags:=CONTEXT_CONTROL or CONTEXT_DEBUG_REGISTERS;
GetThreadContext(thd,con); if debuger1.dr=0 then begin
con.Dr0:=debuger1.addr;
con.Dr7 := con.Dr7 and (not $3);
end;
if debuger1.dr=1 then begin
con.Dr0:=debuger1.addr;
con.Dr7 := con.Dr7 and (not $c);
end;
if debuger1.dr=2 then begin
con.Dr0:=debuger1.addr;
con.Dr7 := con.Dr7 and (not $30);
end;
if debuger1.dr=3 then begin
con.Dr0:=debuger1.addr;
con.Dr7 := con.Dr7 and (not $c0);
end;
con.ContextFlags:= CONTEXT_CONTROL or CONTEXT_DEBUG_REGISTERS;
SetThreadContext(thd,con);
ResumeThread(thd); end;
end;
end;
debuger1.addr:=0;
debuger1.caozuo:=0;
debuger1.dr:=0;
result:=true;
end;
而其他dr1-dr3我都不设置 但是拦截到之后却发现dr0:=$123456. dr1-dr3都会有数据
而我用vc试过却只拦截到dr0=123456其他dr都是0
vc和dephi的指针有小小区别
具体的我忘了