海哥牛逼

这里写自定义目录标题

  • 一、C语言如何变成汇编
    • 1、裸函数
  • 二、调用约定
    • 1、常见的几种调用约定
  • 三、程序的真正入口
  • 四、数据类型
    • 4.1 C语言中的数据类型
  • 作业

一、C语言如何变成汇编

1、裸函数

裸函数使用特殊方式定义,编译器和连接器并不会为其生成提升堆栈,开辟填充缓冲区和堆栈平衡等代码。

普通函数void Function() {}可以直接调用,并运行通过;而裸函数void __declspec(naked) Function() {}直接调用运行时不通过。

  • 这是因为前者编译器为其生成了返回的汇编代码,在函数运行结束时有ret汇编代码返回call调用前的下一跳地址;而后者没有编译器生成的返回代码,执行call时将下一跳地址入栈,但结束时没有ret指令返回,使得cpu执行到了int3或其他区域,进而报错。
无参无返回裸函数void __declspec(naked) Function() {__asm{ret}
}
或者
void __declspec(naked) Function() {__asm{//保留调用前的栈底push ebp//提升堆栈mov bep,espsub esp,0x40//保存现场push ebxpush esipush edi//填充缓冲区lea edi,dword ptr ds:[ebp-0x40]mov eax,0xCCCCCCCCmov ecx,0x10rep stosd//恢复现场pop edipop esipop ebx//降低堆栈mov esp,ebp//恢复栈底pop ebpret}
}有参有返回裸函数(参数在函数调用前使用push入栈,局部变量在缓冲区,返回值一般在eax)int __declspec(naked) Plus(int x, int y){__asm{//保留调用前的栈底push ebp//提升堆栈mov ebp,espsub esp,0x40//保存现场push ebxpush esipush edi//填充缓冲区lea edi,dword ptr ds:[ebp-0x40]mov eax,0xCCCCCCCCmov ecx,0x10rep stosd//函数的核心功能:参数执行计算过程mov eax,dword ptr ds:[ebp+0x8]add eax,dword ptr ds:[ebp+0xC]//恢复现场pop edipop esipop ebx//降低堆栈mov esp,ebp//恢复栈底pop ebpret}
}

二、调用约定

1、常见的几种调用约定

三、程序的真正入口

3.1 main 或WinMain 是“语法规定的用户入口”,而不是“应用程序入口”。应用程序入口通常是启动函数。

3.2 使用vc6的堆栈调查查看

mainCRTStartup 和 wmainCRTStartup 是控制台环境下多字节编码和Unicode 编码的启动函数.
而WinMainCRTStartup 和wWinMainCRTStartup 是windows 环境下多字节编码和Unicode 编码的启动函数.
3.2 修改入口函数:项目右键->Setting

但是并不能这样修改,因为mainCRTStartup 做了很多的初始化工作。
main函数在被调用前,首先要使用以下函数进行初始化:


这些函数调用结束后就会调用main 函数,根据main 函数调用的特征,将3 个参数压入栈内作为函数的参数。
编译器在调用main时,传入了三个参数

四、数据类型

4.1 C语言中的数据类型

作业

作业1:

int __declspec(naked) Plus(int x, int y, int z){__asm{//函数调用前x,y,z已经按照从右往左的顺序入栈//保留调用前的栈底push ebp//提升堆栈mov ebp,espsub esp,0x40//保存现场push ebxpush esipush edi//填充缓冲区lea edi,dword ptr ds:[ebp-0x40]mov eax,0xCCCCCCCCmov ecx,0x10rep stosd//函数的核心功能:参数执行计算过程//先将局部变量2,3,4放入缓冲区mov dword ptr ds:[ebp-0x04],0x02mov dword ptr ds:[ebp-0x08],0x03mov dword ptr ds:[ebp-0x0C],0x04//进行加法运算(ebp+4是函数返回地址)mov eax,dword ptr ds:[ebp+0x8]  //往eax中填入zadd eax,dword ptr ds:[ebp+0xC]  //eax=z+yadd eax, dword ptr ds:[ebp+0x10]  //eax=z+y+xadd eax,dword ptr ds:[ebp-0xC]   //eax=z+y+x+0x02add eax,dword ptr ds:[ebp-0x08]   //eax=z+y+x+0x02+0x03add eax,dword ptr ds:[ebp-0x04]   //eax=z+y+x+0x02+0x03+0x04//恢复现场pop edipop esipop ebx//降低堆栈mov esp,ebp//恢复栈底pop ebpret}
}

作业2:

将float的12.5转换为16进制
1、整数部分:
12  --->  11002、小数部分:
0.5  --->  0.5*2=1  13、1100.1   --->   1.1001 * 2的3次方,即指数为34、转为二进制完整格式
0   10000010    10010000000000000000000
即:
0100 0001 0100 1000 0000 0000 0000 0000
4    1    4    8    0    0    0    0
41 48 00 00

作业3:
1、寻找函数入口:push了3个参数+外平栈,可以推断使用的默认的__cdecl

2、追寻call进入函数,找到需要逆向的区域,一共五个参数,3个内存区,2个寄存器,显然是__fastcall


3、画函数调用的汇编图


可以得出该函数核心功能为f2(f1(0x01+0x03+0x04)+f2(0x01+0x03))=0x0C
其中f1为__stdcall,f2为__cdecl

4、C语言代码是

int __cdecl F2(int x, int y){return x + y;
}
int __stdcall F1(int x, int y, int z){return x + y + z;
}
int __fastcall F(int a, int b, int c, int d, int e){return F2(F1(a, b, c), F2(a, b));
}
int main(int argc, char* argv[]){F(1, 3, 4, 6, 7);return 0;
}

海哥牛逼

滴水逆向三期笔记与作业——02C语言——02数据类型相关推荐

  1. 静态链接库,动态链接库【滴水逆向三期48笔记】

    在开发过程中,我们通常会有很多函数,需要多次使用或在不同的程序中使用该函数,也有可能我们会将我们写好的函数给别人使用,但是我们又不想给他源代码,毕竟代码是我们花了很多功夫写出来的,那么我们如何不发给其 ...

  2. 滴水逆向三期实践1:PE头字段解析,附PE结构下载

    视频资源详见网盘搜索 或 在线的B站滴水逆向三期 其课件也能在CSDN或百度搜索到,以下部分为课件内容摘要,部分为自己的理解 最后附上详细注释的自写代码 PE(Portable Executable) ...

  3. 导入表解析,IAT表解析【滴水逆向三期53笔记】

    我们再上一章节简要介绍了IAT表,我们知道如果程序调用dll中的函数时,必须通过IAT表来找到函数,我们基本了解了IAT表之后,我们今天来讲解一下导入表,通过本章节的学习,我们可以了解导入表,也能对I ...

  4. IAT表入门简析【滴水逆向三期52笔记】

    在讲IAT表之前,我们来回忆一下之前学习的知识: 如果我们将函数写在程序的源文件中,那么该函数就会被编译器直接编译到程序的二进制文件中,在程序调用该函数的时候,E8后跟的地址是直接写死的,程序直接在e ...

  5. 滴水逆向三期 win10 ASLR UnmapViewOfSection傀儡进程 加密壳项目

    特意加了一个win10标题, 碰到0xc0000005的朋友就不要再浪费时间了, 我在这个问题上花了整整一天 网上全是xp的代码, 搜到了了几个win10的也是同样的错误没法解决, 唯一一个有用的答案 ...

  6. 滴水逆向学习笔记 -2-

    目录 堆栈图(2) 相关概念 堆栈图 C语言 堆栈图(2) 相关概念 函数: 计算机中的函数是一个固定的一个程序段,或称其为一个子程序,它在可以实现固定运算功能的同时还带有一个入口和一个出口,所谓的入 ...

  7. 滴水逆向三期实践10:动态链接库

    使用静态链接生成的可执行文件体积较大,造成浪费 我们常用的printf.memcpy.strcpy等就来自这种静态库 有维护性问题.不方便修改库中实现,修改后所有使用静态库的都要重新链接一遍 因为静态 ...

  8. 滴水逆向三期和中级和高期教程

    联系本人QQ747554937 原版视频,海哥教学视频,不是网页上的介绍视频

  9. 滴水逆向学习笔记 -1-

    目录 一.进制 N进制的定义 二.数据宽度_逻辑运算 数据宽度 逻辑运算 三.通用寄存器_内存读写 寄存器 内存 四.内存地址_堆栈 内存地址 堆栈 五.标志寄存器 举案例引知识 标志寄存器 相关指令 ...

最新文章

  1. JS中全局对象的属性和方法
  2. Boost.SmartPtr 的快速 (CI) 测试
  3. 【已解决】IDEA:Cannot start compiler:the SDK is not specified for module...
  4. NSOperationQueue线程队列完毕finished状态检测
  5. mysql 查询语句性能优化
  6. leetcode1085. 最小元素各数位之和 py不止是字符串的神!
  7. php 流(Stream)
  8. 小区移动基站安全吗?会杀人于无形吗?
  9. html基礎之渐变属性(斑马线)
  10. linux与windows文件共享——samba
  11. Python 通过打码平台实现验证码
  12. 为激励英特尔建厂 美国俄亥俄州拿出20亿美元优惠政策
  13. 2022-2028全球昼夜节律性睡眠障碍行业调研及趋势分析报告
  14. 彩扩机项目--两个状态指示灯,巧妙的使用二极管的特性,以及物理按键的滤波...
  15. 【算法】滴滴-2021校招在线笔试0913 X星文
  16. 使用朴素贝叶斯进行个人信用风险评估
  17. 用python实现成绩录入
  18. 图解apk的打包过程
  19. 数字图像处理:图像金字塔
  20. css 2713,CSS3 梅花花瓣

热门文章

  1. 微服务+微信小程序实现社区服务
  2. Unity人物角色动画系统学习总结
  3. 4. 自动封IP和解IP
  4. IntelliJ IDEA设置方法注释模板并解决入参和返回值为空问题
  5. 最近玩喂喂我的小仓鼠吧,玩上瘾了……
  6. Spring 项目中applicationContext.xml模板
  7. 路由器设备选型参照天梯
  8. postman传图片
  9. 商家开通直播前需了解哪些市场数据?
  10. windows 查看/清除DNS解析记录