能力值:
( LV4,RANK:50 )
|
-
-
2 楼
貌似还是必须注入
关键注入的那个函数里应该怎么写呢?
注入后的线程肯定和原来的那个进程是运行的不同的程序。
如何在被注入的进程eip到特定值我的注入函数才工作呢。。。 头大头大。。哪位大牛点拨 一下吧
|
能力值:
( LV4,RANK:50 )
|
-
-
3 楼
貌似我的想法完全不现实。
要每执行一行汇编就要检查一次eip貌似不可能。
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
哈哈 好好学习啊
|
能力值:
( LV5,RANK:70 )
|
-
-
5 楼
DebugApi
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
闻鸡起舞、
到处转转看看,学点东西。
跟着学。
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
修改此处代码,跳到你自己的代码里去,读取你要读的数据然后再调回去就行了
|
能力值:
( LV4,RANK:50 )
|
-
-
8 楼
我是想用一种attach进程的办法。不修改原程序
也许真的只有楼上说的debugapi
|
能力值:
(RANK:260 )
|
-
-
9 楼
用Debug API。
用带有DEBUG_PROCESS的dwCreateFlags参数调用CreatProcess,使创建的子进程被父进程调试。
假设子进程不进行调试器检测。
如果程序本身不使用DebugRegister,那么最简单的办法就是在收到第一个DebugEvent时,用SetThreadContext,修改DebugRegister,设置硬件断点。
如果程序本身会使用DebugRegister(虽然这种情况很少见),那就用软件断点,即先ReadProcessMemory,读取原来的指令的第一个字节,然后WriteProcessMemory,写入一个0xCC。
然后就在DebugLoop中等待断点被触发,也就是dwDebugEventCode为EXCEPTION_DEBUG_EVENT并且u.Exception.ExceptionRecord.ExceptionCode为EXCEPTION_BREAKPOINT,并且ExceptionAddress正是所要下断的地址。
此时,就可以GetThreadContext来获取寄存器的内容,或ReadProcessMemory来获取内存的内容了。
记住,在ContinueDebugEvent时,除断点异常用DBG_CONTINUE外,其它所有的调试事件都用DBG_EXCEPTION_NOT_HANDLED,并且软件断点被触发时,要恢复原始指令字节。
如果断点只要触发一次,以上方法就够了。如果断点需要能够重复触发,那么对于使用0xCC软件断点的情况,在ContinueDebugEvent时,要恢复原始指令字节,并设置CPU的T位,让程序单步走一下,然后下一次调试事件处理时,再写回0xCC,并清除T位,恢复程序正常运行。
|
能力值:
( LV4,RANK:50 )
|
-
-
10 楼
谢谢楼上的详细说明,我好好消化一下。
也就是说第一步,我应该是先写个程序,用DEBUG_PROCESS作为参数来CreatProcess,
将我想要调试的程序启动起来。
|
能力值:
( LV4,RANK:50 )
|
-
-
11 楼
貌似也不用,还是可以用attach方式。
OpenProcess后再DebugActiveProcess
也可以再来WaitForDebugEvent循环吧
|
能力值:
( LV4,RANK:50 )
|
-
-
12 楼
不行不行,头脑有点乱,先整理整理,谢谢呀~
|
能力值:
( LV3,RANK:30 )
|
-
-
13 楼
CString mssg;
if(!::DebugActiveProcess((DWORD)GameID))
{
return;
}
Regs.ContextFlags = CONTEXT_FULL | CONTEXT_DEBUG_REGISTERS;
while(TRUE)
{
::WaitForDebugEvent (&DBEvent, INFINITE);
dwState = DBG_EXCEPTION_NOT_HANDLED;
//进程创建
if(DBEvent.dwDebugEventCode == CREATE_PROCESS_DEBUG_EVENT)
{
}
//进程异常
else if(DBEvent.dwDebugEventCode == EXCEPTION_DEBUG_EVENT)
{
//断点中断80000003
if(DBEvent.u.Exception.ExceptionRecord.ExceptionCode == EXCEPTION_BREAKPOINT)
{
//下面的语句会在下INT 3断点时执行到
if((DWORD)DBEvent.u.Exception.ExceptionRecord.ExceptionAddress == BreakAddr)
{
CleanBreakPoint();
OpenThread();
::GetThreadContext(GameThread, &Regs);
::SetThreadContext(GameThread, &Regs);
dwState = DBG_CONTINUE;
__asm jmp FristGo
}
}
}
FristGo:
::ContinueDebugEvent(DBEvent.dwProcessId, DBEvent.dwThreadId, dwState);
if(IsOK)
{
// DebugActiveProcessStop((DWORD)GameID);
return;
}
}
return;
}
|
能力值:
( LV3,RANK:30 )
|
-
-
14 楼
...................
|
能力值:
( LV4,RANK:50 )
|
-
-
15 楼
谢啦楼上!
我昨天经过一天学习试验成功了。
现在还有几点小困扰
1.DBG_EXCEPTION_NOT_HANDLED 和 DBG_CONTINUE其区别是什么? 什么时候应该用哪个值不是很清晰。
2.Regs.ContextFlags = CONTEXT_FULL | CONTEXT_DEBUG_REGISTERS;
CONTEXT_FULL, CONTEXT_DEBUG_REGISTERS 作用。难道是有CONTEXT_DEBUG_REGISTERS才能看到寄存器值?
还得继续google求索呀
|
能力值:
( LV4,RANK:50 )
|
-
-
16 楼
我用了个比较土的办法多次运行,就是设两个断点,第二断点再把第一个断点重写一遍。
|
能力值:
( LV4,RANK:50 )
|
-
-
17 楼
1.DBG_EXCEPTION_NOT_HANDLED 和 DBG_CONTINUE其区别是什么? 什么时候应该用哪个值不是很清晰。
也很想知道
|
能力值:
( LV4,RANK:50 )
|
-
-
18 楼
找到 答案了
DBG_EXCEPTION_NOT_HANDLED 告诉 windows 这个我不管 你继续向上反映
DBG_CONTINUE 这个我处理了,不用反映了,程序继续执行吧
|
能力值:
( LV4,RANK:50 )
|
-
-
19 楼
这个意思的话,那么就是说我们处理过的分支就一定要设置为DBG_CONTINUE了吧
|
能力值:
(RANK:260 )
|
-
-
20 楼
使用Debug API的ring3调试器,可以理解成在seh机制基础上工作。
正常情况下,线程发生异常时,系统会调用线程注册的seh。而被调试的进程中的线程,可以认为在seh的头部和尾部都有一个“隐藏”的handler,这两个handler不是位于被调试的进程中,而是位于调试器当中。
DBG_EXCEPTION_NOT_HANDLED就是让系统将沿着seh链继续调用线程自己的handler,而 DBG_CONTINUE则是告诉系统,不必调用随后的handler了。因此,DBG_EXCEPTION_NOT_HANDLED的字面意思是说调试器没有处理异常,并不一定表示调试器真的没有处理,它的实质是让被调试线程自己的handler有机会执行。同理DBG_CONTINUE的实质是阻止线程自身的异常处理程序的运行,而不一定表明调试器已经处理过了异常事件。
|
能力值:
( LV2,RANK:10 )
|
-
-
21 楼
如果是多次运行的话,设置过INT3断点的地方一定要恢复原来的值,不然会造成程序执行错误或者跳过某些指令,得到意料之外的结果。
最好是在到了INT3断下来之后,读取你想要的值,然后写回原来的值。再设置EFlags让程序再次产生一个单步中断,再在单步中断里设置你想要断下的地址的INT3中断,再设置eip-1,然后再执行。这样就不会出错了。
|
能力值:
( LV2,RANK:10 )
|
-
-
22 楼
学习了.....还没写过调试程序
|
|
|