最近闲来无事,打算把之前在其他博客站点写的一些跟tboox项目相关的老文,放到我的个人站点上来
并且整理归纳了下,以前学生时期研究的一些的玩意用到的一些技术,例如(手写识别、分形图像等等什么的。。)
以后就重点吧这个站点,作为我的个人博客主站了。。嘿嘿。
本文,主要介绍我之前在学校时候,研究的一些跟手写数字识别相关的技术心得,主要涉及:数字图像处理、特征提取、神经网络等等相关的一些技术。。
虽然很多用到的还是网上现有的比较成熟的算法,但是在这些基础上,我还是有做了不少算法上的改进的。。
并且为了写这个项目,我当时还特地写了一整套神经网络库,从图像处理开始到最后的识别过程,没有使用任何第三方库,都是从0还是写起 也没有用到opencv啊什么的。
上层ui当时用的qt,虽然当时也算是为了跨平台,但那个时候毕竟还是学生,代码经验欠缺,因此我的基础库对跨平台处理的并不是很好。。
那个基础库,我稍微简单说下,那是我的第一个开发库,是一个类似boost的c++模板库,里面用到了很多c++的模板元编程的特性,但是现在已经对c++无爱了,所以早已废弃不用了。
不过也就是这个库的开发,很大程度上影响了我之后的编码风格,也是至此之后,我重点转向了对c的开发上。。
这套识别系统,仅仅是我当时为了学习神经网络,拿来练手用的,没法跟那些成熟的相比,识别率不是很高哈,只能给大家用来参考学习了。
本文在基本BP算法和数字图像与处理的基础上,通过改进网络、图像处理算法,并结合实践来探索如何实现具有高鲁棒的、高精度的、高效率的脱机数字识别。
在这我主要研究脱机单体数字识别,其主要步骤为:
主要采用5行10列的数字样本规格。采集方式是通过扫描样本卡片来获取图像,也尽量避免样本了的失真,如图:
主要采用全局阈值分割法和自适应的局部阈值分割法,来实现在不同亮度背景下的自适应分割,并对结果进行比对。
这是一个可以直接解释执行从ida pro里面提取出来的x86汇编代码的虚拟机。
非常精简,整体架构上不能跟那些成熟的虚拟机相比,主要目标是够用、能用、轻量就行,如果觉得代码架构设计的不是很好的话,也不用过于吐槽哈。。
虽然我还有写过两个比较成熟的虚拟机项目(jvm和avm),虽然架构上比这个更完善,更容易扩展,功能也更强大
但是毕竟是给公司写的,没法拿出来分享。。
先说说,为什么要写这个东西。。
之前有段时间,我在用ida逆向分析某些程序的算法,并且要把它提取出来将其跨平台运行,这个时候我首先考虑到是ida的F5插件
毕竟这个可以直接反成c/c++代码,还是很强大的,基本上98%的x86汇编代码,我在通过f5还原成c/c++代码后,都能正常运行。
原本我以为可以万事大吉了,不过就在当我沾沾自喜的时候,发现其中某个汇编函数的c代码,死活就是运行不正常,输出结果不对。
而且那个函数偏偏代码量出奇的大,光c代码就有上万行,而且里面还对数据结构和明文都做了变换和加密,要是慢慢调试的话,得痛苦死。。哎。。
现在xmake在windows下,也已经支持调试运行了,可以在编译完debug版本的程序后,直接进行调试开发。。
我们继续以tbox工程为例:
$ xmake f -m debug
$ xmake r -d demo
上述命令,先配置了debug模式编译,为了启用pdb调试符号文件的生成,然后自动编译后,调试运行demo程序。。
xmake会在配置的时候,自动检测windows上注册表里面的默认调试器,然后加载我们的目标程序并运行。
一般情况下,加载的是vs自带的vsjitdebugger调试器,当然xmake也支持windbg和ollydbg(做逆向的,这个用的比较多哈。。)
我们试着运行demo中的exception测试用例,进行人为中断,然后调试运行:
$ xmake r -d demo platform_exception
可以看到如下效果:
这个工具是我之前在做ios逆向分析的时候,随手写的一个小工具,虽然现在已经不怎么维护了,不过这里还是拿出来简单介绍下吧。。
当初写这个工具的背景主要是因为要在越狱的ios系统上,做些插件开发,所以要分析一些私有api的调用规则,以及传参情况。
虽然可以通过ida进行静态分析,也可以做到,但是有些需求毕竟还是需要动态分析来的方便,而且那个时候ida的arm f5插件还没流出, 只能通过人工逆向arm来分析,工作量还是挺大的。
因此就萌生了能否动态去追踪ios系统上对oc代码的调用逻辑呢,逼近objc是基于runtime的,总归是有些办法的。。
一开始,我的重点是在objc_msgSend
这个接口,毕竟所有oc调用,最后都会路由到这个接口中,因此我写了个gdb的脚本去动态trace这个接口:
define to
b objc_msgSend
c
set $__i = 0
while ($__i < $arg0)
printf "%d: [%s %s]\n", $__i, (char*)object_getClassName($r0), (char*)$r1
set $__i++
c
end
end
在.gdbinit这个文件中加入这个脚本api的定义,然后加载gdb attach到指定的系统进程后,执行:
$ to 100
就可以trace之后的100条objc_msgSend
调用,并且打印出详细的objc方法调用名称。
之前xmake默认编译windows目标,debug模式下采用的是-Z7
编译选项,内置的调试符号信息到obj文件里面
但是这种方式按msdn的文档上说,是属于旧式的调试符号文件格式,所以为了考虑后续的兼容性,xmake修改了默认的调试符号生成规则,
改为默认启用pdb符号文件,并且pdb的方式更为常用。。
这个行为的修改,并不会影响到xmake.lua
的设置,如果在这个文件中,设置了启用调试符号:
set_symbols("debug")
那么,编译debug版本的目标时,就会自动生成pdb文件,以tbox为例:
$ xmake f -m debug
$ xmake
编译完成后,会自动在build目录下生成两个pdb文件:
build\tbox.pdb
build\demo.pdb