模仿网上资料自己编写的MFC小程序,运行后弹出2个广告:第一个是调用CreateProcessA创建IE进程访问网页,第二个是调用showwindow显示窗口。使用vs2005,静态编译为64位程序,showwindow处只出现一个参数,本来应该是2个。(x64DBG,插件Api Break, user32.dll--showwindow下的断点)
ShowWindow(
__in HWND hWnd,
##是窗口的句柄。
__in
int
nCmdShow);
#窗口显示的状态
这里少了一行代码,mov edx,5 不过,在寄存器窗口中发现,rdx的值已经是5了。将以上2行反汇编代码NOP之后,也能起到屏蔽去弹窗的效果。
使用VS2010编译后在上一行会有mov edx,5代码,将第2个参数值传到寄存器edx中。
mov edx,
5
| Arg2
=
mov rcx,qword ptr ds:[rbx
+
120
] | Arg1
call popad64_vs2010.
7FF61B9AC454
| sub_<popad64_vs2010.
>
不知道为什么在VS2005里会缺少mov edx,5这一行,传递第2个参数的代码?我用的插件是xanalyzer
抱歉,第一次传成32位的程序了。现在已经换成64位的了。
链接:8ebK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6H3j5h3&6Q4x3X3g2T1j5h3W2V1N6g2)9J5k6h3y4G2L8g2)9J5c8Y4y4Q4x3V1j5I4N6$3q4x3z5q4u0X3L8U0g2t1g2f1#2J5g2g2)9#2k6W2)9J5k6p5I4S2d9Y4W2Q4x3X3c8j5k6#2)9K6c8Y4m8%4k6q4)9K6c8o6V1$3j5i4c8Q4x3X3t1`.
[培训]科锐逆向工程师培训第53期2025年7月8日开班!
你确认没有搞错?这是我用你的附件看到的结果,跟你的截图地址代码都不一致
huangyalei 你确认没有搞错?这是我用你的附件看到的结果,跟你的截图地址代码都不一致
qintel 抱歉,刚才传成32位的程序了。本来是64位的。[em_67]
huangyalei MFC不是直接调用WinAPI,而是重新做了封装,你看看堆栈上一层的调用,是有两个参数的,你截图这里用了上一层传过来的参数 0000000000401976 | BA 05000000 ...
谢谢指导,我先研究一下
对这方面不专业,我又熟悉了一下x64 dbg和堆栈调用,确实是间接调用的。
结合visual stuio 2010编译后可以直接直接看到两个参数传递的情况,推测如下:
不同visual stuio版本静态编译后链接的MFC底层库,对相关MFC窗口函数的实现不一样,有的是间接调用showwindow,有的是直接调用。