能力值:
( LV9,RANK:850 )
|
-
-
2 楼
``Aker哒沙发,我抢到鸟!呀哈哈哈`
这个知识得研究`
|
能力值:
(RANK:170 )
|
-
-
3 楼
需要没有/O1 /O2 优化
|
能力值:
(RANK:1060 )
|
-
-
4 楼
该inline asm就asm吧
|
能力值:
( LV13,RANK:530 )
|
-
-
5 楼
naked岂不更好?
|
能力值:
(RANK:170 )
|
-
-
6 楼
naked不行,没有ret了,所以不可以返回
我这个主要是利用ret返回时的堆栈中保存的返回地址调用自定义函数的.
上午修改了下,原来在开了编译优化选项后,与外部无关的操作及冗余操作会被编译器精简掉,所以原来代码会在优化情况下无法返回主函数。
重新修改了下,谁要是把那句嵌入汇编也去掉就好了;)
|
能力值:
(RANK:1060 )
|
-
-
7 楼
mov eax, [ebp+4]
jmp eax
|
能力值:
(RANK:170 )
|
-
-
8 楼
[QUOTE=forgot;348763]mov eax, [ebp+4]
jmp eax[/QUOTE]
这样应该不行的,如果有优化选项,而且代码较短的话,ebp是上层的
调用进去函数不会有push ebp之类的
另外函数调用之后如何返回呢
顶楼上面的代码主要是利用ret返回地址
|
能力值:
( LV13,RANK:530 )
|
-
-
9 楼
#include "stdafx.h"
#include <stdio.h>
#include "stdlib.h"
int somefunc( void *ptr)
{
printf("in somefunc...\n");
return 0;
}
void _declspec(naked) __cdecl stackbuild(void *ptr)
{
__asm
{
push ebp
mov ebp,esp
sub esp, __LOCAL_SIZE
}
printf("in stackbuild...\n");
__asm
{
mov esp,ebp
pop ebp
push [esp+4]
ret
}
}
int main(int argc, char *argv[])
{
stackbuild(somefunc);
printf("exit main...\n");
system("PAUSE");
return 0;
}
DEBUG Or Release Tested. VC++ 8sp1
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
那这样也可以了,因为naked不可以初始化数据的,所以退出时,esp总是指向同一个位置
文章本意是使用传进去的指针操纵栈区的,但是还是要加了一个push在外面,看来此路不通
#include <stdio.h>
int somefunc( void *ptr)
{
printf("in somefunc...\n");
return 0;
}
void _declspec(naked) __cdecl stackbuild(void *ptr1)
{
printf("in stackbuild...\n");
__asm push [esp+4]
__asm ret
}
int main(int argc, char *argv[])
{
stackbuild(somefunc);
printf("exit main...\n");
return 0;
}
|
能力值:
(RANK:170 )
|
-
-
11 楼
呵呵,标题是c/c++语言实现堆栈修改,通过ret跳转到自定义函数
不过实现确实ugly,
void _declspec(naked) __cdecl stackbuild(void *ptr1)
{
printf("in stackbuild...\n");
__asm push [esp+4]
__asm ret
}
比较好
不过感觉我的这个题目没有 太大的意义
|
|
|