首页
社区
课程
招聘
HelloWorld程序的问题
发表于: 2005-2-24 09:28 4526

HelloWorld程序的问题

2005-2-24 09:28
4526
#include <windows.h>
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
        MessageBox (NULL, TEXT ("Hello, Windows 98!"), TEXT ("HelloMsg"), 0) ;
        return 0 ;
}

cl 1.c /link user32.lib
cl 1.cpp /link user32.lib
都可以,有个地方不明白
查了usre32.dll导出表,其中的名字都是没有改编过的
这样的话,c++方式编译成的obj文件链接时怎么能在user32.lib中找得到对应的函数名?

还有一个问题,有关winmain参数的
.text:004010C2                 call    __wincmdln
.text:004010C7                 mov     [ebp+var_64], eax
.text:004010CA                 test    byte ptr [ebp+StartupInfo.dwFlags], 1
.text:004010CE                 jz      short loc_4010D6
.text:004010D0                 movzx   eax, [ebp+StartupInfo.wShowWindow]
.text:004010D4                 jmp     short loc_4010D9
.text:004010D6 ; ----------------------------------------------------------------------------
.text:004010D6
.text:004010D6 loc_4010D6:                             ; CODE XREF: start+B1j
.text:004010D6                 push    0Ah
.text:004010D8                 pop     eax
.text:004010D9
.text:004010D9 loc_4010D9:                             ; CODE XREF: start+B7j
.text:004010D9                 push    eax
.text:004010DA                 push    [ebp+var_64]
.text:004010DD                 push    esi
.text:004010DE                 push    esi             ; lpModuleName
.text:004010DF                 call    ds:GetModuleHandleA
.text:004010E5                 push    eax
.text:004010E6                 call    _WinMain@16     ; WinMain(x,x,x,x) //前面怎么push了五个参数???
.text:004010EB                 mov     [ebp+var_60], eax
.text:004010EE                 push    eax             ; int
.text:004010EF                 call    _exit

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 154
活跃值: (216)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
.text:004010DE                 push    esi             ; lpModuleName
.text:004010DF                 call    ds:GetModuleHandleA
.text:004010E5                 push    eax
算一个
2005-2-24 09:32
0
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
USER32.lib中每个函数都有两种命名,以防止无法连接.
如MessageBoxA的真名为:
_MessageBoxA@16 和 __imp__MessageBoxA@16
前者是直接声明的,后者是用__declspec(dllimport)声明的.
另外,如果是C++编译的话,编译时API函数声明都加extern"C"了.
2005-2-25 00:10
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
to 2:
怎么算?

to 3:
那为什么dll的导出表中没有__imp__MessageBoxA@16,装载user32.dll时怎么找得到?
2005-2-25 05:26
0
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
最初由 jronald 发布

to 3:
那为什么dll的导出表中没有__imp__MessageBoxA@16,装载user32.dll时怎么找得到?


制作动态库时dll导出函数名是可以自定义的,甚至可以没有导出函数名,只用标号.但__imp__MessageBoxA@16是链接函数名,链接后导入函数名就变为MessageBoxA,这种对应关系在user32.lib中已经定义了.
2005-2-25 14:49
0
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
.text:004010DE                 push    esi             ; lpModuleName
.text:004010DF                 call    ds:GetModuleHandleA
.text:004010E5                 push    eax

注意GetModuleHandleA返回时已经退掉了前面push esi进的栈.
2005-2-25 14:51
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
知道了,多谢
2005-2-26 23:55
0
游客
登录 | 注册 方可回帖
返回
//