国内某物流网站 套接字 解密的反汇编代码

2014-7-30 奇Yu 系统编程

.code 
		push ebx
		push esi
		push edi
		push ebp
		add esp,-0x8h
		mov ebp,edx
		mov eax,dword ptr ss:[ebp]
		mov dword ptr ss:[esp+0x4h],eax
		mov eax,dword ptr ss:[esp+0x4h]
		test eax,eax
		je short L0048FA95
		sub eax,0x4h
		mov eax,dword ptr ds:[eax]
L0048FA95:
		mov word ptr ss:[esp],ax
		cmp word ptr ss:[esp],0x0h
		jbe L0048FB70
		movzx eax,word ptr ss:[esp]
		shr eax,01h
		mov word ptr ss:[esp],ax
		movzx edi,word ptr ss:[esp]
		test di,0dih
		jbe short L0048FB36
		mov bx,0x1h
L0048FABB:
		test bl,0x1h
		je short L0048FB06
		movzx esi,bx
		mov eax,dword ptr ss:[ebp]
		movzx eax,byte ptr ds:[eax+esi-0x1h]
		mov byte ptr ss:[esp+0x2h],al
		mov eax,ebp
		call L004056F0
		movzx edx,word ptr ss:[esp]
		movzx ecx,bx
		add edx,ecx
		mov ecx,dword ptr ss:[ebp]
		movzx edx,byte ptr ds:[ecx+edx-0x1h]
		mov byte ptr ds:[eax+esi-0x1h],dl
		mov eax,ebp
		call L004056F0
		movzx edx,word ptr ss:[esp]
		movzx ecx,bx
		add edx,ecx
		movzx ecx,byte ptr ss:[esp+0x2h]
		mov byte ptr ds:[eax+edx-0x1h],cl
		jmp short L0048FB30
L0048FB06:
		mov eax,ebp
		call L004056F0
		movzx edx,bx
		lea esi,dword ptr ds:[eax+edx-0x1h]
		mov eax,ebp
		call L004056F0
		movzx edx,word ptr ss:[esp]
		movzx ecx,bx
		add edx,ecx
		lea eax,dword ptr ds:[eax+edx-0x1h]
		movzx edx,byte ptr ds:[eax]
		xor byte ptr ds:[esi],dl
		xor byte ptr ds:[eax],0x83h
L0048FB30:
		inc ebx
		dec di
		jnz short L0048FABB
L0048FB36:
		mov eax,ebp
		call L004056F0
		mov esi,eax
		mov eax,dword ptr ss:[ebp]
		mov dword ptr ss:[esp+0x4h],eax
		mov eax,dword ptr ss:[esp+0x4h]
		test eax,eax
		je short L0048FB53
		sub eax,0x4h
		mov eax,dword ptr ds:[eax]
L0048FB53:
		mov edi,eax
		test di,0dih
		jbe short L0048FB70
L0048FB5A:
		xor byte ptr ds:[esi],0x62h
		cmp byte ptr ds:[esi],0x80h
		jbe short L0048FB67
		sub byte ptr ds:[esi],0x60h
		jmp short L0048FB6A
L0048FB67:
		add byte ptr ds:[esi],0xA0h
L0048FB6A:
		inc esi
		dec di
		jnz short L0048FB5A
L0048FB70:
		pop ecx
		pop edx
		pop ebp
		pop edi
		pop esi
		pop ebx
		retn

反编译后的代码大概是这样的可以简单的看出逻辑

char a[100];
int i=0;


for(i=0;i<a.len;i++){

    a[i]=  a[i] xor 0x62
    if(a[i]==0x80 or a[i]<0x80){
        a[i]+=0xa0;
    }else
    {
        a[i]-=0x60
    }

}


int a[]={0x9C,0x00,0x00, 0xC5,0x00,0xEC,0x02, 0x0C, 0xE8};

for(int i=0;i<8;i++){

    a[i]=  a[i] | 0x62;
    if(a[i]==0x80 || a[i]<0x80){
        a[i]+=0xa0;
    }else
    {
        a[i]-=0x60;
    }

}


评论(0) 浏览(2274)

vc控制台程序将二进制转换成UTF8

2014-7-28 奇Yu 系统编程

很久以前写的了。发现在电脑里有存档,现在黏贴在次。之前用抓包软件抓包,发现他只能转换成ANSI的所以写的

#include <stdio.h>
#include <vector>

size_t GetFileSize(FILE* fd)
{
	size_t cur_pos = ftell(fd);
	fseek(fd,0,SEEK_END);
	size_t file_size = ftell(fd);
	fseek(fd,cur_pos,SEEK_SET);
	return file_size;
}

int CharHexToInt( char c , int offset )
{
	int value = 0;

	if( c <= '9' && c >= '0'){
		value = c - 0x30;
	}else if( c <= 'f' && c >= 'a' ){
		value = 10 + (c - 'a');
	}else if( c <= 'F' && c >= 'A'){
		value = 10 + (c - 'A');
	}else
		return 0;

	value <<= (4 * offset);

	return value;
}

size_t ReSetContext( std::vector<char> &output, std::vector<char> &input)
{
	int temps = 0;
	char offset = 1;
	for( size_t i = 0; i < input.size(); ++i ){
		if( input[i] == 0x20 ){
			output.push_back((char)temps);
			temps = 0;
			continue;
		}
		temps += CharHexToInt(input[i],offset);
		offset -= 1;
		offset *= offset;
	}
	return output.size();
}

int main(int argc ,char *argv[])
{
	std::vector<char> content;
	std::vector<char> output;

	FILE *fd = fopen("./s.bin","rb");
	if(fd == NULL)
		return 0;

	FILE *fd = NULL;
	fopen_s(&fd, "./s.bin", "rb");
	if (fd == NULL)
		return 0;


	size_t size = GetFileSize(fd);
	content.resize(size,0);
	fread(&content.front(),sizeof(char),size,fd);
	
	fflush(fd);
	fclose(fd);

	ReSetContext(output,content);
	
	fd = fopen("./s.txt","a");
	if(fd == NULL)
		return 0;
	fwrite(&output.front(),sizeof(char),output.size(),fd);
	fflush(fd);
	fclose(fd);

	return 0;

}
 

评论(0) 浏览(2174)

windos扫雷用JS简单实现

2014-7-26 奇Yu WEB开发

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

</head>
<body>
<style>
    table{background-color: red;}
    tr td{width: 20px;height: 20px;background-color: yellow;}
</style>

<script type="text/javascript" src="jquery.js"></script>
<table>
<script>

    var x=9;//宽度
    var y=9;//高度
    var shu=20;//雷数
    var lei=new Array();//雷的位置
   //循环出随机雷的位置
    for(var l=0;l<shu;l++){
        var c=Math.floor(Math.random()*parseInt(String(x)+y));
        lei[l]=c;
    }


    for(var i=1;i<x;i++){
        document.write('<tr>');
        for(var s=1;s<y;s++){
            //如果这个位置是雷 显示*
            if(xunhuan(String(i) + String(s))){
                document.write('<td value="*"></td>');
            }else{
                //不是累就显示 周围的雷数
                document.write('<td value="'+leishu(i,s)+'"></td>');

            }

        }
        document.write('</tr>');


    }
    //判断一个坐标是不是雷
    function xunhuan(xy){

       if(jQuery.inArray(parseInt(xy), lei)!=-1){
           return true;
       }else{
           return false;
       }
    }
    //判断一个坐标的 上下左右的坐标
    function leishu(i,s){
        var shu=0;
        //上边
        if((i-1)>=1){
            if(xunhuan(String(i-1)+s)){
                shu+=1;
            }
        }
        //下边
        if((i+1)<y){
            if(xunhuan(String(i+1)+s)){
                shu+=1;
            }
        }
        //左边
        if((s-1)>=1){
            if(xunhuan(String(i)+(s-1))){
                shu+=1;
            }
        }
        //右边
        if((s+1)<x){
            if(xunhuan(String(i)+(s+1))){
                shu+=1;
            }
        }
        //左上
        if((i-1)>=1 && (s-1)>=1){
          if(xunhuan(String(i-1)+String(s-1))){
              shu+=1;
          }
        }
        //右上
        if((i-1)>=1 && (s+1)<x){
            if(xunhuan(String(i-1)+String(s+1))){
                shu+=1;
            }
        }
        //左下
        if((i+1)<y && (s-1)>=1){
            if(xunhuan(String(i+1)+String(s-1))){
                shu+=1;
            }
        }
        //右下
        if((i+1)<y && (s+1)<x){
            if(xunhuan(String(i+1)+String(s+1))){
                shu+=1;
            }
        }

        return shu;
    }
    $(function(){
        $("table").on("click","td", function () {
           $val=$(this).attr("value");
            if($val=='*'){
                $(this).text('雷');
            }else{
                $(this).text($val);
            }

        });
    });

</script>
</table>
</body>
</html>
扫雷.png

评论(0) 浏览(1708)

房产中介OA办公php系统计划书

2014-7-25 奇Yu 乱七八糟

一、现状

现在云办公系统平台铺天盖地,但都是一些大类目的,例如服装行业,运输行业,房产行业,而更细分的子行业,专业对口于子行业云办公则少之又少。

在房屋中介出现一些状况

1.公司10几个业务员,都同时盯着XX同城信息网站。员工刚拨打过的房东电话,其它员工还会打一次,不仅浪费公司资源,更惹得房东厌烦;

2.出现了房东如果刷新或者置顶租房信息,公司的员工会再次重复发生第一条的事情,这个时候,连员工自己,都不知道这条信息,是否自己联系过,更不用提其它员工他们更不知道有没有其它同事联系过!!出现了一条消息多个员工拨打询问,或者一条消息全公司的人都没有人拨打过一次。

3.筛选的客户资源管理不科学,没有办公自动化的公司,很多员工把一些客户资源记录在文件或者笔记本内,不利于员工的业务追踪回访,更不利于企业管理和资源分配。

二、解决方案

1.在公司内所有电脑安装 谷歌游览器,在浏览器内 安装插件,插件和远程服务器连接。每次游览详情页,员工手动根据业主情况 分别选定不同等级,然后提交,如果是意向较深业主,可以抓取业主信息后提交,以便于后期回访。

2.当有标注颜色后,再次浏览 信息列表页,插件会自动从服务器获取该条信息的记录,然后标注出不同的颜色。以便于其它员工区分,该条消息是否被阅读过。

3.云端办公,公司登录云端办公,可以查看 ,检索,用户所标记的个个信息,可以对每条信息进行更新,企业管理者可以查看所有员工的,业务进展情况。

三、具体实现

插件具体实现:

1.在打开XX同城网站的 信息详情页弹出一个对话框。可以对该条信息尽兴标注,例如 红色代表同行,黄色代表户主,绿色代表有意向,

2.当打开信息的列表页时候,会在页表页的标题标注红黄绿,以区分该条消息的状态。

云端办公

1.云端接受用户提交的 各种信息入库,组成有效的客户资源信息库。

2.企业管理帐号,可以添加,删除,编辑,用户,可以查看所有的客户信息,

3.员工帐号,可以查看自己提交的客户资源,对其修改,删除,编辑,更新,添加回访信息备注;

4.企业客户管理添加查看修改删除签合同的客户信息租房到期时间等信息。

四、其它后期追加功能

1、实现微信公共平台接入,实现员工可以通过微信查看自己在云端的客户信息;

2、实现手机APP的办公自动化!

        

评论(1) 浏览(2264)

vc MFC 图片下载方法

2014-7-24 奇Yu 系统编程

这是很早以前写的 MFC  的图片下载方法,看到博客空空如也,就把以前的源代码 放上了,撑撑门面把

CString DownImg(CString url)
{
	CInternetSession session;
	CFile *Pfile;
	CFile file;
	
	//dwFileSize 图片的大小,dwByteRead;
	DWORD dwFileSize;  
	int nPos= url.ReverseFind('/');//查找右边第一个/的位置
	CString Name = url.Right(url.GetLength() - nPos - 1 );//保存的文件名字
	
	//检查图片是否存在
	int Exists=PathFileExists(L".\\temp\\"+Name);
	if(Exists==0)
	{
		//不存在了 重新调整写入路径
		CString lujing=(L".\\temp\\")+Name;

		//打开URL
		Pfile=session.OpenURL(url);
		if (Pfile!=INVALID_HANDLE_VALUE)
		{
			dwFileSize=  Pfile->GetLength();//获取文件字节数 
			if (dwFileSize==0xFFFFFFFF)
			{			
				AfxMessageBox(L"图片获取失败!");
			}
			//创建缓存
			char szInfoBuffer[1024*10];
			//写入文件
			if(file.Open(lujing,CFile::modeCreate|CFile::modeWrite))
			{
				while (Pfile->Read(szInfoBuffer,1024*10) != 0)
				{
					 file.Write(szInfoBuffer,1024*10);
				}
			 file.Close();
			}
			

		}
		session.Close();		
	
	}
	
	return Name;
}

标签: vc mfc

评论(0) 浏览(2199)

谷歌(Google Chrome)游览器插件开发

2014-7-23 奇Yu WEB开发

  记得应该是从09年开始吧。接触谷歌游览器,然后就一直使用谷歌游览器,在我印象中,国内的用户应该是开发人员用的谷歌比较多,从目前谷歌的占有率来看,其不是没有可能超过IE的哦,有这样的强劲动力当然和他的性能速度和稳定有关系,360极速游览器也是一只披着360皮的谷歌羊,国内用户会在360推动下更多的用户可以感受谷歌游览器的超高性能。

  对于谷歌游览器插件开发,感觉不能再简单了。

  如果是以前开发过IE,或者火狐游览器插件的,看到谷歌插件的说明文档,那就一个字 “爽”,你只需要会JS html就可以开发出功能强大的插件来。

编写谷歌插件首先需要弄明白几个概念。

20140723223706.png

1是插件图标,2是popup页面,至于background page是后台运行的看不到,content_scripts内容在页面JS内运行的也看不到哦!


1、manifest.json

每个应用都必须包含一个manifest.json文件,这个文件是一个注册汇总文件,里面放着插件的注册信息,包括 插件标题 图标,权限 页面等内容。


简单的示例:

{
   "manifest_version": 2,//谷歌插件沙盒环境的版本  现在的所有插件必须是2
    "name": "app name",//插件名
    "version": "1.0",//版本
    
    //工具栏上的信息
    "browser_action": {
        "default_title": "开关灯",//插件鼠标放上去的显示标题
        "default_icon": "icon.png",//图标
        "default_popup": "popup.html"//点击的弹出页面
    },
    //后台运行的信息
    "background": {
        "page": "background.html"//后台运行的页面
      },
    //与网页交互的信息
    "content_scripts": [
        {
            "matches": [
                "http://*.58.com/hezu/*",
                "http://*.58.com/zufang/*"

            ],//需要执行的页面地址
            "js": ["jquery.js","58.js"],//执行的JS
            "run_at": "document_end",//执行的时间段
            "all_frames": false
        }
    ],
      //app权限
    "permissions": [
        "tabs", "http://*/*", "https://*/*"
    ]     
    
}
2、popup


插件的弹出窗口,上面配置的    "default_popup": "popup.html" 这个页面,主要负责但不限于  和用户交互 提供一个窗口让用户设置等。

如果popup想调用 background page的js内的方法 可以使用

var bg = chrome.extension.getBackgroundPage();   
bg.testBG();  


在popup中还可以注入代码到web page中,但只限于对dom的访问和修改。

chrome.tabs.executeScript(null, {code:"document.body.style.backgroundColor=blue"});  


3、background page

后台运行的文件 "page": "background.html"   后台运行,主要负责的是一些后台操作,例如保存一些配置信息到本地。

4、Content scripts

通过content script可以使应用和web页面交互,content script是指能够在浏览器已经加载的页面内部运行的Javascript脚本。可以将content script看做是网页的一部分,但是他不能使用网页原本的JS,因为谷歌为了解决他和当前页面的JS 的冲突,让他运行在另外一个沙盒内,他与原来的页面共用DOM,并且他不能直接调用 当前插件 POPUP 和background page的JS,只能使用信息交互。


消息传递
消息分为三种,一次性消息、长效消息、扩展间消息,就是文档中所说的, one-time requests, long-lived connections, cross-extension messages
一次性消息(one-time requests)
从content script发送给background:

chrome.runtime.sendMessage({cmd: "mycmd"}, function(response) {  console.log(response); });

从background向content script发送消息:
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {  chrome.tabs.sendMessage(tabs[0].id, {cmd: "mycmd"}, function(response) {    console.log(response);  }); });

接收方代码:
chrome.runtime.onMessage.addListener(  function(request, sender, sendResponse) { 
console.log(sender.tab ?  "from a content script:" + sender.tab.url :                "from the extension");
 if (request.cmd== "mycmd") 
      sendResponse( "ok"); 
  });

长效消息(long-lived connections)是现在消息的收发双方建立通道,然后通过这个通道收发消息。
连接主动方:
var port = chrome.runtime.connect({name: "con1"}); port.postMessage({cmd: "mycmd"}); port.onMessage.addListener(function(msg) {  
if (msg.recmd== remycmd") 
    port.postMessage({cmd: "mycmd2"}); 
  else if (msg.recmd== "remycmd2") 
    port.postMessage({cmd: "mycmd3"}); 
});

连接被动方:
chrome.runtime.onConnect.addListener(function(port) {  console.assert(port.name == "con1");  port.onMessage.addListener(function(msg) {
    if (msg.cmd== "mycmd")     
 port.postMessage({recmd: "remycmd"});
    else if (msg.cmd == "mycmd2") 
      port.postMessage({recmd: "remycmd2"});
    else if (msg.cmd== "mycmd3")
      port.postMessage({recmd: "remycmd3"});
  });
 });

更多的关于谷歌开发文档可以参考谷歌官方文档

https://developer.chrome.com/extensions





标签: Google Chrome 插件开发

评论(0) 浏览(2260)

windows下 phonegap(cordova ) nodejs git ant 配置

2014-7-14 奇Yu 移动应用

因为看到交流群了,很多童鞋不知道怎么使用NODEJS来创建cordova 项目。或者是在用NODEJS创建项目时候遇到错误。所以写这篇文章。算是做个标记。

本文不再介绍JAVA jdk 的安装配置。如果不会请自行度娘!

如果安装phonegap官方的说明,

先下载 nodejs 安装

然后在 用


C:\> npm install -g phonegap


命令 你会发现

提示 npm ERR! not found:git

这是因为你的系统没有安装GIT工具

GIT具体是做什么的 自行度娘!!

QQ图片20140714220815.jpg


下面是正确的做法

第一步 、

首先去 http://nodejs.org/

下载NODEJS 

只需要点击绿色的 INSTALL

他会自动下载适合你系统的版本

QQ图片20140714220329.jpg

这个没有什么,只需要下一步,下一步安装好了。


第二步、

安装GIT工具

1 官方网站 http://msysgit.github.io/ 

也可以去谷歌下载不过因为ZF的和谐,速度不敢恭维,甚至打不开

这里提供一个CNDS的地址

http://download.csdn.net/detail/z4231/7620429

安装也没有什么,只需要下一步,下一步即可。

最后需要设置的


在 我的电脑 -》属性-》环境变量-》系统变量 ->PATH内添加、

你GIT的安装目录下的bin  和libexec\git-core;的路径 注意需要用;和隔开

D:\Program Files\Git\bin;

D:\Program Files\Git\libexec\git-core;


QQ图片20140714222211.jpg


第三步

安装 ANT

下载地址

http://ant.apache.org/

下载后直接解压

然后将解压后的文件放到  你程序的安装目录 例如 我的会放到 D:\Program Files目录下

然后设置环境变量

新建一个ANT_HOME 值是你刚才的目录 D:\Program Files\apache-ant-1.9.3

ANT_HOME: D:\Program Files\apache-ant-1.9.3

在path 内追加 %ANT_HOME%\bin;

如果存在 CLASSPATH的变量则追加

不存在则 新建CLASSPATH然后值为%ANT_HOME%\lib



ANT_HOME: D:\Program Files\apache-ant-1.9.3

path:%ANT_HOME%\bin;
CLASSPATH:%ANT_HOME%\lib


请确保你的android adt安装成功 有在系统环境变量内配置 platform-tools和tools的两个目录 

PATH:安装目录\tools;安装目录\platform-tools

至此你的phonegap已经配置成功了。。

接下来你可以运行 CMD命令

输入

 npm install -g cordova
在网络畅通的情况下。稍等片刻 你就安装成功了





标签: phonegap cordova

评论(0) 浏览(9287)

欢迎使用emlog

2014-7-14 奇Yu

恭喜您成功安装了emlog,这是系统自动生成的演示文章。编辑或者删除它,然后开始您的创作吧!

评论(0) 浏览(1526)

Powered by emlog 豫ICP备14014990号-1 sitemap