edx

汇编语言GetLastError和FormatMessage函数:获取错误信息

余生颓废 提交于 2021-01-04 10:15:50
若 Windows API 函数返回了错误值 ( 如 NULL),则可以调用 API 函数 GetLastError 来获取该错误的更多信息。该函数用 EAX 返回 32 位整数错误码: .datamessageId DWORD ?.codecall GetLastErrormov messageId,eax MS-Windows 有大量的错误码,因此,程序员可能希望得到一个消息字符串来对错误进行说明。要想达到这个目的,就调用函数 FormatMessage: FormatMessage PROTO, ;格式化消息 dwFlags:DWORD, ;格式化选项 lpSource:DWORD, ;消息定义的位置 dwMsgID:DWORD, ;消息标识符 dwLanguageID:DWORD, ;语言标识符 lpBuffer:PTR BYTE, ;缓冲区接收字符串指针 nSize:DWORD, ;缓冲区大小 va_list: DWORD ;参数列表指针 该函数的参数有点复杂,程序员需要阅读 SDK 文档来了解全部信息。下面简要列出了最常用的参数值。除了 lpBuffer 是输出参数外,其他都是输入参数: 1) dwFlags 保存格式化选项的双字整数,包括如何解释参数 lpSource。它规定怎样处理换行,以及格式化输出行的最大宽度。建议值为 FORMAT_MESSAGE

[安全攻防进阶篇] 九.熊猫烧香病毒机理IDA和OD逆向分析(上)

自作多情 提交于 2020-12-10 16:58:56
如果你想成为一名逆向分析或恶意代码检测工程师,或者对系统安全非常感兴趣,就必须要认真分析一些恶意样本。熊猫烧香病毒就是一款非常具有代表性的病毒,当年造成了非常大的影响,并且也有一定技术手段。本文将详细讲解熊猫烧香的行为机理,并通过软件对其功能行为进行分析,这将有助于我们学习逆向分析和反病毒工作。后续作者还将对其进行逆向调试,以及WannaCry勒索蠕虫、各种恶意样本及木马的分析。基础性文章,希望您喜欢! IDA和OD作为逆向分析的“倚天剑和“屠龙刀”,学好它们的基本用法至关重要。本文重点分析熊猫烧香病毒的功能函数,大家掌握这些技巧后才能更好地分析更多的代码。同时,本文部分实验参考姜晔老师的视频分析,真的非常佩服和值得去学习的一位老师。技术路上哪有享乐,为了提升安全能力,别抱怨,干就对了~ 从2019年7月开始,我来到了一个陌生的专业——网络空间安全。初入安全领域,是非常痛苦和难受的,要学的东西太多、涉及面太广,但好在自己通过分享100篇“网络安全自学”系列文章,艰难前行着。感恩这一年相识、相知、相趣的安全大佬和朋友们,如果写得不好或不足之处,还请大家海涵! 接下来我将开启新的安全系列,叫“安全攻防进阶篇”,也是免费的100篇文章,作者将更加深入的去研究恶意样本分析、逆向分析、内网渗透、网络攻防实战等,也将通过在线笔记和实践操作的形式分享与博友们学习,希望能与您一起进步,加油~

攻防世界-Reverse-Hellp,CTF

╄→尐↘猪︶ㄣ 提交于 2020-11-21 04:48:37
拿到一个.exe的文件,还是peid看一下,嗯,无壳,直接od 单步跟踪到此,要求输入flag,我们输入abcd 然后出现字符串的对比,如果超了会直接over的,对于repne scas byte ptr es:[edi]我也写了篇小博客来说明 继续向下走,出现循环,是把输入的字符进行ASCII转换存入堆栈和edx 向下走一步就看见一串ASCII,没有大于f的字母,先转换一下进制看看有木有用, http://www.ab126.com/goju/1711.html ok,确实是flag 来源: oschina 链接: https://my.oschina.net/u/4159464/blog/3070669

__cdecl、__stdcall、__fastcall 与 __pascal 浅析

强颜欢笑 提交于 2020-11-06 07:57:07
call 指令与 retn 指令 首先我们得了解 CALL 和 RETN 指令的作用,才能更好地理解调用规则,这也是先决条件。 实际上,CALL 指令就是先将下一条指令的 EIP 压栈,然后 JMP 跳转到对应的函数的首地址,当执行完函数体后,通过 RETN 指令从堆栈中弹出 EIP,程序就可以继续执行 CALL 的下一条指令。 __cdecl 与 __stdcall 调用规则 C/C++ 中不同的函数调用规则会生成不同的机器代码,产生不同的微观效果,接下来让我们一起来浅析四种调用规则的原理和它们各自的异同。首先我们通过一段 C 语言代码来引导我们的浅析过程。 这里我们编写了三个函数,它们的功能都是返回两个参数的相加结果,只是每个函数都有不一样的调用规则。 我们使用 printf 函数主要是为了在 OllyDBG 中能够快速下断点,以确定后边调用三个函数的位置,便于分析。在这里我给每个函数都用了内联的 NOP 指令来分隔开,图中也用红框标明,这样可以便于区分每个函数的调用过程。通过一些简单的步骤,我们用 OllyDBG 查看了编译后代码的“真面目”。代码中有 4 个 CALL,第一个是 printf,我们不关心这个。后面三个分别是具有 __cdecl,__stdcall,__fastcall 调用规则的函数 CALL(这里我已经做了注释)。 在这里为了循序渐进,我们先介绍 _

Linux用户空间与内核空间(理解高端内存)

空扰寡人 提交于 2020-10-28 10:38:12
Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数据可能不在内存中。 Linux内核地址映射模型 x86 CPU 采用了段页式地址映射模型。 进程代码 中的地址为逻辑地址,经过段页式地址映射后,才真正访问物理内存。 段页式机制如下图。 Linux内核地址空间划分 通常 32位Linux内核 地址空间划分0~3G为用户空间,3~4G为内核空间。注意这里是32位内核地址空间划分,64位内核地址空间划分是不同的。 Linux内核高端内存的由来 当内核模块代码或线程访问内存时,代码中的内存地址都为逻辑地址,而对应到真正的物理内存地址,需要地址 一对一 的映射,如逻辑地址0xc0000003对应的物理地址为0×3,0xc0000004对应的物理地址为0×4,… …,逻辑地址与物理地址对应的关系为 物理地址 = 逻辑地址 – 0xC0000000 逻辑地址 物理内存地址 0xc0000000 0×0 0xc0000001 0×1 0xc0000002 0×2 0xc0000003 0×3 … … 0xe0000000 0×20000000 … … 0xffffffff 0×40000000 ?? 假 设按照上述简单的地址映射关系

Linux用户空间与内核地址空间

六月ゝ 毕业季﹏ 提交于 2020-10-28 09:29:02
Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数据可能不在内存中。 Linux内核地址映射模型 x86 CPU采用了段页式地址映射模型。进程代码中的地址为逻辑地址,经过段页式地址映射后,才真正访问物理内存。 段页式机制如下图。 Linux内核地址空间划分 通常32位Linux内核地址空间划分0~3G为用户空间,3~4G为内核空间。注意这里是32位内核地址空间划分,64位内核地址空间划分是不同的。 Linux内核高端内存的由来 当内核模块代码或线程访问内存时,代码中的内存地址都为逻辑地址,而对应到真正的物理内存地址,需要地址一对一的映射,如逻辑地址0xc0000003对应的物理地址为0×3,0xc0000004对应的物理地址为0×4,… …,逻辑地址与物理地址对应的关系为 物理地址 = 逻辑地址 – 0xC0000000 逻辑地址 物理内存地址 0xc0000000 0×0 0xc0000001 0×1 0xc0000002 0×2 0xc0000003 0×3 … … 0xe0000000 0×20000000 … … 0xffffffff 0×40000000 ?? 假 设按照上述简单的地址映射关系

直接在x86硬件上显示图片(无os)

纵饮孤独 提交于 2020-10-25 20:40:14
1 任务   为了学习计算机底层和os,我给自己布置了一个任务:在x86硬件上,使用c和nasm来显示一张bmp图片。完成这个任务,前后估计花了2个月的业余时间。   这个任务涉及了很多知识点,包括:启动区、保护模式、nasm汇编、c和nasm汇编互调、ld链接、硬盘io读取、显卡调色板模式、bmp图片格式、bios中断指令、c指针操作内存、borch虚拟机、binutils工具集、makefile等。 2 环境 ubuntu borchs nasm和 c PS: c代码遵循google的C++ 风格指南,使用gnu99标准 。 3步骤 3.1 生成一个10M的硬盘镜像   bximage是borchs软件包的一个小工具,可以用于生成硬盘或软盘镜像。打开终端,输入:bximage。按照如下图所示的,一步一步地操作。 最终会在当前目录下,生成一个名为10M.img的文件。 3.2 准备一张320*200的bmp图片   为简单起见,屏幕的分辨率使用320*200。因此我们的bmp图片的大小320*200。我准备了一张图片,如下,这是我家主子的靓照。   将文件命名为cat-666.bmp,然后写入到#201扇区 dd if =src/cat-ham.bmp of=10M.img bs=512 seek=201 conv=notrunc 3.3 引导区   引导区位于启动盘的#0扇区

吴恩达创办Coursera是受他启发!74岁老父亲自述终身学习路,8年学完146门课程

坚强是说给别人听的谎言 提交于 2020-10-17 14:31:35
大数据文摘出品 作者:牛婉杨、魏子敏 吴恩达这个名字你一定不陌生,他是当今人工智能和机器学习领域国际最权威的学者之一。作为斯坦福大学计算机科学系和电子工程系的副教授,以及在线教育平台Coursera的联合创始人,他的学生遍布世界各地。 但这篇文章的主角并不是吴恩达,而是他的父亲Ronald Paul Ng,这位已经 74岁的老爷子刚刚学完了自己儿子创办的在线学习平台上的146门课 ,花了整整 八年 时间,其中还包含了 吴恩达的深度学习AI课程 。 吴恩达也连忙发推恭喜,并附上了爷俩的合照。 受父亲启发,吴恩达创办在线教育平台Coursera 其实,吴恩达创办在线教育平台Coursera也是受父亲启发。 故事要从这张截图说起。 多年前,吴老送给吴恩达一本他在1980年写的有关机器学习诊断肝脏疾病的论文副本,吴恩达收到后十分感激并备受鼓舞 。吴恩达为表示感激还特意发了一则文章,表示自己对这方面的研究十分感兴趣,会把这本论文作为自己珍贵的财富。 之后,吴恩达进一步将机器学习与医疗等行业结合起来,并且受此启发,在2012年,吴恩达和Daphne Koller共同创建了这个在线教育平台Coursera。 Coursera作为MOOC(大型开放式网络课程)中的领头羊,在创立后三年就拥有了160多名员工,由原耶鲁校长担任CEO,Coursera的使命就是让所有人最便捷的获取世界最优质的教育机会,

深入理解计算机系统:期末整理与复习

房东的猫 提交于 2020-10-14 14:59:39
文章目录 前言 第一章:概述 知识点 编译 系统硬件组成 系统之间的网络通信 操作系统的抽象表示 操作系统的几个基本抽象概念 Admahl定律 练习题 例1.1 第二章:信息的表示和处理 知识点 进制转换 字数据的大小 字节顺序 移位运算 位级运算 整数表示 编码方式 整数数据类型 编码 无符号数编码 反码编码 补码编码 有符号数和无符号数之间的转换 扩展数字的位表示 截断数字 整数运算 无符号加法 补码加法 无符号乘法 补码乘法 无符号和补码的乘法的位级等价性 乘以常数 除以2的幂 舍入 无符号除法 补码除法(向下舍入) 补码除法(向上舍入) 浮点数 二进制小数 IEEE浮点表示 规格化 非规格化 特殊值 示例 舍入 浮点运算 浮点乘法 浮点加法 C语言中的浮点数 练习题 第三章:程序的机器级表示 知识点 机器级代码 数据类型 访问信息 整数寄存器 操作数指示符 数据传送指令 压入和弹出栈数据 算术和逻辑操作 加载有效地址 一元操作 二元操作 特殊的算术操作 控制 条件码 设置条件码 访问条件码 条件分支 跳转指令 用条件控制来实现条件分支 条件传送指令 用条件传送来实现条件分支 循环 do-while循环 while循环 跳转到中间 guarded-do for循环 switch语句 过程 运行时栈 栈操作 pushq Src popq Dest 转移控制 数据传送

C#中的原子操作Interlocked,你真的了解吗?

社会主义新天地 提交于 2020-10-11 01:45:03
阅读目录 背景 代码描述 越分析越黑暗 结语 一、背景   这个标题起的有点标题党的嫌疑[捂脸],这个事情的原委是这样的,有个Web API的站点在本地使用Release模式Run的时候出现问题,但是使用Debug模式则不会。通过打日志定位到问题在如下的这个代码这里:   private static int _flag; public void ExactlyOnceMethod() { var original = Interlocked.Exchange( ref _flag, 1 ); if (original == _flag) { // 1.重复进入 } else { // 2.第一次进入 } }   理论上,会有一次请求进入到2中,但是实际问题是全部都进入到了1中。 二、代码描述   这个代码很简单,就做了2个事情,1是使用Interlocked.Exchange将_flag变量进行赋值。2是将Interlocked.Exchange操作后返回的原始值与_flag变量进行对比,如果相等说明这个变量已经被修改过了,表示这里是重入了。如果不是则说明第一次进入此方法。   关于Interlocked.Exchange的解释,见微软官网文档,传送门在此: https://msdn.microsoft.com/zh-cn/library/d3fxt78a.aspx 三