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

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

2018-4-25 09:44
3079
问题是这样的:我写 一个数组,然后通过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失败"));

}

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

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