首页
社区
课程
招聘
[求助]visual studio 2005编译(x64)的windows API函数--showwindow()只有一个参数?(已修正上传的附件)
2022-6-18 16:03 4591

[求助]visual studio 2005编译(x64)的windows API函数--showwindow()只有一个参数?(已修正上传的附件)

2022-6-18 16:03
4591

模仿网上资料自己编写的MFC小程序,运行后弹出2个广告:
第一个是调用CreateProcessA创建IE进程访问网页,
第二个是调用showwindow显示窗口。
使用vs2005,静态编译为64位程序,showwindow处只出现一个参数,本来应该是2个。
(x64DBG,插件Api Break, user32.dll--showwindow下的断点)

1
2
3
ShowWindow(
    __in HWND hWnd,##是窗口的句柄。
    __in int nCmdShow);#窗口显示的状态

 

这里少了一行代码,mov edx,5 不过,在寄存器窗口中发现,rdx的值已经是5了。
将以上2行反汇编代码NOP之后,也能起到屏蔽去弹窗的效果。

 

使用VS2010编译后在上一行会有mov edx,5代码,将第2个参数值传到寄存器edx中。

1
2
3
mov edx,5                                    | Arg2 = 5
mov rcx,qword ptr ds:[rbx+120]               | Arg1
call popad64_vs2010.7FF61B9AC454             | sub_<popad64_vs2010.7FF61B9AC454>

不知道为什么在VS2005里会缺少mov edx,5这一行,传递第2个参数的代码?
我用的插件是xanalyzer

 

抱歉,第一次传成32位的程序了。
现在已经换成64位的了。

 

链接:
https://pan.baidu.com/s/1waL8Rfn5HUMrU_-LaJy-Xg?pwd=96at


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

最后于 2022-6-19 09:21 被qintel编辑 ,原因:
上传的附件:
收藏
点赞2
打赏
分享
最新回复 (5)
雪    币: 1541
活跃值: (3882)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
_DriverEntry 2022-6-18 16:19
2
0
mfc 程序是么,是的话就加::
雪    币: 21792
活跃值: (3607)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
huangyalei 2022-6-18 16:26
3
0

你确认没有搞错?这是我用你的附件看到的结果,跟你的截图地址代码都不一致

雪    币: 136
活跃值: (161)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qintel 2022-6-18 17:48
4
0
huangyalei 你确认没有搞错?这是我用你的附件看到的结果,跟你的截图地址代码都不一致
抱歉,刚才传成32位的程序了。本来是64位的。
雪    币: 21792
活跃值: (3607)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
huangyalei 2022-6-18 18:25
5
0
qintel 抱歉,刚才传成32位的程序了。本来是64位的。[em_67]
MFC不是直接调用WinAPI,而是重新做了封装,你看看堆栈上一层的调用,是有两个参数的,你截图这里用了上一层传过来的参数
0000000000401976 | BA 05000000              | mov edx,5                               |
000000000040197B | 48:8B8B F0000000         | mov rcx,qword ptr ds:[rbx+F0]           | [rbx+F0]:"(lD"==L"氨D"
0000000000401982 | E8 1D9C0000              | call popad64.40B5A4                     |
雪    币: 136
活跃值: (161)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qintel 2022-6-18 19:31
6
0
huangyalei MFC不是直接调用WinAPI,而是重新做了封装,你看看堆栈上一层的调用,是有两个参数的,你截图这里用了上一层传过来的参数 0000000000401976 | BA 05000000        ...

谢谢指导,我先研究一下


对这方面不专业,我又熟悉了一下x64 dbg和堆栈调用,确实是间接调用的。

结合visual stuio 2010编译后可以直接直接看到两个参数传递的情况,推测如下:

不同visual stuio版本静态编译后链接的MFC底层库,对相关MFC窗口函数的实现不一样,有的是间接调用showwindow,有的是直接调用。


最后于 2022-6-19 09:59 被qintel编辑 ,原因:
游客
登录 | 注册 方可回帖
返回