首页
社区
课程
招聘
[求助]怎么获取目标线程的ESP值。
发表于: 2018-4-25 09:44 3480

[求助]怎么获取目标线程的ESP值。

2018-4-25 09:44
3480
问题是这样的:我写 一个数组,然后通过NEW分配一个内存地址。在OD中查看发现,数组的起始地址是通过ESP来计算的。现在我想通过另一个自己编的程序来获取这个ESP值,发现获取失败,代码如下:
void CGetEspDlg::OnBnClickedButton1()
{
HWND hWnd = NULL;                                             定义的窗口句柄
DWORD processid = NULL;
HANDLE hProcess = NULL;
DWORD writeRealSize = NULL;
CONTEXT ct;
BOOL b;
DWORD m;
ct.ContextFlags = CONTEXT_ALL;
hWnd =::FindWindow(NULL,_T(Caption));
if (hWnd != NULL)
{
::GetWindowThreadProcessId(hWnd,&processid);  //获取线程的ID
if (processid != NULL)
{
hProcess = ::OpenProcess(PROCESS_ALL_ACCESS,false,processid);//获取线程的句柄
                        m = SuspendThread(hProcess);                                                                       //问题处在这里:暂停线程失败,                                        
                       b = GetThreadContext(hProcess,&ct);                                                              //无法获得寄存器的内容。返回值是-1,寄存器内容全是0

if(b != 0)
{
AfxMessageBox(_T("获取ESP,EBP成功"));
m_Int = ct.Ebp;
UpdateData(FALSE);
}
else
{
AfxMessageBox(_T("获取ESP,EBP失败"));

}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 12848
活跃值: (9147)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
2
寄存器的值随时都在变,你怎么知道你要的是哪一个时刻的寄存器?
2018-4-25 09:46
0
雪    币: 13
活跃值: (91)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
hzqst 寄存器的值随时都在变,你怎么知道你要的是哪一个时刻的寄存器?
那像这种数组的起始地址有其它方法获得么?在我这个数组程序中ESP值是变化的,但在给数组分配地址的时候,esp值传递给EBP了,EBP没变。我就是想取这个两个值来看看变化。
2018-4-25 09:57
0
雪    币: 211
活跃值: (541)
能力值: ( LV9,RANK:172 )
在线值:
发帖
回帖
粉丝
4
SuspendThread    需要线程的句柄。
2018-4-25 10:14
0
雪    币: 8188
活跃值: (2857)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
5
OpenProcess返回的是进程句柄,SuspendThread和GetThreadContext用的是线程句柄。当然失败了。试试EnumThreadWindows。
2018-4-25 11:15
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
6
既然是自己写的数组,在自己程序获取起始地址后用API传递出去就行了,那么麻烦干嘛?
2018-4-25 12:26
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
7
lwtzero 那像这种数组的起始地址有其它方法获得么?在我这个数组程序中ESP值是变化的,但在给数组分配地址的时候,esp值传递给EBP了,EBP没变。我就是想取这个两个值来看看变化。
既然是自己写的数组,在自己程序获取起始地址后用API传递出去就行了,那么麻烦干嘛?
2018-4-25 12:26
0
雪    币: 13
活跃值: (91)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
czcqq 既然是自己写的数组,在自己程序获取起始地址后用API传递出去就行了,那么麻烦干嘛?
我做测试,来看看逆向的的
2018-4-25 13:23
0
雪    币: 13
活跃值: (91)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
vmtest SuspendThread 需要线程的句柄。
谢谢,我试试
2018-4-25 13:23
0
雪    币: 2473
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
如果是多线程程序,你得暂停所有线程  直接用zwsuspendprocess更方便些
2018-4-25 15:12
0
雪    币: 13
活跃值: (91)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
终于找到问题点了。如各位高手所讲,SUSpendThread只是对线程起作用,而::GetWindowThreadProcessId(hWnd,&processid);中参数2是进程ID,返回值才是线程ID(单线程)。
2018-4-25 15:43
0
游客
登录 | 注册 方可回帖
返回
//