首页
社区
课程
招聘
[求助]这段代码该如何理解?
发表于: 2015-11-19 01:52 6147

[求助]这段代码该如何理解?

2015-11-19 01:52
6147
void __declspec(naked) startmain()
{
        __asm
        {
                call loop0
                _emit 0x48  //H
                _emit 0x65  //e
                _emit 0x6C  //l
                _emit 0x6C  //l
                _emit 0x6F  //o
                _emit 0x20  //
                _emit 0x57  //W
                _emit 0x6F  //o
                _emit 0x72  //r
                _emit 0x6C  //l
                _emit 0x64  //d
                _emit 0x21  //!
                _emit 0x0A  //\n
                _emit 0x00  //\0
loop0:
                call dword ptr ds:[0x400168]  messagebox
                pop ecx
                ret
        }
}

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

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 9941
活跃值: (2143)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
就是用messagebox 显示一个 hello world!
_emit就是压入字符串

其实你编译好后,用OD看不是更好嘛
2015-11-19 03:02
0
雪    币: 27
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
call loop0
str:
_emit 0x48
...
loop0:

=

push str
jump loop0

一般用来push ptr同时避免重定向
2015-11-19 09:41
0
雪    币: 10
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
_emit只是直接存机器码,并没有push啊
2015-11-19 18:40
0
雪    币: 10
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我知道这是调用messagebox的,但是他的具体原理是什么呢?
2015-11-19 18:44
0
雪    币: 27
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
call = push eip + jmp
执行指令时eip存的是下一条指令地址
2015-11-19 23:08
0
雪    币: 10
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
好吧,是我太笨了。。
2015-11-19 23:25
0
雪    币: 775
活跃值: (3420)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
8
void __declspec(naked) startmain()
{
  __asm
  {
    call loop0                       //=push “_emit 0x48的地址”,然后jmp loop0
    _emit 0x48  //H
    _emit 0x65  //e
    _emit 0x6C  //l
    _emit 0x6C  //l
    _emit 0x6F  //o
    _emit 0x20  //
    _emit 0x57  //W
    _emit 0x6F  //o
    _emit 0x72  //r
    _emit 0x6C  //l
    _emit 0x64  //d
    _emit 0x21  //!
    _emit 0x0A  //\n
    _emit 0x00  //\0
loop0:                            //jmp到这里的时候,等于压入了一个字符串指针作为参数
    call dword ptr ds:[0x400168]  messagebox            
//所以这里的messagebox不是系统API的MessageBox,因为参数不一样
    pop ecx                                                                  
//这个pop操作弹出了之前的字符串指针,说明messagebox函数是cdecl类型的而不是stdcall
    ret
  }
}

这个代码看起来只是为了炫一下call = push+jmp罢了,楼上几位都有提到,并不是什么了不得的技能。
这里解释一下,首先代码里用到的messagebox应该是自己写的一个中转函数,函数实现大概是这样:
int cdecl messagebox(LPCSTR lpText)
{
        return MessageBoxA(0 , lpText , 0 , MB_OK);
}
你自己用OD什么的调试随便一个东西,跟一下call指令和ret指令,看堆栈的变化。
2015-11-20 10:07
0
游客
登录 | 注册 方可回帖
返回
//