首页
社区
课程
招聘
[求助]监视eip并记录特定eip时寄存器或进程内存的内容
发表于: 2009-2-28 15:57 8314

[求助]监视eip并记录特定eip时寄存器或进程内存的内容

2009-2-28 15:57
8314

最近开始学debug,能在ollydbg里找到关键call了。
现在想进一步学习深入点。
例如已经知道在eip为0x087612A0时候会call某关键函数

现在想编程实现不用od获得eip为0x087612A0时某特定内存地址的内容信息应该怎么做
请各位大牛给一点思路。

根据我的初步学习我猜测过程应该需要通过ReadProcessMemory

我基本想法是 先
FindWindow->GetWindowThreadProcessId->OpenProcess

接下来应就可以用到 ReadProcessMemory 了

但我对如何知道进程现在eip还一头雾水。。

另外,由于是初学者,我觉得我这个目标应该不用CreateRemoteThread。
可能不对,见笑了。

有哪位能提示点较为详细的思路么。。

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (21)
雪    币: 235
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
貌似还是必须注入

关键注入的那个函数里应该怎么写呢?

注入后的线程肯定和原来的那个进程是运行的不同的程序。

如何在被注入的进程eip到特定值我的注入函数才工作呢。。。

头大头大。。哪位大牛点拨 一下吧
2009-2-28 16:15
0
雪    币: 235
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
貌似我的想法完全不现实。

要每执行一行汇编就要检查一次eip貌似不可能。
2009-2-28 16:26
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
哈哈  好好学习啊
2009-2-28 17:36
0
雪    币: 62
活跃值: (72)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
5
DebugApi
2009-3-1 02:40
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
闻鸡起舞、
  
  到处转转看看,学点东西。

  跟着学。
2009-3-1 05:12
0
雪    币: 231
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qdk
7
修改此处代码,跳到你自己的代码里去,读取你要读的数据然后再调回去就行了
2009-3-1 06:47
0
雪    币: 235
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
我是想用一种attach进程的办法。不修改原程序

也许真的只有楼上说的debugapi
2009-3-1 11:54
0
雪    币: 2110
活跃值: (21)
能力值: (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位,恢复程序正常运行。
2009-3-1 18:26
0
雪    币: 235
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
谢谢楼上的详细说明,我好好消化一下。

也就是说第一步,我应该是先写个程序,用DEBUG_PROCESS作为参数来CreatProcess,
将我想要调试的程序启动起来。
2009-3-2 09:49
0
雪    币: 235
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
貌似也不用,还是可以用attach方式。
OpenProcess后再DebugActiveProcess

也可以再来WaitForDebugEvent循环吧
2009-3-2 09:59
0
雪    币: 235
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
不行不行,头脑有点乱,先整理整理,谢谢呀~
2009-3-2 10:11
0
雪    币: 246
活跃值: (81)
能力值: ( 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;
}
2009-3-3 00:05
0
雪    币: 246
活跃值: (81)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
14
...................
2009-3-3 00:08
0
雪    币: 235
活跃值: (10)
能力值: ( 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求索呀
2009-3-3 10:55
0
雪    币: 235
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
我用了个比较土的办法多次运行,就是设两个断点,第二断点再把第一个断点重写一遍。
2009-3-3 10:57
0
雪    币: 156
活跃值: (48)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
17
1.DBG_EXCEPTION_NOT_HANDLED 和 DBG_CONTINUE其区别是什么? 什么时候应该用哪个值不是很清晰。

也很想知道
2009-3-9 14:07
0
雪    币: 156
活跃值: (48)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
18
找到 答案了
DBG_EXCEPTION_NOT_HANDLED 告诉 windows 这个我不管 你继续向上反映
DBG_CONTINUE                                                  这个我处理了,不用反映了,程序继续执行吧
2009-3-9 22:24
0
雪    币: 235
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
19
这个意思的话,那么就是说我们处理过的分支就一定要设置为DBG_CONTINUE了吧
2009-3-10 12:28
0
雪    币: 2110
活跃值: (21)
能力值: (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的实质是阻止线程自身的异常处理程序的运行,而不一定表明调试器已经处理过了异常事件。
2009-3-10 19:17
0
雪    币: 357
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
如果是多次运行的话,设置过INT3断点的地方一定要恢复原来的值,不然会造成程序执行错误或者跳过某些指令,得到意料之外的结果。

最好是在到了INT3断下来之后,读取你想要的值,然后写回原来的值。再设置EFlags让程序再次产生一个单步中断,再在单步中断里设置你想要断下的地址的INT3中断,再设置eip-1,然后再执行。这样就不会出错了。
2009-3-15 00:14
0
雪    币: 519
活跃值: (4774)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
学习了.....还没写过调试程序
2009-6-23 19:12
0
游客
登录 | 注册 方可回帖
返回
//