Fork me on GitHub

Swfdump——从内存中提取swf的工具

Publish: March 30, 2015 Category: project,as3/flash

刚刚整理代码时发现以前写的从进程的内存镜像中提取swf文件的工具,现在分享出来,希望能帮到有需要的朋友。
这个小工具是命令行使用,没有界面,可以很方便的从指定进程中(比如浏览器,swf播放器等等),按swf的文件头标识来提取解压后的swf文件.
在swf运行过程中,不论zlib压缩(cws)还是lzma压缩(zws)的swf文件,在内存中都会被解压成fws的格式,所以除非你的as3代码经过混淆或者使用内存欺骗的技巧,否则一般加密方式对于这种内存提取swf的方案都是徒劳,轻松可以获取as3代码和图片资源。

工具名称:swfdump
工具功能:从进程中读取swf
使用说明:swfdump.exe 进程名
示例:swfdump.exe chrome.exe
作者:yoyo(http://yoyo.play175.com)

下载地址:swfdump.zip (47KB,来自:http://yoyo.play175.com

(注意:本程序并没有病毒或其他破坏性的代码,请注意chrome浏览器中下载时会提示:不是常见的下载类型,可能存在危险。如不放心,请勿使用)

GLFW 3.x的MAKEFILE脚本(mingw)

Publish: March 28, 2015 Category: C/C++

下载下来的GLFW需要使用CMAKE编译,但我电脑上只有mingw环境,所以把CMAKE的脚本翻译成MAKEFILE,希望对你有用!

APP = simple
OBJS = src/context.o src/init.o src/input.o src/monitor.o src/window.o  \
    src/win32_init.o src/win32_monitor.o src/win32_time.o src/win32_tls.o \
    src/win32_window.o src/winmm_joystick.o src/wgl_context.o \
    examples/simple.o

INCLUDE = -I. -I./include -I./deps 
LIB = -L. -lopengl32 -lgdi32 -lglu32

CFLAGS = -std=gnu99 -DWIN32 -D_GLFW_USE_OPENGL -D_GLFW_WIN32 -D_GLFW_WGL -DUNICODE
WARNS = -Wno-unknown-pragmas -Wl,--subsystem,console
LDFLAGS = ${LIB} ${WARNS}

all: ${APP}.exe

${APP}.exe : ${OBJS}
    ${CC} -o $@ ${OBJS} ${LDFLAGS}

clean :
    $(RM) src/*.o -f
    $(RM) examples/*.o -f

%.o : %.c ${HEADERS}
    ${CC} ${CFLAGS} ${INCLUDE} -c $< -o $@

求数组中前两个最大数的算法

Publish: March 27, 2015 Category: C/C++

前段时间在捣鼓图像二值化的时候学到的算法(来源网页已经找不到了,,,汗),然后自己优化了一下(后面会再写一篇文章记录一下图像二值化的各种算法)。

#include <stdio.h>

void max2index(int *arr, int n, int *first_idx, int *second_idx) {
    //第 0 个最大数,第 1 个次大数
    int max2idx[2] = { 0 ,-1};//考虑两个以上相同最大数,只取第一次匹配到的数
    //int max2idx[2] = { 0 ,0};//如果不需要考虑有两个以上相同最大数
    int i;
    for(i = 1; i < n; ++i) {
        //printf("%d,%d,%d,%d\n",i,arr[i],max2idx[0],max2idx[1]);
        if(arr[i] > arr[max2idx[0]]) {
            //如果比最大数还要大,则最大数取它,之前的最大数移入次大数
            int t = max2idx[0];
            max2idx[0] = i;
            max2idx[1] = t;
        } else if (arr[i] < arr[max2idx[0]]){
            if (-1 == max2idx[1] || arr[i] > arr[max2idx[1]]) {
                //如比最大数小:如次大数没有设置,则设为次大数;否则比次大数大才设为最大数
                max2idx[1] = i;
            }
        }
    }
    *first_idx = max2idx[0];
    if(max2idx[1] == -1) max2idx[1] = max2idx[0];//如果数组全是一样的数的情况,次大数则为没设置状态
    *second_idx = max2idx[1];
}

void printarr(int *arr,int n) {
    while(n-- > 1)printf("%d,",*(arr++));
    printf("%d\n",*arr);
}

int main() {
    int arr[] = {10,2,3,4,5,6,7,8,9,10};
    //int arr[] = {1,1,1,1,1,1,1,1,1,1};
    printarr(arr,10);

    int first_idx,second_idx;
    max2index(arr,10,&first_idx,&second_idx);
    printf("first index:%d,second index:%d\n",first_idx,second_idx);
    printf("first:%d,second:%d",arr[first_idx],arr[second_idx]);
}

大文件快速分析和查找

Publish: March 17, 2015 Category: C/C++

有时候有这种需求,需要从一个二进制大文件中查找是否有某种格式的文件,由于大文件是二进制,且非常大,几百M,一般的手工查找方式不太现实了。可以可以通过代码来遍历二进制,查找是否有该文件格式的关键字数据(一般文件头都会有标识,比如dds文件首三个字节是DDS,png、jpg、swf等文件都会有自己的标识头)。

关于搜索算法,我一开始想到的是字符串匹配算法,Google了一下,关于字符串匹配算法有很多种,其中称为Sunday的算法速度非常快,且非常容易理解。关于该算法的具体实现,可以查看本文末尾提供的参考资料,特别是那个PPT,看那个例子非常浅显明了。

字符串匹配算法只能从固定长度内存中匹配,几百M几G的文件不可能一次性全部读取到内存中,所以我使用了分块读取,而在读取下一块文件时,文件指针向后滑动一个窗口,重叠读取,避免这部分内容漏掉匹配。

»» 点击浏览全文 »»»»»»

不重复随机数列的生成即随机打乱一个数组的算法

Publish: December 11, 2014 Category: 未分类内容

假设一个长度为10的数组arr:

1,2,3,4,5,6,7,8,9,10

假设m=10
1、用系统随机函数得到一个小于m的随机数n
2、将arr[n]和数组最后一个元素即下标m-1所在的元素arr[m-1]交换,并将m减1
3、依次进行1、2这样的循环操作,直到m=0时终止操作

假设第 1 次操作后,倒数第 1 个和随机到的第 5 个元素交换:

»» 点击浏览全文 »»»»»»

关于汉堡包图标的一点收集

Publish: December 5, 2014 Category: 未分类内容

先留个坑,有时间了补上。。。
就是这个图标:
hamburger.gif

»» 点击浏览全文 »»»»»»

全球范围内的国家和城市数据库——各种不同语言

Publish: December 3, 2014 Category: 未分类内容

<CountryRegion Name="泰国" Code="THA">
<State>
  <City Name="安纳乍能" Code="37" />
  <City Name="巴蜀" Code="77" />
  <City Name="巴吞他尼" Code="13" />
  <City Name="巴真" Code="25" />
  <City Name="北碧" Code="71" />
  <City Name="北标" Code="19" />
  <City Name="北大年" Code="94" />
  <City Name="北揽" Code="11" />
  <City Name="北榄坡" Code="60" />
  <City Name="北柳" Code="24" />
  <City Name="碧差汶" Code="76" />
  <City Name="博达伦" Code="93" />
  <City Name="猜那" Code="18" />
  <City Name="猜也奔" Code="36" />
  <City Name="程逸" Code="53" />
  <City Name="春蓬" Code="86" />
  <City Name="春武里" Code="20" />
...

上面这段xml是从QQ安装目录的I18N下的2052目录找到的,文件名叫LocList.xml,其他语言如英语、法语,只需要安装一个国际版的QQ就找到了,低调低调,虽然这个是联合国的公开数据,不过我还是不要放上来了,我只能帮到这了。。

另外:怎么样在手机定位中找到国家、省份和城市?其实强大的Google就有这样的API:

提供经纬度(latlng参数),会返回识别到的的地址列表

https://maps.google.com/maps/api/geocode/json?latlng=22.538914,22.91479&language=zh-CN&sensor=true

也可以提供模糊地址(address参数)

https://maps.google.com/maps/api/geocode/json?address=台北101大厦&language=zh-CN&sensor=true

自己动手,浏览器打开上面地址试试看

Unity3D截屏

Publish: November 1, 2014 Category: 游戏开发

void OnClick ()
{
    StartCoroutine(CaptureScreen());
}

IEnumerator CaptureScreen()
{
    yield return new WaitForEndOfFrame();
    
    Texture2D t = new Texture2D(Screen.width, Screen.height);
    //截取的区域,使用像素空间坐标 (0,0)是屏幕左下角
    t.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0, false);
    t.Apply();
    //把纹理数据转换为PNG格式
    byte[] bytes = t.EncodeToPNG();
    //保存
    System.IO.File.WriteAllBytes(Application.dataPath + "/" + Time.time + ".png", bytes);
}

主要用到了Texture2D.ReadPixels这个API,看一下来自ceeger的API说明

Texture2D.ReadPixels 读取像素
function ReadPixels (source : Rect, destX :
int, destY : int, recalculateMipMaps : bool = true) : void

Read screen pixels into the saved texture data.

读取屏幕像素信息并存储为纹理数据

This will copy a rectangular pixel area from the currently active
RenderTexture or the view (specified by /source/) into the position
defined by destX and destY. Both coordinates use pixel space - (0,0)
is lower left.

这将从当前处于激活状态的 RenderTexture
或视图(由/source/指定)复制一个由destX和destY指定的矩形像素区域。这两个坐标使用像素空间坐标 (0,0)是屏幕左下角。

If recalculateMipMaps is set to true, the mip maps of the texture will
also be updated. If recalculateMipMaps is set to false, you must call
Apply to recalculate them.

如果 recalculateMipMaps 设置为真,这个贴图的mipmaps就会更新

如果 recalculateMipMaps设置为假,你需要调用Apply重新计算它们

This function works only on ARGB32 and RGB24 texture formats. The
texture also has to have Is Readable flag set in the import settings.

这个函数只工作在格式为ARGB32 和 RGB24纹理上,另外这个纹理的导入设置需要设置为 Is Readable(可读)

XCODE快速开发ANE步骤和一些常见错误的解决

Publish: September 5, 2014 Category: as3/flash

使用adobe air制作的移动应用,在对接第三方平台的时候,需要使用ANE来包装本机代码,在对接过程中,我积累了一些打包ANE的经验,记录下来,希望对看到的人有些帮助。
吐槽一下,ANE太难对付了,各种坑,调试也比较麻烦。

1、安装mac版本的AIR SDK
下载地址:http://www.adobe.com/devnet/air/air-sdk-download-mac.html

2、安装xcode的ANE项目模板(好东西~)
下载地址:https://github.com/divijkumar/xcode-template-ane

»» 点击浏览全文 »»»»»»

C#简单实现泛型数组QSort

Publish: September 1, 2014 Category: C#

Talk is cheap,show me the code

public class UIPanel
{
    public int depth;
}

public class Test
{
    /***************快速排序功能****************/
    public delegate int QSortCompareFunction<T>(T a,T b);
    public static void QSort<T>(T[] array,QSortCompareFunction<T> compareFunc)
    {
        //排序算法: 插入排序
        for(int i = 1; i < array.Length; i++)
        {  
            T t = array[i];  
            int j = i;
            while( (j>0) && compareFunc(array[j-1] , t) > 0 )
            {
                array[j] = array[j-1];
                --j;
            }
            array[j] = t;
        }
    }
    /************快速排序功能结束***************/

    static int UIPanelSortBy(UIPanel a,UIPanel b)
    {
        if(a.depth > b.depth)return 1;
        if(a.depth < b.depth)return -1;
        return 0;
    }

    static void PrintArray(UIPanel[] panels)
    {
        System.Console.Write("[");
        for(int i = 0; i < panels.Length; i++)
        {
            if(i != 0)System.Console.Write(",");
            System.Console.Write(panels[i].depth);
        }
        System.Console.Write("]\n");
    }

    static void Main(string[]args)
    {
        UIPanel[] panels = {
            new UIPanel(){depth = 6},new UIPanel(){depth = 2},new UIPanel(){depth = 1}
            ,new UIPanel(){depth = 4},new UIPanel(){depth = 5},new UIPanel(){depth = 3}
            ,new UIPanel(){depth = 2},new UIPanel(){depth = 5},new UIPanel(){depth = 7}
        };

        PrintArray(panels);

        QSort<UIPanel>(panels,UIPanelSortBy);

        PrintArray(panels);
    }
}