edx

一种在C语言中用汇编指令和 System V ucontext 支撑实现的协程切换

天大地大妈咪最大 提交于 2020-02-28 03:23:53
1 实现内容 此文在看了 python yield 和 yield from 机制后,觉得 这种轻量级编程技术在小并发场景下优雅可爱,在大并发场景下较进程或线程而言能突破资源瓶颈 ,实在令人忍不住而想在C语言中实现一个。 然后经过一些学习后,此文就在 Linux 上用C语言实现了一个。目前具体包括 [1] co_yield() —— 类似 python 的 yield,用于协程切换; [2] co_send() —— 类似 python 生成器中的 send(),用于开始或恢复协程的执行; [3] co_yield_from() —— 类似 python 的 yield from,用于同步基于 co_yield() 切换的协程; [4] co_loop() —— 略似于 python 的 asyncio.loop(),用于协程并发调度。 e.g. /** ** brief: suspending current coroutine related with ci then switch to specific coroutine when co_yield() called. ** param: ci, bears control-information for corresponding coroutine. ** return: zero returned if

数组名和数组名取地址的区别

心不动则不痛 提交于 2020-02-27 12:09:11
以下代码会打印出什么样的日志呢? #include <stdio.h> int a[2] = {1,2}; int main(){ printf("a = %p\n", a); // I printf("&a = %p\n", &a); // II printf("a + 1 = %p\n", a + 1);// III printf("&a + 1 = %p\n", &a + 1);// IV return 0; } 本机(linux)结果输出: a = 0x804a014 &a = 0x804a014 a + 1 = 0x804a018 &a + 1 = 0x804a01c 没错,上面I 和 II打印出来的地址是一样的,IV 要比 III 大4个字节的地址空间。下面是我对这一现象的解释,如有不妥的地方请各位大虾一定给于指出: 首先引用《C和指针》p141中的理论: 在C中, 在几乎所有使用数组的表达式中,数组名的值是个指针常量,也就是数组第一个元素的地址。 它的类型取决于数组元素的类型: 如果它们是int类型,那么数组名的类型就是“指向int的常量指针“。 看到这里我想应该就知道为什么 会有I 和 III式的结果了。 对于II 和 IV 则是特殊情况,在《C和指针》p142中说到,在以下两中场合下,数组名并不是用指针常量来表示,就是当数组名作为sizeof操作符和单目操作符

Java代码的汇编细节

一世执手 提交于 2020-02-25 17:06:18
尽管在Java语言中,存在一个“Java虚拟机规范”,规范了Java中每一条指令所能执行的动作以及堆栈的分布做了规范,但是随着技术的发展,高性能虚拟机真正的细节实现方式已经渐渐与虚拟机规范所描述产生越来越大的差距,虚拟机规范中的描述逐渐成了虚拟机实现的“概念模型”——即实现只能保证规范描述等效。 基于上面的原因,我们分析程序的执行语义问题(虚拟机做了什么)时,在字节码层面上分析完全可行,但分析程序的执行行为问题(虚拟机是怎样做的、性能如何)时,在字节码层面上分析就没有什么意义了,需要通过其他方式解决。 分析程序如何执行,通过软件调试工具(GDB、Windbg等)来断点调试是最常见的手段,但是这样的调试方式在JVM中会遇到很大困难,因为大量执行代码是通过JIT编译器动态生成到CodeBuffer中的,没有很简单的手段来处理这种混合模式的调试(不过相信虚拟机开发团队内部肯定是有内部工具的)。因此我们要通过一些曲线手段来解决问题,基于这种背景下,本文的主角——HSDIS插件就正式登场了。 1.准备工作   HSDIS是一份Sun官方推荐的HotSpot VM JIT编译代码的反汇编插件,它包含在HotSpot VM的源码之中,在Project Kenai( http://kenai.com/projects/base-hsdis )也可以下载到单独的源码。它的作用是让HotSpot的

CrackMe160 学习笔记 之 045

主宰稳场 提交于 2020-02-17 11:46:18
前言 这是个简单的题。不过我不知道他怎么把字符串藏起来的。 思路 定位到点击事件分析。 分析 以后这种简单的题目都不写注册机了。 00421DE4 |. BB 37000000 mov ebx, 37 ; ebx初始化0x37 00421DE9 |. 8D55 F8 lea edx, dword ptr [ebp-8] 00421DEC |. 8B86 B0010000 mov eax, dword ptr [esi+1B0] 00421DF2 |. E8 89FAFEFF call 00411880 ; 获取serial地址保存到ebp-8中 00421DF7 |. 8D55 FC lea edx, dword ptr [ebp-4] 00421DFA |. 8B86 AC010000 mov eax, dword ptr [esi+1AC] 00421E00 |. E8 7BFAFEFF call 00411880 ; 获取key地址保存到ebp-4中 00421E05 |. 8B45 FC mov eax, dword ptr [ebp-4] 00421E08 |. E8 5715FEFF call 00403364 ; 获取name长度 00421E0D |. 83F8 04 cmp eax, 4 00421E10 |. 7D 0C jge short 00421E1E ;

MOV与LEA

偶尔善良 提交于 2020-02-09 06:26:40
MOV 格式: MOV dest, src 作用:赋值,且不改变标记位的值 特点:可以从寄存器到寄存器、从立即数到寄存器、从存储单元到寄存器、从立即数到储存单元、从寄存器到存储单元、从寄存器或存储单元到段寄存器(除CS寄存器); 立即数不能值接送段寄存器 [ ] 作用: 对于变量:有无 [ ] 都表示取值 对于寄存器:有 [ ] 表示取地址,无 [ ] 表示取值 LEA (Load Effective Address) 格式: LEA dest, src 作用:将源操作数的偏移地址给目的操作数,即返回的是src的地址;另外,LEA指令具有单时钟周期,执行效率很高。 [ ] 作用: 对于变量:有无 [ ] 都表示取地址 对于寄存器:有 [ ] 表示取值,无 [ ] 表示取地址( 正好与MOV相反 ) 举例 对于计算EAX*4+EBX+3,结果放入EDX MOV MOV EDX, EAX SHL EDX, 4 ADD EDX, EBX ADD EDX, 3 LEA LEA EDX, [EBX + EAX * 4 + 3] 参考: https://blog.csdn.net/fengyuanye/article/details/85715565 来源: https://www.cnblogs.com/libbin/p/11625690.html

计算机是这样工作的

本秂侑毒 提交于 2020-02-09 03:12:12
陈民禾,原创作品转载请注明出处《Linux内核分析》MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 ,我的博客中有一部分是出自MOOC课程中视频,再加上一些我自己的理解。 一、首先在理解计算机是如何工作之前,我们先来理解一下现代计算机的模型。 现代计算机是存储程序计算机,依据冯诺依曼体系结构构造。从硬件的层面,也就是我们从计算机的主板。冯诺依曼体系结构我们可以大概抽象成一个cpu。还有一块可以抽象成内存,cpu和内存有一个连接,我们称之为总线,然后就是cpu内部,cpu里面有个很重要的寄存器,叫做ip,它总是指向内存的某一块区域,比如说它指向代码段,此时cpu就从IP指向的那个内存地址取过来一条指令执行,执行完之后Ip自加一,这样像贪吃蛇一样一步步向下面走,这就是从硬件方面解释的冯诺依曼体系。 二、计算机依靠机器语言进行工作,我们可以通过汇编语言来“指挥”计算机完成一些工作,下面就是一些汇编基础知识,总结如下: X86计算机的寄存器:32位的X86计算机的寄存器,它的低16位作为16位的寄存器,16位的寄存器,它还有8位的寄存器。8位的寄存器包含AH,BH,CH,DH,AL,BL,CL,DL。16位的寄存器包含AX,BX,CX,DX,BP,SI,DI,SP。所有开头为E的寄存器一般来讲是32位的。譬如EAX:累加器

逆向工程初步160个crackme-------6

天大地大妈咪最大 提交于 2020-01-31 05:24:08
工具:1. 按钮事件地址转换器E2A 2. PEID 3. Ollydbg 同样我们先来运行一下这个程序, ok按钮是被禁用的,有一个help按钮点击后弹出一个消息框:消息框显示提示信息为。本程序需要输入正确的姓名的序列号,把OK按钮和Cancella按钮隐藏显示出其后面的RingZero的LOGO 我们随便输入姓名和序列号 发现OK还是禁用的,那我们就点击Canella试试,发现没用并且序列号被清零 我们熟悉完程序后,正式开始分析。 我们还是先用PEID看看其文件信息, 发现其是用Delphi编写的32位程序,我们打开OD载入程序。 运行程序随便输入用户名和序列号 随后我们需要分析其对应的各个按钮事件,用E2A打开程序文件查看各个按钮事件对应的地址,因为OK按键被禁用所以我们先分析Cancela按钮消息,用E2A程序打开查看Cancella按钮事件的地址 然后在OD中搜索此地址并下段,然后单击CancellaClick按钮程序会停在此地址处 然后单步向下并且注意跳转指令(因为我们输入的是错误的注册码,所以程序走的肯定是不正确的分支,所以我们就和程序反着来,显式改变eip,逆其道而为之),先看看这样后能不能满足条件(如果能满足在回头来分析如何让其实现跳转)。 F8向下分析遇见一个跳转指令,按此程序其是要跳转(那么我们就逆其道而为之),显式改变eip为00442EF0,然后执行程序

学习编程有疑问?七个网站助你菜鸟变大牛

删除回忆录丶 提交于 2020-01-27 15:56:37
很多同学在学习编程时候会遇到各种各样的问题,这些问题需要自己去想办法解决,那么这些网站平台将会给你很大的帮助。 1、W3school 这是一个免费学习编程语言的在线学习网站,里面的知识浅显易懂,非常适合初学者。如果你对编程还不是很了解,那就可以试试这个网站。 2、菜鸟教程 这是一个专注于编程学习的网站,里面不仅有各种编程知识,还有在线编程工具,让你在学习的过程中进行实践,从而更牢固地掌握所学知识。更重要的是还能根据学习情况进行测验,检验一下学习成果。 当自己有不会的地方可以在用户笔记中查找自己所需要的笔记,让自己更好地提升自己的能力。 3、Lintcode 当我们在学习了一段时间的编程,想要知道自己的能力是否能够达到公司的要求的时候。可以用用这个网站进行测试。它里面有一些互联网公司的面试真题,可以自行根据难度和知识点检验自己的学习成果,及时知道自己哪里有欠缺。 4、Infoq infoq是一个实践驱动的社区资讯站点,里面汇聚了各种软件资讯,你可以在这个网站中及时地了解到关于编程和互联网的最新资讯。还有额外的算法训练营帮助你提升自己的能力。 5、edX edX是另一个领先的在线学习平台,重点是它不是以营利为目的,而是开源的。edX是由美国哈佛大学和麻省理工学院于2012年联合创办的,所以你将会在这里学习到先进的技术和理论。如今,edX已涵盖了60所学校。此外在这里

CrackMe160 学习笔记 之 002

五迷三道 提交于 2020-01-18 19:20:52
前言 打开程序,是一个很简单的界面。看来是要我们根据 用户名 写出对应的 序列号 。 如图。 分析 输入任意字符,搜索字符串 "You get Wrong" "Try Again" , 找到 判断关键跳转 的地方。 00402579 . 66:85F6 test si, si 0040258B . 74 58 je short 004025E5 0040258D . 68 801B4000 push 00401B80 ; UNICODE "You Get It" 00402592 . 68 9C1B4000 push 00401B9C ; UNICODE CR,LF 00402597 . FFD7 call edi 00402599 . 8BD0 mov edx, eax 0040259B . 8D4D E8 lea ecx, dword ptr [ebp-18] 0040259E . FFD3 call ebx 004025A0 . 50 push eax 004025A1 . 68 A81B4000 push 00401BA8 ; UNICODE "KeyGen It Now" 004025E5 > 68 C81B4000 push 00401BC8 ; UNICODE "You Get Wrong" 004025EA . 68 9C1B4000 push 00401B9C ;

strlen的另一种实现,可以作为ShellCode

廉价感情. 提交于 2020-01-11 00:35:45
在实际工作中会遇到很多strlen. 这里针对strlen函数做一下代码还原. 并且讲解其原理 高级代码如下: #include <iostream> int main() { char szBuffer[] = "HelloWorld"; scanf_s("%s", szBuffer); long StrSize = strlen(szBuffer); scanf_s("%d", &StrSize); return 0; } 请不要关注scanf_s 为了编译器能够正确编译加上自己懒得去掉SDL检查.所以加了.这里的scanf_s 只是为了防止编译器直接全部优化掉. 对应汇编代码如下: .text:00401050 ; int __cdecl main(int argc, const char **argv, const char **envp) .text:00401050 main proc near ; CODE XREF: __scrt_common_main_seh+F5↓p .text:00401050 .text:00401050 var_14 = dword ptr -14h .text:00401050 var_10 = qword ptr -10h .text:00401050 var_8 = word ptr -8 .text:00401050 var_6