首页
社区
课程
招聘
[求助]C代码不用内嵌汇编能不能取得自身偏移基址?
发表于: 2011-11-27 17:40 10282

[求助]C代码不用内嵌汇编能不能取得自身偏移基址?

2011-11-27 17:40
10282
想了半天想不出来,请各位指点~~~先谢谢啦!

汇编代码如下:

call @f
@@:
pop eax
add eax,0x15


不知道用C应该如何实现 ?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (22)
雪    币: 435
活跃值: (1307)
能力值: ( LV13,RANK:388 )
在线值:
发帖
回帖
粉丝
2
函数名就是地址
2011-11-27 17:47
0
雪    币: 86
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
在前面定义一个空函数即可
2011-11-27 17:53
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
4
不能,还要考虑编译器的优化。
2011-11-27 18:22
0
雪    币: 104
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
#include "Test.hpp"
//
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR CmdLine,int CmdShow)
{
    Label:
    void *a=&&Label;
    return 0;
}
//
试试用标签
2011-11-27 20:11
0
雪    币: 189
活跃值: (56)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
谢谢LS 几位,不过似乎误会了我的意思,我需要代码被加载到任意内存位置都能取得地址,用函数指针取得的是静态的数字
2011-11-27 20:34
0
雪    币: 188
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
如果函数指针都解决不了,你的问题似乎是不可能实现的
2011-11-27 22:51
0
雪    币: 245
活跃值: (93)
能力值: ( 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;

}
2011-11-28 19:50
0
雪    币: 107
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
楼上强人,学习了
2011-11-28 20:08
0
雪    币: 104
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
8楼知道EIP是什么吗?
2011-11-28 20:36
0
雪    币: 859
活跃值: (329)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
11
void MemFunc()
{
        LPVOID pBase ;
        pBase = GetEip(0xabcd) ;
        //........
}

LPVOID GetEip(DWORD dwArg)
{
        return (LPVOID)((DWORD)&dwArg - 4) ;
}
2011-11-28 21:10
0
雪    币: 245
活跃值: (93)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
12
拍着你的头笑而不语
2011-11-28 22:43
0
雪    币: 104
活跃值: (10)
能力值: ( 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) ;
2011-11-29 01:30
0
雪    币: 245
活跃值: (93)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
14
其实事情是这样的 所以这种方法十分依赖编译器优化情况

   
   低地址
|        |
| eip   |  
| ptr   |
| EBP  |
| EIP  |
      高地址
2011-11-29 10:58
0
雪    币: 40
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
好厉害的方法啊~ M一下~
2011-11-29 19:47
0
雪    币: 435
活跃值: (1307)
能力值: ( LV13,RANK:388 )
在线值:
发帖
回帖
粉丝
16
要避免优化引发的问题 函数最好naked
2011-11-30 01:01
0
雪    币: 245
活跃值: (93)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
17
据我了解 naked只是不产生prologue和epilogue区域 要自己手动ret 和函数优化没有一毛钱的关系
2011-11-30 13:12
0
雪    币: 217
活跃值: (122)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
好不错哈哈 补丁补丁
2011-11-30 16:18
0
雪    币: 435
活跃值: (1307)
能力值: ( LV13,RANK:388 )
在线值:
发帖
回帖
粉丝
19
naked之后直接pop eax push eax retn 就完了 还费那么大劲定义个局部变量,既然不敢保证栈里变量排布情况,何必要把简单问题复杂化
2011-11-30 16:47
0
雪    币: 245
活跃值: (93)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
20
那只好请你看看楼主的要求了
2011-11-30 18:08
0
雪    币: 435
活跃值: (1307)
能力值: ( LV13,RANK:388 )
在线值:
发帖
回帖
粉丝
21
不用汇编,也不用费劲定义局部变量什么的,_ReturnAddress()不就行啦
编译器优化不仅仅指fpo省略栈指针,还有对局部变量在栈里排布的优化,你能确定优化成什么样子?
2011-12-1 06:45
0
雪    币: 245
活跃值: (93)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
22
所以naked和这个没有关系 你这不是自相矛盾吗 我不是说了很依赖编译器优化吗
2011-12-1 14:12
0
雪    币: 189
活跃值: (56)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
23
感谢LS的各位同学了,虽然最后还是对COMPILER不放心,决定用内嵌汇编实现,但通过各位学到了很多东西!
2011-12-2 08:36
0
游客
登录 | 注册 方可回帖
返回
//