C/C++
嵌云阁主
参与从系统设计到硬件调试和软件编码每一过程的工作
展开
-
逆向工程学习笔记(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 · 434 阅读 · 0 评论 -
逆向工程学习笔记(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 · 470 阅读 · 0 评论 -
逆向工程学习笔记(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 · 505 阅读 · 0 评论 -
逆向工程学习笔记(16):test条件跳转
X86下经常使用test+je指令来完成跳转。0x30001005 test eax, eax0x30001007 je 0x3000101atest 指令用于两个操作数的按位AND运算,并根据结果设置标志寄存器,结果本身不会写回到目的操作数。上面两行的用法是用来测试寄存器是否为0: 寄存器为0, 则ZF零标志为1, 则跳转因此对于上面的代码块,很容易得到对应的C++代码:If块中的代码没有完全解析出来,留待明天吧。...原创 2021-04-16 00:07:38 · 496 阅读 · 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 · 383 阅读 · 0 评论 -
逆向工程学习笔记(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 · 249 阅读 · 0 评论 -
逆向工程学习笔记(13):回调函数的初始化
在函数中,使用了g_pInternalErrorHandler这一个全局变量,且地址为0x30004150。查询文件中的段定义:可知这个变量位于.rdata段,且这个段的文件偏移量为12288,根据文件偏移量读取全局变量的初始化值:再转换为C++的初始化语句:/* 0x30004150 */ extern fnCallback113 g_pInternalErrorHandler;/* 0x30004150 */fnCallback113 g_pInternalE..原创 2021-04-13 00:00:56 · 333 阅读 · 0 评论 -
逆向工程学习笔记(12):代码整理
通过前面的分析,我们可以得到此函数的逆向代码:void __stdcall SetInternalErrorHandler(fnCallback113 param1){ uint32_t esp_0 = 0; fnCallback113 eax_0 = 0; struct CStack_0x3000102...原创 2021-04-12 23:48:11 · 243 阅读 · 0 评论 -
逆向工程学习笔记(11):类型推断
类型推断即通过代码的组织形式,已知类型等可用信息对变量的类型进行推断。如在DegToRad函数中,使用fld指令0x40002040 fld qword [0x40003038]我们即可推断[0x40003038]这个全局变量的类型为double类型。在当前函数中,由于[esp + 4]这个局部变量来自于第一个参数,而第一个参数的类型为fnCallback113,因此可以推断[ESP + 4]这个局部变量的类型也为fnCallback113。但是在更多的代码中,并不存在这样一...原创 2021-04-11 23:41:05 · 222 阅读 · 0 评论 -
逆向工程学习笔记(10):栈的再思考
在DegToRad函数中,简单创建了一个Local_0x0004的局部变量来表示[esp + 4]。这种方式无法处理局部变量中使用结构体或者类的情况。换个角度看,数据在栈中的表示完成可以用一个结构体进行表示,这样可以避免编译器对局部变量进行重排,而不是从上到下的按顺序排列,同时还可以与后继结构体的分析共用代码。说做就做,对这部分代码进行一些修改,在逆向代码里栈变量就变成了: struct CStack_0x30001020...原创 2021-04-11 23:06:19 · 335 阅读 · 0 评论 -
逆向工程学习笔记(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 · 181 阅读 · 0 评论 -
逆向工程学习笔记(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 · 225 阅读 · 0 评论 -
逆向工程学习笔记(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 · 2283 阅读 · 0 评论 -
逆向工程学习笔记(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 · 354 阅读 · 0 评论 -
逆向工程学习笔记(1):前言
很长时间没更新了,回顾下没更新的这段时间,似乎掌握的技术也没有更新,太可怕了。失业了肿么办?据说人才市场对中年大叔极度不友好!!吓得我赶紧放下手机,打开电脑,干啥好呢????据说AI很热门,虽然学了半吊子图像处理,好难啊,想想还是算了……按说嵌入式开发不错,也算老本行了,其实从本质上看也十几年未变,似乎没啥挑战性。。。。。。再说了难道下班了还要处于工作状态?FPGA、硬件开发?就现在这环境,尤其是个人,似乎也没什么搞头。。。。。。……逆向工程吧?就它了!!!说不定站在前人原创 2021-02-26 21:43:05 · 429 阅读 · 0 评论 -
vs2008下C++对象内存布局(1)
快乐虾http://blog.csdn.net/lights_joy/lights@hb165.com 本文适用于Xp sp3Vs2008 欢迎转载,但请保留作者信息 近日,因为调试cygwin.dll出了点状况,与C++对象的内存布局有关,故此决定先看看vs2008对C原创 2009-09-09 11:08:00 · 5785 阅读 · 9 评论 -
vs2008下C++对象内存布局(2):简单继承
快乐虾http://blog.csdn.net/lights_joy/lights@hb165.com 本文适用于Xp sp3Vs2008 欢迎转载,但请保留作者信息 这次我们添加一个子类,父类和子类均不带虚函数:class CParent{public:原创 2009-09-09 15:15:00 · 3116 阅读 · 3 评论 -
cygwin关键技术:cygheap
快乐虾http://blog.csdn.net/lights_joy/lights@hb165.com 本文适用于Cygwin checkout-2008-09-28vs2008 欢迎转载,但请保留作者信息 cygheap是cygwin中使用的一项关键技术,通过自己定义的原创 2009-09-02 21:52:00 · 2794 阅读 · 1 评论 -
xp下用户程序空间分配(9):还剩下什么?
快乐虾http://blog.csdn.net/lights_joy/lights@hb165.com 本文适用于Xp sp3vs2008 欢迎转载,但请保留作者信息 在去除前面的部分后,看看内存里还剩下什么:基址分配基址分原创 2009-08-29 18:39:00 · 2185 阅读 · 0 评论 -
xp下用户程序空间分配(8):MEM_MAPPED
快乐虾http://blog.csdn.net/lights_joy/lights@hb165.com 本文适用于Xp sp3vs2008 欢迎转载,但请保留作者信息 在去除前面的那些东西之后,我们的内存块里面还有一堆MEM_MAPPED的内容,就像这样的块:原创 2009-08-29 11:48:00 · 3033 阅读 · 0 评论 -
xp下用户程序空间分配(7):Heap
快乐虾http://blog.csdn.net/lights_joy/lights@hb165.com 本文适用于Xp sp3vs2008 欢迎转载,但请保留作者信息 我们都知道在程序里可以使用malloc在堆上分配内存,显然windows应该为这个Heap分配一块空间的原创 2009-08-28 22:44:00 · 1734 阅读 · 0 评论 -
xp下用户程序空间分配(6):加载用户DLL
快乐虾http://blog.csdn.net/lights_joy/lights@hb165.com 本文适用于Xp sp3vs2008 欢迎转载,但请保留作者信息 在本项目里使用了自行编译的一个DLL—cywin.dll,这个DLL占用的内存块出奇的多:原创 2009-08-28 07:30:00 · 1761 阅读 · 0 评论 -
xp下用户程序空间分配(5):加载系统DLL
快乐虾http://blog.csdn.net/lights_joy/lights@hb165.com 本文适用于Xp sp3vs2008 欢迎转载,但请保留作者信息 ntdll.dll是加载的第一个系统DLL,它的模块信息:名称基址大小入口点E:/WINDOWS/s原创 2009-08-27 13:20:00 · 2150 阅读 · 0 评论 -
xp下用户程序空间分配(4):加载主程序
快乐虾http://blog.csdn.net/lights_joy/lights@hb165.com 本文适用于Xp sp3vs2008 欢迎转载,但请保留作者信息 这个是主程序,它的模块信息:名称基址大小入口点f:/embed/etools/D原创 2009-08-27 10:46:00 · 2175 阅读 · 0 评论 -
CreateProcess所需要的最少环境变量
关于CreateProcess,在MSDN里面有比较详细的文档,但是关于其中的lpEnvironment参数却语焉不详,它只是告诉我们这个参数该以什么形式使用,但是对于这个参数可以传递的内容却闭口不谈,那么什么样的环境变量是必须传递的,什么是不可以传递的呢?本文就此做一番讨论。当然,你大可将这个参数设置为NULL,那也就没必要再往下看了。1.1 正常情况下的环境变量Windows提供原创 2009-09-21 16:08:00 · 4380 阅读 · 1 评论 -
xp下用户程序空间分配(3):加载文件
快乐虾http://blog.csdn.net/lights_joy/lights@hb165.com 本文适用于Xp sp3vs2008 欢迎转载,但请保留作者信息 一个程序要想执行,总是要加载到内存里面的,为此我们使用下面的代码查询所有模块的信息,再找到它们在内存里面的对应位置: HANDLE hProcess;原创 2009-08-26 11:57:00 · 1957 阅读 · 1 评论 -
vs2008下C++对象内存布局(3):加上虚函数
快乐虾http://blog.csdn.net/lights_joy/lights@hb165.com 本文适用于Xp sp3Vs2008 欢迎转载,但请保留作者信息 这次我们为父类加上虚函数:class CParent{public: int p原创 2009-09-10 14:10:00 · 6662 阅读 · 8 评论 -
C++构造函数的幕后工作
快乐虾http://blog.csdn.net/lights_joy/lights@hb165.com 本文适用于Xp sp3Vs2008 欢迎转载,但请保留作者信息 多年前学习C++的时候就知道每个类都有一个默认的构造函数,但是为什么要有这样的规则却一直不求甚解,汗一个原创 2009-09-13 16:17:00 · 11333 阅读 · 31 评论 -
vs2008下C++对象内存布局(4):多重继承
快乐虾http://blog.csdn.net/lights_joy/lights@hb165.com 本文适用于Xp sp3Vs2008 欢迎转载,但请保留作者信息 这回我们考虑多重继承的情况:class CParentA{public: int原创 2009-09-11 10:05:00 · 2205 阅读 · 0 评论 -
在gcc下模拟bfin-uclinux的内存管理(1):基本思想
快乐虾http://blog.csdn.net/lights_joy/lights@hb165.com 本文适用于ADI bf561 DSP优视BF561EVB开发板uclinux-2008r1-rc8 (移植到vdsp5)Visual DSP++ 5.0 cygwin gcc 3.4.4 codeblocks 8 欢迎转载,但请保留作者信息原创 2008-08-01 23:27:00 · 1644 阅读 · 0 评论 -
Vs2012在Linux开发中的应用(2):方案设计
1.1 代码提示功能在vs中开发中,Visual Assist是一个非常优秀的插件,我们仍然可以使用它进行代码的分析,但它只能支持vcxproj工程,因而我们选择对vcxproj的工程进行扩展,这样VisualAssist就可以正常使用了。此外,VS的智能感知不支持GCC的一些扩展,在做代码分析的时候可能出错,我们采用强制包含头文件的方式解决一部分问题:注意,这个文件的目的原创 2014-11-17 21:04:49 · 2886 阅读 · 0 评论 -
几个常见的图像操作类及其数据转换(1):前言
在图像处理中,经常会用到一些别人的库,如MFC,wxWidgets,OpenCV,VTK等等,这些库基本上都定义了自己的数据格式,有时候我们需要在几种不同的数据格式之间进行转换,本文希望对此进行一些简单的分析。本文欢迎转载,但请注明出处,谢谢!原创 2014-05-21 23:07:54 · 1390 阅读 · 0 评论 -
VC程序的SECTION(3):.text
快乐虾http://blog.csdn.net/lights_joy/lights@wo.com.cn 本文适用于Xp sp3 / Vs2008 欢迎转载,但请保留作者信息 这个节看起来很容易理解,不就是存放代码的嘛,看看头信息:SECTION HEADER #2 .tex原创 2011-08-18 00:04:35 · 2773 阅读 · 1 评论 -
VC应用程序中的SECTION(2): .textbss
快乐虾http://blog.csdn.net/lights_joy/lights@hb165.com 本文适用于Xp sp3 / Vs2008 欢迎转载,但请保留作者信息 1.1.1 节的基本信息使用dumpbin可以看到这一节的基本信息:SECTION HEADER #1原创 2011-08-04 00:46:28 · 3173 阅读 · 1 评论 -
VC应用程序中的SECTION(1):准备工作
简单学习验证一下VS2008下生成的程序的SECTION原创 2011-08-03 22:16:18 · 2064 阅读 · 0 评论 -
vs2008与gcc在union初始化上的差异
在GCC下,如果要初始化一个union很简单,像这样的一个union:union un{ int a; struct _s {int sa, sb;} s; void *p;};要在GCC下对它进行初始化,只要这样: un x = { p: NULL };即它可以直接指定要对哪个成员赋值原创 2009-09-18 09:11:00 · 3605 阅读 · 0 评论 -
vs2008的基本运行时检查
快乐虾http://blog.csdn.net/lights_joy/lights@hb165.com 本文适用于Xp sp3Vs2008 欢迎转载,但请保留作者信息 vs2008提供了一个叫/RTC的选项,用以控制编译器是否进行运行时检查,这个选项在C/C+原创 2009-09-16 12:55:00 · 7155 阅读 · 4 评论 -
vs2008下C++对象内存布局(6):指向成员函数的指针
快乐虾http://blog.csdn.net/lights_joy/lights@hb165.com 本文适用于Xp sp3Vs2008 欢迎转载,但请保留作者信息 Vs支持指向成员函数的指针,沿用上文中的类进行试验:class CParentA{publi原创 2009-09-11 16:37:00 · 8222 阅读 · 8 评论 -
vs2008下C++对象内存布局(5):vtbl
快乐虾http://blog.csdn.net/lights_joy/lights@hb165.com 本文适用于Xp sp3Vs2008 欢迎转载,但请保留作者信息 再看看vtbl的其它内容,先写段代码:class CParent{public:原创 2009-09-11 13:55:00 · 2157 阅读 · 0 评论 -
xp下用户程序空间分配(2):栈
快乐虾http://blog.csdn.net/lights_joy/lights@hb165.com 本文适用于Xp sp3vs2008 欢迎转载,但请保留作者信息 每个线程都有自己的栈空间,这个空间大小是在CreateThread时指定的,而主线程的栈则是由xp在创建原创 2009-08-26 10:26:00 · 2276 阅读 · 2 评论