首页
社区
课程
招聘
[求助]关于通过内嵌汇编来定位函数入口oep的问题。
发表于: 2014-5-11 10:50 4265

[求助]关于通过内嵌汇编来定位函数入口oep的问题。

2014-5-11 10:50
4265
大家好,小弟现在遇到一个问题,不知如何解决,有劳各位大神帮忙看下哈。
我在一段代码中需要知道一个函数的入口在内存中的位置,本来在debug版本中可以通过汇编来计算偏移值然后hardcode写入,但发现到了release版本,结果那个偏移值又变了,结果总是出错,不知道有没有比较聪明点的写法啊,谁能 帮帮我?
------
void foo()             //<----  我需要知道这里函数入口在内存中的精确地址
{                          
     DWORD funcaddr;
     __asm
    {
                      call hdtoken
        hdtoken:
              pop ebx
              sub ebx, 17                //offset hdtoken, 17是偏移值,会变动?
              mov funcaddr,ebx
              //int 3
              nop
              nop
               
    }
    // ---- do something
}
以上的程序中的"17"偏移位,,在debug版本下和release版本下是不同的。
// -------- debug:

00B6166A 00 00                add         byte ptr [eax],al  
00B6166C 55                   push        ebp  
00B6166D 8B EC                mov         ebp,esp  
00B6166F 81 EC C8 00 00 00    sub         esp,0C8h  
00B61675 53                   push        ebx  
00B61676 56                   push        esi  
00B61677 57                   push        edi  
00B61678 E8 00 00 00 00       call        00B6167D  
00B6167D 5B                   pop         ebx  
00B6167E 83 EB 11             sub         ebx,11h          //此时的偏移位是对的。
00B61681 89 5D FC             mov         dword ptr [ebp-4],ebx  
00B61684 CC                   int         3  
00B61685 90                   nop  

//---------- Release:
00B6166A 00 00                add         byte ptr [eax],al  
00B6166C 55                   push        ebp  
00B6166D 8B EC                mov         ebp,esp  
00B6166F 81 EC 88 00 00 00    sub         esp,88h  
00B61675 53                   push        ebx  
00B61676 E8 00 00 00 00       call        00B6167B  
00B6167B 5B                   pop         ebx  
00B6167C 83 EB 11             sub         ebx,11h  //此时的偏移位就是错的,正好跳前了
00B6167F 89 5D EC             mov         dword ptr [ebp-14h],ebx  
00B61682 CC                   int         3  

---------------------
有请哪些高人帮忙看下哈 ,有啥好的解决方法没,先行谢过了

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

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 2325
活跃值: (4868)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
搜 特征码 然后计算位置吧·!
2014-5-11 10:57
0
雪    币: 357
活跃值: (3403)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
3
sub ebx,offset  foo
2014-5-11 13:17
0
雪    币: 4751
活跃值: (1783)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
mov eax,offset foo      就是直接找到入口偏移了
//重定向
DWORD _RemoteModule()
{
        //MessageBox(0,"","",0);
        DWORD address = 0;
        __asm
        {
                call                __REMOTE_MODULE
                __REMOTE_MODULE:
                pop     ebx
                mov                eax,offset __REMOTE_MODULE
                sub     ebx,eax

                mov        eax,ebx
                mov        address,eax
        }
        return address;
}
2014-5-11 14:09
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
忘记说明了,我那段代码是注入到远程进程的,这样的话 “sub ebx,offset  foo”, 这个对应的语句对应的机器码是"foo"在本地进程中的内存地址吧,在远程中无法用的,能解决么?
2014-5-12 17:26
0
雪    币: 225
活跃值: (309)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
关于“sub ebx,offset  foo”的问题,要是远程注入,必须将foo的内容,写入到远程的进程中去。
2014-5-12 17:41
0
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
void foo()             //<----  我需要知道这里函数入口在内存中的精确地址
{                          
     DWORD funcaddr;
     __asm
    {
                      call hdtoken
        hdtoken:
        pop ebx
        sub ebx, 17                //offset hdtoken, 17是偏移值,会变动?
        mov funcaddr,ebx
        //int 3
        nop
        nop
   
    }
    // ---- do something
}

系统编译以后,会自动在头部生成
push ebp
...
什么的。
所以你那个汇编没有包含push ebp等等一些语句。
要么,你要定义为裸函数,那样就不会有push ebp等语句。
2014-5-12 17:49
0
雪    币: 225
活跃值: (309)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
你搞错了吧,通常是这样:
void foo()
{
    DWORD dwMyPos;
    _asm
    {
        call L2
L2:     pop eax
        mov dwMyPos,eax  //dwMyPos
    }
}
2014-5-12 18:26
0
雪    币: 357
活跃值: (3403)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
9
call L1
L1:
pop ebx
sub ebx,offset L1
lea eax,[ebx+offset foo]

eax 就是注入后的foo地址
2014-5-12 19:22
0
雪    币: 1
活跃值: (1174)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
既然是你自己写的,还是用汇编写,那也可以加点特征代码直接搜索,就象壳的SDK那样
2014-5-12 21:50
0
游客
登录 | 注册 方可回帖
返回
//