- 博客(776)
- 资源 (54)
- 收藏
- 关注
原创 逆向工程学习笔记(19):64位数据处理
在32位系统中使用64位的数据类型时,需要使用2个寄存器来保存数值的高32位和低32位,如double,uint64_t等,看下面的代码:; double __stdcall yfcstd::NormalizeAngle(double)0x300011E0 mov eax, dword [0x30003044]0x300011E5 mov ecx, dword [0x30003040]0x300011EB mov edx, dword [0x3000304c]0x300...
2021-05-03 00:08:46
512
原创 逆向工程学习笔记(18):浮点数比较
X86提供了一个叫FCOM的指令用以进行浮点数的比较:0x30001084 fcomp qword [0x30003068]上面的指令将ST(0)寄存器的值与一个全局变量进行比较,并设置浮点标志寄存器:这里的C3,C2,C0是FPU状态寄存器的3个比特位:紧接着使用一条FSTSW指令将FPU状态寄存器赋给AX最后就可以用test命令进行比较和跳转了。一个完整的指令序列:0x30001080 fld qword [esp + 4]0x30001084...
2021-04-27 00:00:29
574
原创 逆向工程学习笔记(17):回调函数
在C++中经常使用回调函数,下面看一段代码:0x30001009 mov ecx, dword [esp + 0xc]0x3000100D mov edx, dword [esp + 8]0x30001011 push ecx0x30001012 mov ecx, dword [esp + 8]0x30001016 push edx0x30001017 push ecx0x30001018 call eax从前面的代码已经知道,...
2021-04-18 23:02:48
582
原创 逆向工程学习笔记(16):test条件跳转
X86下经常使用test+je指令来完成跳转。0x30001005 test eax, eax0x30001007 je 0x3000101atest 指令用于两个操作数的按位AND运算,并根据结果设置标志寄存器,结果本身不会写回到目的操作数。上面两行的用法是用来测试寄存器是否为0: 寄存器为0, 则ZF零标志为1, 则跳转因此对于上面的代码块,很容易得到对应的C++代码:If块中的代码没有完全解析出来,留待明天吧。...
2021-04-16 00:07:38
560
1
原创 逆向工程学习笔记(15):__stdcall简单验证
在vs2017下简单验证__stdcall调用时的出入栈方式,win32平台,Release,关闭帧变量的生成。 void __stdcall test() 测试函数: void __stdcall test() { return; }汇编代码:调用者: int __stdcall test() 测试函数: int __stdcall test() { return 1;...
2021-04-15 00:00:24
425
原创 逆向工程学习笔记(14):验证
在VS2017下编译此函数,查看汇编:可以看到,在默认的编译参数下,VS2017引入了ebp并入栈,因此输入参数的偏移量由4变成了8。关闭VS2017编译器中创建帧指针的功能:这里/Oy参数默认是不启用的,在此将之改为是。再次编译并查看汇编:比较原汇编:; void __stdcall SetInternalErrorHandler(fnCallback113)0x30001020 mov eax, dword [esp + 4]0x30001024 ...
2021-04-14 00:25:26
292
原创 逆向工程学习笔记(13):回调函数的初始化
在函数中,使用了g_pInternalErrorHandler这一个全局变量,且地址为0x30004150。查询文件中的段定义:可知这个变量位于.rdata段,且这个段的文件偏移量为12288,根据文件偏移量读取全局变量的初始化值:再转换为C++的初始化语句:/* 0x30004150 */ extern fnCallback113 g_pInternalErrorHandler;/* 0x30004150 */fnCallback113 g_pInternalE..
2021-04-13 00:00:56
382
原创 逆向工程学习笔记(12):代码整理
通过前面的分析,我们可以得到此函数的逆向代码:void __stdcall SetInternalErrorHandler(fnCallback113 param1){ uint32_t esp_0 = 0; fnCallback113 eax_0 = 0; struct CStack_0x3000102...
2021-04-12 23:48:11
291
原创 逆向工程学习笔记(11):类型推断
类型推断即通过代码的组织形式,已知类型等可用信息对变量的类型进行推断。如在DegToRad函数中,使用fld指令0x40002040 fld qword [0x40003038]我们即可推断[0x40003038]这个全局变量的类型为double类型。在当前函数中,由于[esp + 4]这个局部变量来自于第一个参数,而第一个参数的类型为fnCallback113,因此可以推断[ESP + 4]这个局部变量的类型也为fnCallback113。但是在更多的代码中,并不存在这样一...
2021-04-11 23:41:05
271
原创 逆向工程学习笔记(10):栈的再思考
在DegToRad函数中,简单创建了一个Local_0x0004的局部变量来表示[esp + 4]。这种方式无法处理局部变量中使用结构体或者类的情况。换个角度看,数据在栈中的表示完成可以用一个结构体进行表示,这样可以避免编译器对局部变量进行重排,而不是从上到下的按顺序排列,同时还可以与后继结构体的分析共用代码。说做就做,对这部分代码进行一些修改,在逆向代码里栈变量就变成了: struct CStack_0x30001020...
2021-04-11 23:06:19
395
原创 逆向工程学习笔记(9):SetInternalErrorHandler
这个也是一个比较简单的函数:; void __stdcall SetInternalErrorHandler(fnCallback113)0x30001020 mov eax, dword [esp + 4]0x30001024 mov dword [0x30004150], eax0x30001029 ret 4原函数功能也就是设置一个错误处理的回调函数,具体实现就是将这个回调函数指针保存到一个全局变量中。与DegToRad相比,除了MOV指令外,这个函数其实并没...
2021-04-11 22:34:53
234
原创 逆向工程学习笔记(8):验证
将逆向得到的代码整理成可读性较好的代码:double __stdcall DegToRad(double param1){ /* 0x40002050 */ return D_PI * param1 * 0.00555555555555556;}在vs2017下进行编译,查看其生成的汇编:在Debug状态下:可以看到差异还是比较大的,这是因为在debug状态下没有使用FPU,且在前后插入了栈检查的代码。在release状态下:可以看到在vs2017下,D_P...
2021-03-31 00:23:38
265
原创 逆向工程学习笔记(7):ret 8
最后一条指令:0x40002050 ret 8因为是__stdcall,所以在返回指令中带上了栈的大小,8个字节。由于是返回double类型,因此我们直接将ST0中的结果返回: /* 0x40002050 */ return st0_2;最终逆向分析得到的C++代码:double __stdcall DegToRad(double param1){ double st0_0 = 0; uint32_t esp_0 = 0;...
2021-03-30 23:21:49
2398
原创 逆向工程学习笔记(6):fmul qword [0x40003050]
看下一条fmul指令:0x4000204A fmul qword [0x40003050]这条fmul指令的功能是将ST0寄存器里的数和一个指定地址里的数相乘,再将结果放入ST0寄存器。这里的ST0寄存器里的初值来自于上一条FMUL指令,因此沿用上一条指令创建的变量st0_1。再创建一个变量st0_2保存结果。这里引用到了地址[0x40003050],这个地址没有查找到对应的全局变量,因此这里的数可能是一个cpp文件中用static定义出来的全局变量,因为其作用域只在此cpp文件中...
2021-03-29 23:57:26
441
原创 逆向工程学习笔记(5):fmul qword [esp + 4]
接下来看fmul指令:0x40002046 fmul qword [esp + 4]功能很简单,将ST0寄存器里的数和栈中的数相乘,再将结果放入ST0寄存器。这里的ST0寄存器的值来自于上一条FLD指令,因此我们沿用上一条指令创建的st0_0寄存器表示原有的值,再新建一个变量st0_1来保存结果。再创建一个Local_0x0004的局部变量来表示[esp + 4]。因此这条汇编语句转换成C++就可以表示为: /* 0x40002046 */ st0_1 = st0_...
2021-03-29 23:29:35
560
原创 逆向工程学习笔记(4):fld指令
fld指令相对简单,就是将一个源操作数放到ST0寄存器里。对应到C++代码中,我们简单用一个局部变量st0_0来表示目标寄存器。对于源操作数,radare的反汇编指令直接查找到了一个全局变量[sym.D_PI],但对于逆向工程来说,我们的目标是得到C/C++代码,这点信息显然是不够的。我们看伪汇编代码:0x40002040 fld qword [0x40003038][0x40003038]这个地址是数据段的内容,可以直接从文件中读取内容。这8个字节直接转换为double类...
2021-03-29 00:10:14
1239
原创 逆向工程学习笔记(3):FPU基本操作
X87内部执行时可以使用8个80bit的数据寄存器及控制寄存器、状态寄存器等:对于这8个数据寄存器,X87是以栈的形式使用的:在其状态寄存器中使用了3个比特位以记录栈顶的位置。有入栈或者出栈时此指针进行移动,当超过8个数时进行循环覆盖。在intel的数据手册中很贴心的给出了一个计算的例子:第一条FLD指令将5.6这个立即数放入ST(0),图(a) FMUL指令将ST(0)中的数和2.4相乘得到结果13.44,并放入ST(0)中,图(b)。 同样的操作,指令3和指令4计算3.8
2021-02-26 23:35:29
543
原创 逆向工程学习笔记(2):出发--DegToRad
分析之路先从一个最简单的角度转弧度函数开始:; double __stdcall DegToRad(double)0x40002040 fld qword [sym.D_PI]0x40002046 fmul qword [esp + 4]0x4000204A fmul qword [0x40003050]0x40002050 ret 8很简单的一个函数。先百度下FPU:浮点运算器(英文:floating point unit,简称FPU)是计算机...
2021-02-26 22:24:03
399
原创 逆向工程学习笔记(1):前言
很长时间没更新了,回顾下没更新的这段时间,似乎掌握的技术也没有更新,太可怕了。失业了肿么办?据说人才市场对中年大叔极度不友好!!吓得我赶紧放下手机,打开电脑,干啥好呢????据说AI很热门,虽然学了半吊子图像处理,好难啊,想想还是算了……按说嵌入式开发不错,也算老本行了,其实从本质上看也十几年未变,似乎没啥挑战性。。。。。。再说了难道下班了还要处于工作状态?FPGA、硬件开发?就现在这环境,尤其是个人,似乎也没什么搞头。。。。。。……逆向工程吧?就它了!!!说不定站在前人
2021-02-26 21:43:05
486
原创 CodeSourcery G++编译器的BUG
在使用CodeSourcery的arm编译器进行DM6467内核开发时,遇到一个莫名其妙的空指针问题,出问题的代码是这样的:在这里连续两个printk中都输出了pdev->resouce的值,但是这两个printk里面的输出值是不一样的,第一个输出可以得到正常的指针值,但是第二个printk则会输出null空指针!用仿真器连过去看了一下反汇编的结果:连续两个prink产
2017-09-27 22:55:01
2838
原创 在ccs7下进行DM6467的开发(6):编译驱动模块
编译驱动模块和编译内核其实大同小异,因为其都是Makefile类型的工程。首先创建一个Makefile类型的项目,并指向源码所在的位置,本文使用dvsdk中带的cmemk。在dvsdk中cmemk的Makefile引用了其顶层目录的Makefile,由于我们并不希望和庞大的DVSDK扯上关系,因此修改Makefile: #We conditionally include $(ROOTDIR)/Ru
2017-03-04 21:26:25
3624
原创 在ccs7下进行DM6467的开发(5):Linux内核编译
首先在ccs下创建一个Makefile工程:并将路径指向内核代码所在的路径:创建完成后是这个样子的:接着配置交叉编译的环境,打开项目属性:这两个参数将传递给make命令。再把交叉编译器的路径添加到PATH列表中。最后修改一下生成的目标:经过这些简单的配置,就可以很方便地在CCS里面编译内核了,在发生错误的时候也可以快速定位到错误的位置,太赞了!!
2017-03-04 10:29:32
3213
原创 在ccs7下进行DM6467的开发(4):实用的代码分析与编写
在创建完工程后,可以发现有时候由于工程中的代码过多,代码分析特别慢,但是我们通常也不会参考到所有的代码,因此将不需要使用的目录排除在代码分析之外可以大大加快代码分析的速度。首先在不需要分析的目录上右键并选择Exclude from build。接着更改项目的配置:经此更改,可以发现ccs分析代码的速度加快了许多!!在代码的智能提示上,eclipse也提供了一些相当不错的功能。虽然感觉仍然比不上vs
2017-03-04 10:06:04
3460
原创 在ccs7下进行DM6467的开发(3):在Linux下连接仿真器
本节尝试在Linux下通过仿真器连接6467开发板。首先新建一个配置。配置好GEL文件:连接仿真器:一切顺利!!
2017-03-02 00:31:09
3307
原创 在ccs7下进行DM6467的开发(2):在Linux下安装ccs
突然觉得在windows下用远程make的方式有点不爽,于是准备看看Linux下ccs7的表现。说干就干,直接在vmware下装了ubutu14,按照官方的说明先安装glibc的32位版本:整个安装过程很安静,完全不像装6.1.3时需要一大堆的库,赞一个!(原本是希望在RHEL上安装的,后来发现ccs7不支持,放弃了)和windows一样,要想支持dm6467的开发,需要从ccs app cent
2017-03-01 23:41:44
3899
原创 在ccs7下进行DM6467的开发(1):测试工程
本文将学习在ccs7下进行DM6467开发的方法。安装编译器在安装ccs7时安装了一个v8.1版本的编译器,可恶的是这个版本的编译器居然不支持dm6467的开发,必须从CCS App Center下载7.x版本的编译器才行:好大一个坑,差点退回去装低版本的CCS了!!接着创建一个CCS工程:ccs自动创建了两个工程:编译,启动调试,发生错误:由于这是裸机调试,需要在GEL文件中进行初始化。打开工程
2017-02-28 23:31:02
4047
原创 在ccs7下编译Linux内核
本文尝试在ccs7下编译DVS6467T的Linux内核。首先将内核源码文件通过samba共享出来。这个目录在Linux下看起来是:/work/projects/kernel/将这个目录共享给windows,在windows下的访问路径是Z:\projects\kernel在ccs下建立一个makefile工程:Next将着在Linux上创建一个编译内核的脚本文件:[embed@localhost
2017-02-26 22:23:47
4092
原创 用仿真器解决Linux内核加载问题
快乐虾http://blog.csdn.net/lights_joy/欢迎转载,但请保留作者信息在使用合众达DVS6467T开发板时遇到一个问题,在内核选项中加上initramfs的支持,结果在bootm时内核加载失败:## Booting image at 8e000000 ... Image Name: Linux-2.6.10_mvl401-davinci_evm- Image
2017-02-25 23:35:26
3161
原创 初试合众致达XDS220U仿真器
有段时间没有使用仿真器这种东西了,近日由于项目需要,又把以前合众达的XDS560仿真器翻了出来,忽然发现这世界变化太快了,这个老古董已经跟不上时代了。在WIN10下完全无法使用。果断抛弃它,新入手一个合众致达的XDS220U仿真器:接下来装ccs7,说到这里就有点郁闷,两台电脑,同样的WIN10 x64,一台装的很顺利,另一台安装完成后运行时就闪退,差点就准备重装系统了。折腾了一番,最后发现问题出
2017-02-25 14:26:16
4971
原创 python开始抱vs2015的大腿??
近日有空将python升级到了V3.5.2,突然发现python和vs2015的结合越来越紧密了!!嘿,居然可以自动下载用于vs2015的调试符号表了!!安装时保证网络畅通。装完以后自动在VS2015下创建了python3.5.2的配置!太牛逼了!但是还需要更新一下python库以利于vs2015对python进行智能提示。开个交互窗口:
2016-11-29 21:30:52
5306
8
原创 Velt中的编译参数检测
VELT的全称是Visual EmbedLinuxTools,它是一个与visual gdb类似的visual studio插件,用以辅助完成Linux开发。利用这个插件,将可以在visual studio的IDE中进行Linux应用程序的开发(包括编译和调试),也可以进行uboot和linux内核的编译,并根据编译时的错误信息正确定位到源码。目前的版本是0.2.9,支持vs2012/vs2013
2016-08-22 23:22:09
3100
原创 Visual EmbedLinux Tools 0.2.9:让vs2013支持更多语言的语法高亮
VELT的全称是Visual EmbedLinuxTools,它是一个与visual gdb类似的visual studio插件,用以辅助完成Linux开发。利用这个插件,将可以在visual studio的IDE中进行Linux应用程序的开发(包括编译和调试),也可以进行uboot和linux内核的编译,并根据编译时的错误信息正确定位到源码。目前的版本是0.2.9,支持vs2012/vs2013
2016-08-02 23:51:21
3944
原创 让vs2013支持Makefile语法高亮
vs2013并不支持Makefile, bash脚本之类的语法高亮,更别提IntelliSense了。幸运的是,我们有Scintilla这一神器,本文尝试在vs2013中集成Scintilla,使vs也可以对Makefile进行语法高亮。首先用vs2013的向导生成一个编辑器的插件,估且叫做velt编辑器吧。在自动生成的代码中,使用了RichEditCtrl做为代码显示的控件,我们直接替换掉它。由
2016-08-01 22:40:56
4824
原创 用vs2013+velt 进行 stm32 开发小结
花了两周时间,用velt+openjtag完成了一个STM32+NRF2401的无线数据采集项目,小结一下。整个系统结构如下: 1、不知道是不是gdb和openocd之间版本不太兼容的缘故,gdb经常会挂起,稳定性不佳。2、vs2013这个前端比起IAR要好用太多了,编码效率要高很多。3、vs2013+velt调用gcc进行代码编译的稳定性
2016-07-17 00:01:34
4945
原创 Visual EmbedLinux Tools 0.2.8
VELT的全称是Visual EmbedLinuxTools,它是一个与visual gdb类似的visual studio插件,用以辅助完成Linux开发。利用这个插件,将可以在visual studio的IDE中进行Linux应用程序的开发(包括编译和调试),也可以进行uboot和linux内核的编译,并根据编译时的错误信息正确定位到源码。目前的版本是0.2.7,支持vs2012/vs2013
2016-07-03 16:27:40
3714
原创 VELT-0.2.8对STM32开发的支持(4):链接与调试
VELT的全称是Visual EmbedLinuxTools,它是一个与visual gdb类似的visual studio插件,用以辅助完成Linux开发。利用这个插件,将可以在visual studio的IDE中进行Linux应用程序的开发(包括编译和调试),也可以进行uboot和linux内核的编译,并根据编译时的错误信息正确定位到源码。目前的版本是0.2.7,支持vs2012/vs2013
2016-06-27 00:18:16
3685
原创 VELT-0.2.8对STM32开发的支持(3):启动代码
VELT的全称是Visual EmbedLinuxTools,它是一个与visual gdb类似的visual studio插件,用以辅助完成Linux开发。利用这个插件,将可以在visual studio的IDE中进行Linux应用程序的开发(包括编译和调试),也可以进行uboot和linux内核的编译,并根据编译时的错误信息正确定位到源码。目前的版本是0.2.7,支持vs2012/vs2013
2016-06-25 22:45:04
3756
原创 VELT-0.2.8对STM32开发的支持(2):代码编译
VELT的全称是Visual EmbedLinuxTools,它是一个与visual gdb类似的visual studio插件,用以辅助完成Linux开发。利用这个插件,将可以在visual studio的IDE中进行Linux应用程序的开发(包括编译和调试),也可以进行uboot和linux内核的编译,并根据编译时的错误信息正确定位到源码。目前的版本是0.2.7,支持vs2012/vs2013
2016-06-24 23:59:50
4026
原创 VELT-0.2.8对STM32开发的支持(1):准备工作
VELT的全称是Visual EmbedLinuxTools,它是一个与visual gdb类似的visual studio插件,用以辅助完成Linux开发。利用这个插件,将可以在visual studio的IDE中进行Linux应用程序的开发(包括编译和调试),也可以进行uboot和linux内核的编译,并根据编译时的错误信息正确定位到源码。目前的版本是0.2.7,支持vs2012/vs2013
2016-06-24 22:35:32
3877
Visual EmbedLinux Tools 0.2.9
2016-08-02
Visual EmbedLinux Tools 0.2.8
2016-07-03
Visual EmbedLinux Tools 0.2.7
2016-06-22
Visual EmbedLinux Tools 0.2.6
2016-06-07
Visual EmbedLinux Tools 0.2.5
2016-05-19
Visual EmbedLinux Tools 0.2.4
2016-05-11
Visual EmbedLinux Tools 0.2.3
2016-04-13
Visual EmbedLinux Tools 0.2.1
2015-11-18
Visual EmbedLinux Tools 0.2.0
2015-11-06
Visual EmbedLinux Tools 0.1.7
2015-10-10
python27-ns3
2015-07-07
Visual EmbedLinux Tools 0.1.6
2015-03-29
Visual EmbedLinux Tools-0.1.4
2015-02-06
Visual EmbedLinux Tools-0.1.3
2015-01-25
Visual EmbedLinux Tools-0.1.2
2015-01-13
Visual EmbedLinux Tools-0.1.1
2015-01-03
快乐虾的工具箱0.0.2
2009-09-29
在vs2008下编译uclinux内核:工程文件:vs-fs-1.0
2009-07-13
快乐虾的工具箱 0.0.1
2008-11-21
memsim_csdn_0.1
2008-08-04
bfin-uclinux-2008r1-csdn-2008-08-28.part08
2008-07-28
bfin-uclinux-2008r1-csdn-2008-08-28.part07
2008-07-28
bfin-uclinux-2008r1-csdn-2008-08-28.part06
2008-07-28
bfin-uclinux-2008r1-csdn-2008-08-28.part05
2008-07-28
bfin-uclinux-2008r1-csdn-2008-08-28.part04
2008-07-28
bfin-uclinux-2008r1-csdn-2008-08-28.part03
2008-07-28
bfin-uclinux-2008r1-csdn-2008-08-28.part02
2008-07-28
bfin-uclinux-2008r1-csdn-2008-08-28.part01
2008-07-28
uclinux-2008r1到vdsp5(bf561)的移植记录_v0.1
2008-07-28
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人