能力值:
( LV2,RANK:10 )
|
-
-
2 楼
我知道,我以前hook系统某些函数经常出现这样的情况,最后加了一行代码就都解决了
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
撸主,注意调用约定。stdcall和cdecl是不一样的哦。
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
请问是什么代码?
能指点下嘛
是啊,所以我自己处理的堆栈啊
难道目标函数不是cdecl?
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
context,我记得有这么个结构,要hook,你得保存之前的上下文环境吧?
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
请问你的意思是需要先PUSHAD之后再POPAD吗?
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
他们说的都没到正点上,哈哈
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
你得脑补HOOK 。你所用的HOOK是消息HOOK ,
你要实现的东西叫 patch
|
能力值:
( LV3,RANK:30 )
|
-
-
9 楼
芳哥,你还在搞赖子呢
|
能力值:
( LV3,RANK:30 )
|
-
-
10 楼
//原本地址存储于EDI中,发现进入后大部分寄存器数值均已消失
GetCMD用裸函数,不过函数里要自己处理堆栈平衡
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
昨晚试了一下这样,先PUSHAD再POPAD:
void __cdecl GetCMD(DWORD val1, DWORD val2, DWORD val3)
{
DWORD dwebx = 0;
DWORD dwesp = 0;
//原本牌地址存储于EDI中,发现进入后大部分寄存器数值均已消失
_asm
{
mov dwebx, ebx;
mov dwesp, esp;
pushad;
}
//do something....
//扫尾,处理参数传递
DWORD dwback = stc_mapdata->baseaddr + 0x41A10;
_asm
{
popad;
mov edx, val3;
push edx;
mov eax, val2;
push eax;
mov ecx, val1;
push ecx;
mov ebx, dwback;
call ebx;
add esp, 0xc;
}
}
放出去测试后,发现部分原先会出现问题的电脑好使了,可还有部分电脑错误依然如故,挠头……
|
能力值:
( LV3,RANK:20 )
|
-
-
12 楼
你要是想自己pushad,popad来管理context,请用naked函数,这样是没法用局部变量的
你要是要系统帮你管理context,你就不要读寄存器里的值,因为进入函数以后一部分已经发生变化了,想办法在堆栈例找你要的数据
一个通用的解决方案是,先hook一个naked函数,把所有寄存器压栈,然后call一个stdcall的innerhook,innerhook里通过读栈(参数)获取所有寄存器,最后naked里出栈所有寄存器平衡
这样做可以hook任意点,获取到所有的寄存器和hook点堆栈,但是代码量比较大,比较麻烦
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
谢谢指点……
不过老实说
很多地方还不懂
裸函数什么的都去研究了一番,但限定的时间太短,没得出什么结果来
最后我是采用这样的方法解决的:
void __cdecl GetCMD(DWORD val1, DWORD val2, DWORD val3)
{
_asm
{
mov stc_dweax, eax;
mov stc_dwecx, ecx;
mov stc_dwedx, edx;
mov stc_dwedi, edi;
mov stc_dwesi, esi;
mov stc_dwebx, ebx;
mov stc_dwesp, esp;
}
if (stc_dwebx > 0 && stc_dwebx <= 0x14)
{
//do something...
}
stc_dwback = stc_mapdata->baseaddr + 0x41A10;
_asm
{
mov eax, stc_dweax;
mov ebx, stc_dwebx;
mov ecx, stc_dwecx;
mov edx, stc_dwedx;
mov edi, stc_dwedi;
mov esi, stc_dwesi;
mov edx, val3;
push edx;
mov eax, val2;
push eax;
mov ecx, val1;
push ecx;
mov ebx, stc_dwback;
call ebx;
add esp, 0xc;
}
}
其实就是把所有寄存器都先存起来……
这方法非常挫,但确实成功解决了我目前遇到的问题。
|
能力值:
( LV3,RANK:20 )
|
-
-
14 楼
这样是有问题的,你拿到的并不是你想要的寄存器的值,但也不是总是这样,所以你目前的情况只是恰巧没遇上而已
|
|
|