能力值:
( LV2,RANK:10 )
|
-
-
126 楼
#pragma comment(linker, "/entry:print")
#pragma comment(lib, "msvcrt.lib")
printf ("Who am I\n");
这样子就妥妥的了
上面那个大神的代码,我这里跑起来退出有点异常(win7sp1)
修改下:
void print()
{
#pragma comment(linker, "/entry:print")
#pragma comment(linker, "/SECTION:.text,REW" )
int mainCRTStartup();
void main();
__asm
{
MOV EAX, OFFSET main
MOV BYTE PTR[EAX], 0xB8 //MOV EAX, 0x
MOV DWORD PTR[EAX+1], OFFSET SHOWSTRING
MOV WORD PTR[EAX+5], 0xE0FF // JMP EAX
mov eax, offset END
mov byte ptr [eax], 0x90
//pop ebp改成nop,调整堆栈,保持平衡
}
mainCRTStartup();
SHOWSTRING:
printf ("i am MentalDease\n");
getchar();
END:;
}
|
能力值:
( LV2,RANK:10 )
|
-
-
127 楼
原来是个坟贴...不过还是蛮有意思的
干脆再问个问题吧。
什么时候会链接crt0啊
mainCRTStartup中堆,全局变量,浮点数等等初始化是个什么意思
要是链接了msvcrt,好像malloc也能用
浮点数,全局变量什么滴,貌似都是妥妥的。这是个什么情况
求解释,谢
|
能力值:
( LV2,RANK:10 )
|
-
-
128 楼
真真假假
|
能力值:
( LV2,RANK:10 )
|
-
-
129 楼
能详细解释一下那四句代码吗,,
|
能力值:
( LV2,RANK:10 )
|
-
-
130 楼
能详细解释一下那四句代码吗,,
|
能力值:
( LV2,RANK:10 )
|
-
-
131 楼
学习了,牛啊
|
能力值:
( LV15,RANK:1878 )
|
-
-
132 楼
楼主使用了getchar在过程中回避堆栈不平衡带来的异常问题,有人断章取义搬到群上说,却不知楼主意图,还抄漏了
以下是完整可编译测试程序,不存在堆栈平衡带来的异常问题,
如果去掉
__asm {
mov edi,edi
}
可能会引起printf被覆盖导致循环入栈而进一步堆栈溢出
如果去掉
__asm {
ret
}
会产生堆栈不平衡带来的异常。
===========================================
//m_test.c by HighBor (hlaxinux@gmail.com) 2014-08-13 01:50
/* platform: win7; compiler infomation
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
*/
//To compile: cl m_test.c
//
void print() {
#pragma comment(linker,"/entry:print")
#pragma comment(linker,"/SECTION:.text,REW")
int mainCRTStartup();
void main();
__asm {
mov eax,offset main
mov BYTE PTR[eax],0xb8
mov DWORD PTR[eax+1],OFFSET SHOWSTRING
mov WORD PTR[eax+5],0xE0FF
}
mainCRTStartup();
SHOWSTRING:
printf("hello world");
__asm {
ret
}
}
void main() {
__asm {
mov edi,edi
}
}
|
|
|