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

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

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

汇编代码如下:

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


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

[培训]《安卓高级研修班(网课)》月薪三万计划,掌 握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

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

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

LPVOID GetEip(DWORD dwArg)
{
        return (LPVOID)((DWORD)&dwArg - 4) ;
}
雪    币: 245
活跃值: (88)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
爱鸟 1 2011-11-28 22:43
12
0
拍着你的头笑而不语
雪    币: 104
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
小小强强 2011-11-29 01:30
13
0
看得不仔细,抱歉,收回之前所说的话,第1个局部变量入栈之后加8确实是EIP
不过unsigned long eip = (unsigned long )((unsigned long *)&ptr+2) ;是否应该改为unsigned long eip = (unsigned long )*((unsigned long *)&ptr+2) ;
雪    币: 245
活跃值: (88)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
爱鸟 1 2011-11-29 10:58
14
0
其实事情是这样的 所以这种方法十分依赖编译器优化情况

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