起因:无聊在网上看文章。。。看到一篇关于用qq的CameraDll.dll截图的文章很有意思。我就马上拿出rundll来试了一下。结果令人失望rundll.exe CameraDll.dll CameraSubArea 会跳出一个运行错误的对话框。后来在网上查了一下,原来是新版的QQ的CameraDll.dll就无法达到那篇文章的效果。于是我在网上弄了一个旧版的dll文件,成功的执行了命令,而且截下了图片。本来事情就到此为止了的,但是网上似乎有人在乎这个问题,“为什么新版的不能提取截图呢?”(其实这个问题应该去问马化腾同学。。。^_^)。这就让我产生了Debug一把这个破Dll的想法,算是拿这个Dll支持珊瑚虫同学了。 既然要弄CameraDll.dll那就从头弄起。看看CameraSubArea这个函数。用Depends看了看这个函数的地址0x10B0。OK,去看看那,于是看到了这里的东西: 601311BB |. 8BC6 mov eax, esi 601311BD |. 5E pop esi 601311BE |. 64:890D 00000>mov dword ptr fs:[0], ecx 601311C5 |. C9 leave 601311C6 \. C2 0400 retn 4 好,看情况 DWORD CameraSubArea(DWORD) 这样就可以了。 于是我写了Demo: #include <stdio.h> #include <windows.h> typedef int (__stdcall *CAMERASUBAREA)(int a); void main() { Sleep(1000); HMODULE hHandle = LoadLibrary("CameraDll.dll"); if (NULL == hHandle) { MessageBox(NULL,"error","LoadLibrary Failed",MB_OK); return; } CAMERASUBAREA pCameraSubArea = (CAMERASUBAREA)GetProcAddress(hHandle,"CameraSubArea"); if (NULL == pCameraSubArea) { MessageBox(NULL,"error","LoadLibrary Failed",MB_OK); FreeLibrary(hHandle); return; } pCameraSubArea(0); FreeLibrary(hHandle); } 运行以后,系统提示需要QQBaseClassInDll.dll。好吧,在QQ里拷贝一份QQBaseClassInDll.dll进去。再运行,有提示需要QQHelperDll.dll和BasicCtrlDll.dll,继续加入他们。 可是,运行后还是出现问题。Debug一下发现[eax + 4D]这句,而eax的值为0。也就是说要取0x04D的值,而我们知道4GB的内存中0到0x1000都是空指针区,自然会出错。 于是NOP掉这个Call。运行程序后发现截图已经没问题了,但是截图中的工具栏却还是一个都不能用。即然这样,那就继续Debug一下。发现了QQHelperDll.dll中的问题。和前面的问题一样,都是访问了空指针,NOP。而后面还有两处这样的问题,用NOP和JMP的方法都成功的解决了。 再次调用程序,OK已经恢复正常了。其实程序一开始无法使用都是因为他调用了BasicCtrlDll.dll中的GetCurrentUserData这个函数,在传参数出了问题。
[注意]看雪招聘,专注安全领域的专业人才平台!