我的腾讯微博,欢迎收听:http://t.qq.com/starsunyzl

慎用RtlCaptureContext

2010年6月30日 StarsunYzL 1 条评论

RtlCaptureContext可以用来获取调用者的线程环境结构CONTEXT,但有个很重要的前提,就是调用者必须是bp-based frame的函数,所谓的bp-based frame,就是指函数开头有push ebp/mov ebp, esp指令,如果调用者不是bp-based frame的,则RtlCaptureContext有可能产生0xC0000005异常而使程序退出,这取决于调用者的ebp值,看看RtlCaptureContext的实现就知道了:

@RtlCaptureContext:
	push    ebx
	mov     ebx, dword ptr [esp+8]
	mov     dword ptr [ebx+B0], eax
	mov     dword ptr [ebx+AC], ecx
	mov     dword ptr [ebx+A8], edx
	mov     eax, dword ptr [esp]
	mov     dword ptr [ebx+A4], eax
	mov     dword ptr [ebx+A0], esi
	mov     dword ptr [ebx+9C], edi
	jmp     short @L00000001
	mov     edi, edi
	push    ebx
	mov     ebx, dword ptr [esp+8]
	mov     dword ptr [ebx+B0], 0
	mov     dword ptr [ebx+AC], 0
	mov     dword ptr [ebx+A8], 0
	mov     dword ptr [ebx+A4], 0
	mov     dword ptr [ebx+A0], 0
	mov     dword ptr [ebx+9C], 0
 
@L00000001:
	mov     word ptr [ebx+BC], cs
	mov     word ptr [ebx+98], ds
	mov     word ptr [ebx+94], es
	mov     word ptr [ebx+90], fs
	mov     word ptr [ebx+8C], gs
	mov     word ptr [ebx+C8], ss
	pushfd
	pop     dword ptr [ebx+C0]
 
	; 注意下面这条指令,直接访问了调用者的ebp,
	; 如果调用者不是bp-based frame的,则ebp
	; 有可能指向无效的内存
	mov     eax, dword ptr [ebp+4]
	mov     dword ptr [ebx+B8], eax
	mov     eax, dword ptr [ebp]
	mov     dword ptr [ebx+B4], eax
	lea     eax, dword ptr [ebp+8]
	mov     dword ptr [ebx+C4], eax
	pop     ebx
	retn    4

VC++编译出来的程序,Debug版一般都是bp-based frame的,而Release版因为会优化代码,就不一定是bp-based frame,比如Release版经常会把函数编译成类似如下:

	; 函数开头没有push ebp/mov ebp, esp
	sub     esp, xxx
	; 省略...
	call RtlCaptureContext

这种情况很明显了,因为ebp的值不确定,所以call RtlCaptureContext极有可能崩溃。

MSDN里没看到有关于bp-based frame的说明,这是我测试google-breakpad时发现的,以后要注意了。

google-breakpad是Google的一个跨平台开源库,用来生成崩溃转储的,目前Chrome,Firefox等在使用此库)

分类: C/C++ 标签:

Visual.Assist.X.v10.6.1827.0.Cracked-YzL

2010年6月21日 StarsunYzL 3 条评论

官方2010.06.11更新1827 General release版。

Special thanks to BRD.

阅读全文…

VS2010的一个小BUG

2010年6月9日 StarsunYzL 7 条评论

今天发现的,测试VS2010简中版存在此BUG。

// vcpkgsrv.exe无限循环崩溃测试
//
// 把下面的代码粘贴到任意.h或者.cpp里,
// 等VS2010分析完文件,vcpkgsrv.exe将会崩溃退出,
// 然后VS2010会重新启动vcpkgsrv.exe,接着继续崩溃

class A
{
public:
	virtual void test() {}
};

class B : public A
{
public:
	// 这里不小心少写了个void,然后vcpkgsrv.exe就崩溃了
	virtual test() {}
};
分类: C/C++ 标签:

05.27又发15个腾讯微博邀请码(已完)

2010年5月27日 StarsunYzL 10 条评论

貌似有点供不应求,来晚了的朋友可以留个邮箱,还有的话我会发给你的。

阅读全文…

MD5算法的C实现源代码

2010年5月23日 StarsunYzL 没有评论

这份源代码来源于RFC1321文档 – The MD5 Message-Digest Algorithm的附录,应该是最官方的源代码了吧,可用于C、C++,可用于内核驱动。

一份测试代码:

阅读全文…

分类: C/C++ 标签: , ,

再发5个腾讯微博邀请码(蒲公英种子)(已完)

2010年5月22日 StarsunYzL 3 条评论

嗯,上次发的8个被用得很快,再发5个。

已经注册了的朋友,麻烦留言说明一下你使用了哪个邀请。

阅读全文…

Visual.Assist.X.v10.6.1823.0.Cracked-YzL

2010年5月20日 StarsunYzL 12 条评论

官方2010.05.06最新版,此为Inline Patch破解版,比上次的1822脱壳版稳定,推荐下载。

Special thanks to BRD.

阅读全文…

Guitar.Pro.6.0.1.r7840.Patch-YzL

2010年5月19日 StarsunYzL 57 条评论

 

强烈鄙视VeryCD上的某些人!

 

4年了,Guitar Pro 6终于复活了,目前能下到的最新版本为Guitar Pro 6.0.1 r7840,网上流传的激活方法需要修改网卡地址,所以我做了个补丁,应用后可以离线激活,不需要修改网卡地址、不需要联网、不需要修改hosts文件、不需要导入注册表,不需要GuitarPro.dat  :cy:

阅读全文…