Written in C, but could be easily adapted to return std::string and such:

Code:
char *getPass(char *szBuffer, size_t len)
{
	size_t i;
	HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE);
	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	DWORD dwOld, dwNumRead, dwNumWritten;
	if((hIn != INVALID_HANDLE_VALUE) && (hOut != INVALID_HANDLE_VALUE))
	{
		if(GetConsoleMode(hIn,&dwOld))
		{
			if(SetConsoleMode(hIn,ENABLE_PROCESSED_INPUT))
			{
				for(i=0;i<len-1;i++)
				{
					if(ReadConsole(hIn,&szBuffer[i],1,&dwNumRead,NULL))
					{
						if(szBuffer[i] == '\r')
						{
							break;
						}
						else WriteConsole(hOut,"*",1,&dwNumWritten,NULL);
					}
					else break;
				}
				WriteConsole(hOut,"\n",1,&dwNumWritten,NULL);
				szBuffer[i] = '\0';
				SetConsoleMode(hIn,dwOld);
				return szBuffer;
			}
		}
	}
	return NULL;
}