首页 > Windows SDK, 逆向调试 > SDK控件子类化和栈溢出

SDK控件子类化和栈溢出

不知道起个什么题目好,所以就叫做“SDK控件子类化和栈溢出”吧!为了节约时间你可以只看本文最后一段话!颓废了一段时间之后,终于有点激情写代码了,写一个小工具,为了给Static控件做成超链接的形式,于是用了控件子类化,不幸的是程序Crash了。

为什么会Crash呢?于是赶紧在Visual Studio下Debug模式调试(本来也应该这样,不过前面提到VS2008链接器有个Bug【见Microsoft Increment Linker已停止工作】,下个有个朋友评论说打SP1补丁,考虑到C盘空间严重不够,所以没打。所以我只好先生成Release版本再测试),可以调试(BUG暂时没了?),提示有未处理的异常,某地方访问冲突了,但是不能确定问题出在哪里,看我要不要看反汇编代码……看一下,在ntdll里面,再看一下调用栈,提示没有ntdll的符号表。

那么还是用WinDbg吧,我是知道VS下载符号表是巨卡无比的啊!用WinDbg打开模板程序,输入g继续运行,等Crash的时候执行!analyze -v分析,一段时间过后发现是栈溢出了,错误的地方如下:

FAULTING_SOURCE_CODE:  
   164: 	static TCHAR szEmail[] = {L"stackexploit[#]gmail.com"};
   165: 	BOOL bUrl = TRUE;
   166: 
   167: 	GetWindowText(hwndDlg, szBuffer, 
>  168: 		sizeof(szBuffer)/sizeof(szBuffer[0]));
   169: 	bUrl = lstrcmp(szBuffer, szEmail);
   170: 	if (!bUrl)
   171: 	{
   172: 		lstrcpy(szBuffer, L"mailto:");
   173: 		lstrcat(szBuffer, szEmail);

上面的这段代码就位于新的Static窗口过程中。再看一下调用栈,可以看出是无穷递归的情况发生了:

STACK_TEXT:  
0006304c 773c7631 00000000 001d103c 00740340 USER32!_SEH_prolog4+0x1a
0006308c 773bc2b7 00657c68 00658078 00000100 USER32!SendMessageWorker+0x4d0
000630d0 001d1f6b 00740340 001d81c0 00000100 USER32!GetWindowTextW+0x47
000631c0 773c86ef 00740340 0000000d 00000100 FakeMac!StaticProc+0x3b [g:\w7documents\[...]\fakemac\commondef.cpp @ 168]
000631ec 773c8876 001d103c 00740340 0000000d USER32!InternalCallWinProc+0x23
00063264 773c7631 00000000 001d103c 00740340 USER32!UserCallWinProcCheckWow+0x14b
000632a4 773bc2b7 00657c68 00658078 00000100 USER32!SendMessageWorker+0x4d0
000632e8 001d1f6b 00740340 001d81c0 00000100 USER32!GetWindowTextW+0x47
000633d8 773c86ef 00740340 0000000d 00000100 FakeMac!StaticProc+0x3b [g:\w7documents\[...]\fakemac\commondef.cpp @ 168]
00063404 773c8876 001d103c 00740340 0000000d USER32!InternalCallWinProc+0x23
0006347c 773c7631 00000000 001d103c 00740340 USER32!UserCallWinProcCheckWow+0x14b
000634bc 773bc2b7 00657c68 00658078 00000100 USER32!SendMessageWorker+0x4d0
00063500 001d1f6b 00740340 001d81c0 00000100 USER32!GetWindowTextW+0x47
 
[......省略了重复的N次相同的调用栈......]
 
00066400 773c86ef 00740340 0000000d 00000100 FakeMac!StaticProc+0x3b [g:\w7documents\[...]\fakemac\commondef.cpp @ 168]
0006642c 773c8876 001d103c 00740340 0000000d USER32!InternalCallWinProc+0x23
000664a4 773c7631 00000000 001d103c 00740340 USER32!UserCallWinProcCheckWow+0x14b
000664e4 773bc2b7 00657c68 00658078 00000100 USER32!SendMessageWorker+0x4d0
00066528 001d1f6b 00740340 001d81c0 00000100 USER32!GetWindowTextW+0x47
00066618 773c86ef 00740340 0000000d 00000100 FakeMac!StaticProc+0x3b [g:\w7documents\[...]\fakemac\commondef.cpp @ 168]
00066644 773c8876 001d103c 00740340 0000000d USER32!InternalCallWinProc+0x23
000666bc 773c7631 000000

仔细看一下,在StaticProc(新的过程函数)中调用GetWindowText,GetWindowText内部通过SendMessage来实现。因为GetWindowText放在StaticProc消息处理的前面,所以在GetWindowText实现之前再次遇到了GetWindowText,于是无穷递归发生了,于是栈溢出了。想到这,顿时感觉自己SB了……这不是跟工作者线程中调用GetWindowText / SetWindowText 获取 / 设置主窗口标题引发死锁的情况是一样的吗?!!!


觉得文章还不错?点击此处对作者进行打赏!


本文地址: 程序人生 >> SDK控件子类化和栈溢出
作者:代码疯子(Wins0n) 本站内容如无声明均属原创,转载请保留作者信息与原文链接,谢谢!


更多



  1. 2011年10月27日00:07 | #1

    那对赞助商是肿么回事? [em004]

    [回复]

    代码疯子 回复:

    @Creke, 就是卖个链接 [em018] 每个月支付链接费。等有钱了考虑换个好点的主机,搬到国内来BA [em012]

    [回复]