(c语言)webqq登录

http://tunps.com/lab/c/ConsoleQ.c

代码太多,直接传文件。

用libcurl做http request。

用yajl解析json。

哥将md5算法的javascript实现转为了C语言。转换中发现了一些有趣的东西:>>>(无符号的右移运算符,JS特有,C没有这个运算符,但是C可以通过>>的逻辑右移来实现此运算)

WebQQ的登录过程分一下几个步骤,网上已经有详细的讲解,我就不详讲了。

  1. 取得验证码check,如果是以!开头的四位字符就无需输入验证码,当然console下面无法显示验证码。
  2. 本地md5_3加密完之后login。
  3. cookie中取得ptwebqq之后以json格式login2发送数据。
  4. login2返回json格式的vfwebqq和psessionid。保存起来。
  5. 登录后的每次操作(包括重新登录)都需要vfwebqq和psessionid作为token发送。

后续的获取好友列表,接受、发送消息没做。都是用json做交互。哥发现了yajl一处不好用的地方[1,2]就没有继续写下去了。暂时到这里吧。


Tagged | Leave a comment

str2binl和binl2str

function str2binl(D) {
    var C = Array();
    var A = (1 << chrsz) - 1;
    for (var B = 0; B < D.length * chrsz; B += chrsz) {
        C[B >> 5] |= (D.charCodeAt(B / chrsz) & A) << (B % 32)
    }
    return C
}
function binl2str(C) {
    var D = "";
    var A = (1 << chrsz) - 1;
    for (var B = 0; B < C.length * 32; B += chrsz) {
        D += String.fromCharCode((C[B >> 5] >>> (B % 32)) & A)
    }
    return D
}
两个来自:http://imgcache.qq.com/ptlogin/ac/v9/js/comm.js?v=1.2.35 的JS函数。 字符串和数字之间转换。值得研究。
Tagged | Leave a comment

vs2005 sp1前后版本号

sp1前:8.0.50727.42(RTM.050727-4200)

sp1后:8.0.50727.762(SP.050727-7600)

1 Comment

114 vnet


Leave a comment

moss

Leave a comment

在某某软件发现sqlserver服务器帐号

在某某软件发现sqlserver服务器帐号。你说丫的不注意安全,他还是知道把1433改为2433。

我还记得在读大学的时候,学校的机房有个虚拟磁盘软件,可以通过学号登录,每个学生有10MB的容量,用PB写的。同样用winhex、peid之类的软件哥获取了本校所有学生的帐号 xD。

某些人的做法是在client中or配置文件写加密密码,密码算法自己实现。但这个方法也不是绝对的安全。因为牛逼的hacker同样可以反编译出来。也不能用不可逆的算法(md5,sha1)。因为最后不管怎么玩,最后连接的配置信息还是明文的。

其实类似c/s的程序最好的解决方法三层结构。中间的逻辑层负责客户端的数据请求,而无需出示帐号。因为密码保存在中间件中。

Leave a comment

wm手机不支持j2me mmapi调用摄像头

I wanted to let my j2me project have the ability to take picutre using MMAPI(JSR135) So I check my HTC Diamond with the following code
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.midlet.MIDlet;
public class jsrtest extends MIDlet implements Runnable,CommandListener{
    Form form;
    Thread thread;
    Command c=new Command("Exit",Command.EXIT,0);
    public jsrtest()
    {
        Display.getDisplay(this).setCurrent(form=new Form("JSR Test"));
        form.addCommand(c);
        form.setCommandListener(this);
        (thread=new Thread(this)).start();
    }
    protected void destroyApp(boolean u){
        super.notifyDestroyed();
    }
    protected void pauseApp() {
    }
    protected void startApp(){
    }
    public void run() {
        checkJSR("MIDP2.0","javax.microedition.lcdui.game.GameCanvas");
        checkJSR("CLDC1.1","java.lang.Float");
        checkJSR("MMAPI","javax.microedition.media.Player");
        checkJSR("WMAPI","javax.wireless.messaging.Message");
        checkJSR("JSR75","javax.microedition.io.file.FileConnection");
        checkJSR("JSR082","javax.bluetooth.UUID");
        checkJSR("JSR135","javax.microedition.media.Control");
        checkJSR("JSR135_videocontrol","javax.microedition.media.control.VideoControl");
        checkJSR("JSR179","javax.microedition.location.Location");
        checkJSR("JSR180","javax.microedition.sip.SipConnection");
        checkJSR("JSR184","javax.microedition.m3g.Mesh");
        checkJSR("JSR211","javax.microedition.content.Registry");
        checkJSR("JSR226","javax.microedition.m2g.SVGImage");
        checkJSR("JSR229","javax.microedition.payment.TransactionRecord");
        checkJSR("JSR234","javax.microedition.amms.Module");
        checkJSR("JSR238","javax.microedition.global.Formatter");
        checkJSR("JSR239","javax.microedition.khronos.egl.EGL");
    }
    private void checkJSR(String jsr,String className)
    {
        try {
            Class.forName(className);
            form.append(jsr+" Supproted\n");
        } catch (ClassNotFoundException e) {
            form.append(jsr+" Not Supproted\n");
        }
    }
    public void commandAction(Command cmd, Displayable disp) {
        this.destroyApp(false);
    }
}

which shows MMAPI is supported on HTC Diamond. so I test the following code on my HTC Diamond to see if camera works but failed:

private void test(){
     Player p;
     VideoControl vc;
     try{
       p = Manager.createPlayer("capture://video");
       p.realize();
       vc = (VideoControl) p.getControl("VideoControl");
       form.append(new StringItem("mmmmmmmm",""));
       if (vc != null) {
        form.append((Item)vc.initDisplayMode(VideoControl.USE_GUI_PRIMITIVE, null));
       }
       p.start();
     }catch(Exception e){
        e.printStackTrace();
     }
}

On above code works fine on JAVA ME Platform SDK 3. Can anybody tell me why MMAPI doesn’t works my mobile phone? [via]

哥最近想让我的“老机伏枥”,在htc diamond上面写一个j2me的小程序来捕获摄像头图片。股沟了半天说需要手机支持MMAPI(JSR135标准),然后用以上的代码测试是支持MMAPI的,但是运行Capture之后就是“白屏”了,没有任何图像。说过MMAPI功能手机厂商需要购买,所以为了节约成本就不支持这玩意儿了。

后来也发现很多人的wm机器不支持j2me调用摄像头[1]。

又下载了JavaME SDK3,安装了sun-java-cldc-emu.cab,这个模拟器和jblend一样无法调用摄像头。 最后只有放弃,采用winapi的方式来调用了。
Leave a comment

C字符串转数组,类似于php的explode()

/************************************************************************/
/* 字符串转数组,类似于php的explode(),通过参数指定分隔符号,写得很烂,将就用着*/
/* http://tunps.com															   */
/************************************************************************/
#include <stdio.h>
#include <windows.h>
#define N 10
#define M 10

void explode(char *delimiter,int delimiterSize,char *strIn,int strInSize,char** strOut)
{
	int i,j,k=0,m=0,n=0;
	int isDelimiter[1000]={0};
	for(i=0;i<strInSize;i++)
	{
		for(j=0;j<delimiterSize;j++)
		{
			if(strIn[i] == delimiter[j])
			{
				isDelimiter[i] = 1;
				break;
			}
		}
	}
	for(i=0;i<strInSize;i++)
	{
		if(isDelimiter[i] == 1 && isDelimiter[i+1] == 0)
		{
			continue;
		}
		else if(isDelimiter[i] == 0 && isDelimiter[i+1] == 0)
		{
			strOut[m][n] = strIn[i];
			n++;
		}
		else if(isDelimiter[i] == 1 && isDelimiter[i+1] == 1)
		{
			continue;
		}
		else
		{
			strOut[m][n] = strIn[i];
			strOut[m][n+1] = 0;
			m++;
			n=0;
		}
	}
}
void main()
{
	char **str2;
	int i;
	char str[]=",#123,34,567,89;#*";
	// 11001001000100111
	char delim[]=",;#*";
	str2=(char**)malloc(N*M*sizeof(char*)); 
	for(int i=0;i <N*M;i++)   { 
		str2[i]=(char*)malloc(N*sizeof(char)); 
		memset(str2[i],0,sizeof(char)*N); 
	}
	explode(delim,sizeof(delim)/sizeof(delim[0])-1,str,sizeof(str)/sizeof(str[0])+100,str2);
	for(i=0;i<N && str2[i][0] !=0 ;i++)
	{
		printf("%s\n",str2[i]);
	}
	system("pause");
}
Tagged | Leave a comment

传递多个参数给_beginthread

/*******Test Return Value of Struct *******/
#include <stdio.h>
#include <process.h>

typedef struct ST{ 
	int num; 
	char* buf; 
}thestruct; 

void Addem(thestruct* );

int main()
{
	thestruct st;
	st.num = 6000;
	_beginthread((void(*)(void*))Addem,0,(void*)&st);
	getchar();    // freeze program so you can see output
}

void Addem(thestruct* s)
{
	printf("%d\n",(thestruct*)(s)->num);
	_endthread();
}

解决方法就是使用struct。

[via]

Tagged , | Leave a comment

libcurl sample program

#define CURL_STATICLIB
#define _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_DEPRECATE 
#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"D:\\win32dev\\curl-7.19.0\\lib\\Debug\\curllib.lib")
/* Start of test program */
#include <stdio.h>
#include <stdlib.h> 

#include <curl/curl.h>
#include <curl/types.h>
#include <curl/easy.h>

size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream)
{
	static int first_time=1;
	char outfilename[FILENAME_MAX] = "body.html";
	static FILE *outfile;
	size_t written;
	if (first_time) {
		first_time = 0;
		outfile = fopen(outfilename,"w+");
		if (outfile == NULL) {
			return -1;
		}
		fprintf(stderr,"The body is <%s>\n",outfilename);
	}
	written = fwrite(ptr,size,nmemb,outfile);
	return written;
}

int main(int argc, char **argv)
{
	CURL *curl_handle;
	char headerfilename[FILENAME_MAX] = "head.html";
	FILE *headerfile;
	int rc=0;
	curl_handle = curl_easy_init();
	curl_easy_setopt(curl_handle,   CURLOPT_URL, "http://www.sina.com.cn");
	curl_easy_setopt(curl_handle,   CURLOPT_NOPROGRESS  ,1); 
	curl_easy_setopt(curl_handle,   CURLOPT_WRITEFUNCTION,&write_data);
	headerfile = fopen(headerfilename,"w");
	if (headerfile == NULL) {
		curl_easy_cleanup(curl_handle);
		return -1;
	}
	curl_easy_setopt(curl_handle,   CURLOPT_WRITEHEADER ,headerfile);
	curl_easy_perform(curl_handle);
	printf("The head is <%s>\n",headerfilename);
	fclose(headerfile);
	curl_easy_cleanup(curl_handle);
	return 0;
}
/* End of test program */

将获取的html文件内容保存在body.html。保存的方法是curl_easy_setopt函数中设置CURLOPT_WRITEFUNCTION的回调函数为write_data。

在write_data这个回调函数中需要注意的是,curl碰到web文件过大的情况会分段获取内容

size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream)
参数ptr是指向分段下载内容的指针。size是内容大小,mmemb指定单位一般是1(Byte)。stream就是CURLOPT_WRITEDATA指定的指针。如果要讲所有html内容保存在buffer中,可以strcat(stream,ptr);就可以了。
Tagged | Leave a comment