首页
社区
课程
招聘
[求助] VC函数 保护ECX寄存器
发表于: 2007-11-30 13:07 7503

[求助] VC函数 保护ECX寄存器

2007-11-30 13:07
7503
push    ebp
mov     ebp, esp
sub     esp, 0CCh
push    ebx
push    esi
push    edi
lea     edi, [ebp+var_CC]
mov     ecx, 33h
mov     eax, 0CCCCCCCCh
rep stosd
每段VC函数都会被编译器加上以上汇编代码
因为我是HOOK的其它程序的函数,在它(被HOOK的原函数)函数里ECX是个很重要的值
在返回原函数的时候,很显然ECX的值已被改变 ......
我曾试用内嵌汇编保护ECX 但是用户的代码在以上代码执行之后才执行
请问有没有什么办法保护到ECX寄存器???

或是其它的解决办法?
请各位大哥指点了....

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 1746
活跃值: (287)
能力值: (RANK:450 )
在线值:
发帖
回帖
粉丝
2
你上面的代码是debug版本吧,release版本不会有
lea     edi, [ebp+var_CC]
mov     ecx, 33h
mov     eax, 0CCCCCCCCh
rep stosd
这种代码

用裸函数  就不会有这个情况了
2007-11-30 13:26
0
雪    币: 220
活跃值: (21)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
恩,我是用的Debug版本......
我也想过用裸体函数 但是函数还有一些其它操作觉得麻烦..
后来我用了:
                _asm
        {
                push  nSize;
                push  pBuf;
                mov   ecx,  0x01411998; //自己传ECX的值
                call  OldFuncAddr;   //返回原函数
        }
因为这个ECX值传传进函数好像是不变的....
正确返回的到了它程序函数...但是返回后运行不久又出错了
因为它的程序用了CRC32效验  我不知道是不是因为效验的原因还是我程序的原因(正在调试)....
我在试下release版本....如果再出问题可能就是效验的原因了吧...
2007-11-30 15:09
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
linxer应该指用naked修饰的函数
2007-12-1 14:02
0
雪    币: 220
活跃值: (21)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
感谢linxer的指教...
用了release版本就没的哪种情况出现了.......
楼上兄弟说的用:
裸体修饰的函数,怎么讲了
小弟不是很清楚?
2007-12-1 21:14
0
雪    币: 331
活跃值: (56)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
6
Naked
裸体
2007-12-1 21:17
0
雪    币: 226
活跃值: (15)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
7
我要好好学习一下
2007-12-1 21:23
0
雪    币: 220
活跃值: (21)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
naked修饰函数  naked函数 有没区别呢?
naked纯手工实现...naked修饰函数不知道怎么样弄的?
有可能我想多了....
2007-12-1 21:31
0
雪    币: 199
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
用vc内嵌汇编hook吧,ecx,参数等等都能获得。
2007-12-1 22:02
0
雪    币: 196
活跃值: (96)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
10
用naked关键字,比如

void verifyIP(); //函数声明还是老样子

__declspec(naked)  void verifyIP() { //具体函数之前加上naked就ok
    //......
}
2007-12-1 22:19
0
雪    币: 220
活跃值: (21)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
aj3423....一言惊醒梦中人啊 ~~哈哈
我的那个程序已经接解决了...

HOOK其它程序函数方法(我这个程序是HOOK的是一个程序的数据包加密函数)-----小结一下:
一种方案:
1.保持你的HOOK函数与被HOOK的函数参数完全一致
2.不要影响到原程序的寄存器值...用VC的release版本就基本可以解决这个问题
3.返回原程序时如果你的HOOK函数不能在栈中废除参数...可以用OD打开直接修改那句retn x的值(当然要你的程序没的其他错误)
二种方案:
上面大哥些提到的naked函数
具体用什么看你自己的情况咯....
再次谢谢大家的热心帮助.....呵呵
2007-12-2 19:06
0
雪    币: 196
活跃值: (96)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
12
修改函数直接跳转到你自己的naked函数,干完坏事再跳转回去也是一种方法吧。
2007-12-2 23:33
0
游客
登录 | 注册 方可回帖
返回
//