能力值:
( LV13,RANK:388 )
2 楼
函数名就是地址
能力值:
( LV3,RANK:20 )
3 楼
在前面定义一个空函数即可
能力值:
( LV15,RANK:670 )
4 楼
不能,还要考虑编译器的优化。
能力值:
( LV2,RANK:10 )
5 楼
#include "Test.hpp"
//
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR CmdLine,int CmdShow)
{
Label:
void *a=&&Label;
return 0;
}
//
试试用标签
能力值:
( LV6,RANK:90 )
6 楼
谢谢LS 几位,不过似乎误会了我的意思,我需要代码被加载到任意内存位置都能取得地址,用函数指针取得的是静态的数字
能力值:
( LV5,RANK:60 )
7 楼
如果函数指针都解决不了,你的问题似乎是不可能实现的
能力值:
( LV6,RANK:80 )
8 楼
[QUOTE=Osris;1024035]想了半天想不出来,请各位指点~~~先谢谢啦!
汇编代码如下:
call @f
@@:
pop eax
add eax,0x15
不知道用C应该如何实现 ?[/QUOTE]
#include<stdio.h>
unsigned long get_ptr();
int main()
{
unsigned long myeip = get_ptr();
printf("my eip =%p\n",*((unsigned long *)myeip)); //得到的是本句的eip
return 0;
}
unsigned long get_ptr()
{
unsigned long ptr=0xdeadbeef;
unsigned long eip = (unsigned long )((unsigned long *)&ptr+2) ;
return eip;
}
能力值:
( LV4,RANK:50 )
9 楼
楼上强人,学习了
能力值:
( LV2,RANK:10 )
10 楼
8楼知道EIP是什么吗?
能力值:
( LV11,RANK:180 )
11 楼
void MemFunc()
{
LPVOID pBase ;
pBase = GetEip(0xabcd) ;
//........
}
LPVOID GetEip(DWORD dwArg)
{
return (LPVOID)((DWORD)&dwArg - 4) ;
}
能力值:
( LV6,RANK:80 )
12 楼
拍着你的头笑而不语
能力值:
( LV2,RANK:10 )
13 楼
看得不仔细,抱歉,收回之前所说的话,第1个局部变量入栈之后加8确实是EIP
不过unsigned long eip = (unsigned long )((unsigned long *)&ptr+2) ;是否应该改为unsigned long eip = (unsigned long )*((unsigned long *)&ptr+2) ;
能力值:
( LV6,RANK:80 )
14 楼
其实事情是这样的 所以这种方法十分依赖编译器优化情况
低地址
| |
| eip |
| ptr |
| EBP |
| EIP |
高地址
能力值:
( LV2,RANK:10 )
15 楼
好厉害的方法啊~ M一下~
能力值:
( LV13,RANK:388 )
16 楼
要避免优化引发的问题 函数最好naked
能力值:
( LV6,RANK:80 )
17 楼
据我了解 naked只是不产生prologue和epilogue区域 要自己手动ret 和函数优化没有一毛钱的关系
能力值:
( LV2,RANK:10 )
18 楼
好不错哈哈 补丁补丁
能力值:
( LV13,RANK:388 )
19 楼
naked之后直接pop eax push eax retn 就完了 还费那么大劲定义个局部变量,既然不敢保证栈里变量排布情况,何必要把简单问题复杂化
能力值:
( LV6,RANK:80 )
20 楼
那只好请你看看楼主的要求了
能力值:
( LV13,RANK:388 )
21 楼
不用汇编,也不用费劲定义局部变量什么的,_ReturnAddress()不就行啦
编译器优化不仅仅指fpo省略栈指针,还有对局部变量在栈里排布的优化,你能确定优化成什么样子?
能力值:
( LV6,RANK:80 )
22 楼
所以naked和这个没有关系 你这不是自相矛盾吗 我不是说了很依赖编译器优化吗
能力值:
( LV6,RANK:90 )
23 楼
感谢LS的各位同学了,虽然最后还是对COMPILER不放心,决定用内嵌汇编实现,但通过各位学到了很多东西!