能力值:
( LV3,RANK:20 )
|
-
-
2 楼
就是用messagebox 显示一个 hello world!
_emit就是压入字符串
其实你编译好后,用OD看不是更好嘛
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
call loop0
str:
_emit 0x48
...
loop0:
=
push str
jump loop0
一般用来push ptr同时避免重定向
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
_emit只是直接存机器码,并没有push啊
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
我知道这是调用messagebox的,但是他的具体原理是什么呢?
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
call = push eip + jmp
执行指令时eip存的是下一条指令地址
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
好吧,是我太笨了。。
|
能力值:
( 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指令,看堆栈的变化。
|
|
|