事实证明,两个“open”(open edX和openstack)的组合是提供这种功能的最佳选择。 Open edX Open edX是一个学习管理平台,于2012年在哈佛大学和麻省理工学院启动,随后在斯坦福大学进行了合作。 今天,非营利组织edX Inc.推动了Open edX的大部分开发工作,并继续主办edx.org学习网站。整个平台是开源软件,欢迎社区的贡献。 截至2018年5月,edx.org已经通过自己和官方合作伙伴的网站为大约1600万学习者提供了服务。与此同时,全世界估计还有1800万学习者使用基于edX的独立开放平台。 studio.png XBlocks:一个灵活的、可扩展的插件系统 XBlocks是Open edX的插件系统,允许作者显著扩展Open edX的功能。
edx http://github.com/edx-solutions 官方文档: http://docs.edx.org 官方wiki: https://edx-wiki.atlassian.net/ /Vagrantfile Mitx制作: https://people.csail.mit.edu/ichuang/edx/ 谁在用Open edX: https://github.com/edx/edx-platform /wiki/Sites-powered-by-Open-edX 谁能提供Open edX技术服务: https://github.com/edx/edx-platform/wiki/List-of-Open-edX-service-providers ://github.com/edx/edx-platform/wiki/Python-Guidelines https://github.com/edx/edx-platform/wiki/i18n-Coding-Guidelines forum/openedx-analytics edx-code: edx 功能、代码相关 https://groups.google.com/forum/#!forum/edx-code
领8888元新春采购礼包,抢爆款2核2G云服务器95元/年起,个人开发者加享折上折
提前说明,我没有收到Coursera和Edx这两个网站的一分钱,如有巧合,请给我补上广告费(大雾)。下面进入正题,首先简单介绍一下这两个网站。 科普时间 Coursera和edX是两家美国的在线教育公司,其中Coursera是吴恩达(Andrew NG)创办的,而edX是MIT和哈佛创办的。 edX同样和国内一些高校有合作,但是本土化做得差一些。和Coursera相比,edX由于最早出身高校,更加偏官方一些。 比如MIT和哈佛的公开课就只有edX上才有,这两个高校开设的课程质量非常高,也是edX当中的王牌课程。 这两家网站并不是完全免费的,但也不是完全收费的。 edX本土化差很多,很多课程没有中文字幕,但是edX旁听更加容易,而且有些资源是独占的,比如刚才提到的MIT和哈佛的课程,所以有时候也不能放过。
课程列表 这个系列课程目前已经被放上了edX,注册即可免费收听。 每门课程为期三个月,从一个季度开始,分别为 1月 - 3月,4 - 6月,7 - 9月和10 - 12月。 有关当前课程的确切日期,请参阅edX.org上的课程详细信息页面。 edX链接: https://www.edx.org/microsoft-professional-program-artificial-intelligence ? 在edX首页,课程的培养计划如下: 本课程是微软数据科学专业计划证书和微软人工智能专业计划的一部分。 数据科学人才的需求正在迅速增长。
本文主要是Magisk安装Edx。 刷入 Edx 下载准备: 有了magisk之后安装Edxp相对比较简单,Edxp作为一个Magisk模块被刷入。 以前需要刷入 Riru Core和Edx两个模块,但之后有大佬对模块进行了整合,这里分享的就是整合后的模块,用magisk输入后就可以了。 v2.7Y版 链接:https://pan.baidu.com/s/1oxvrpwnWLQWzoQJKYroOUw 提取码:a9dk 安装 下载之后进入第三方rec ,找到模块安装 重启之后一般就会出现 Edx
xorl %eax, %eax subl $0xffff, %edx jz L(finz) bsfl %edx, %ecx %xmm0 pcmpeqb (%rdi), %xmm0 pmovmskb %xmm0, %edx subl $0xffff, %edx jnz %xmm0 pcmpeqb (%rdi), %xmm0 pmovmskb %xmm0, %edx subl $0xffff, %edx jnz %xmm0 pcmpeqb (%rdi), %xmm0 pmovmskb %xmm0, %edx subl $0xffff, %edx jnz %xmm0 pcmpeqb (%rdi), %xmm0 pmovmskb %xmm0, %edx subl $0xffff, %edx jnz
,ExceptClsProc TEST EDX,EDX JE @@exit CALL EDX TEST EAX,EAX JNE @@common JMP @@exit … End ; 所以,需要借助SHE机制来处理这个问题,代码如下: asm //挂上SEH xor edx, edx push ebp push OFFSET @@safecode push dword ptr fs:[edx] mov fs:[edx],esp //调用Halt0 call Halt0 jmp @@exit; @@safecode: //如果出现异常继续调用 , edx push ebp push OFFSET @@safecode push dword ptr fs:[edx] mov fs:[edx],esp call Halt0 jmp , edx push ebp push OFFSET @@safecode push dword ptr fs:[edx] mov fs:[edx],esp call Halt0
,dword ptr ds:[eax * 4 + eax] ; edx = 4eax + eax => 5eax lea edx,dword ptr ds:[edx * 2 + edx] ; ,dword ptr ds:[eax * 8] ; edx = eax * 8 sub edx,eax ; edx = edx - 1eax add edx,10 ; edx = edx + 10 invoke crt_printf,addr szFmt,edx ,dword ptr ds:[eax * 2] ; edx = eax * 2 add edx,eax ; edx = edx + eax sub edx,7 ; edx = edx - 7 invoke crt_printf,addr szFmt,edx
,dword ptr ds:[eax * 4 + eax] ; edx = 4eax + eax => 5eax lea edx,dword ptr ds:[edx * 2 + edx] ; ,dword ptr ds:[eax * 8] ; edx = eax * 8 sub edx,eax ; edx = edx - eax add edx,10 ; edx = edx + 10 invoke crt_printf,addr szFmt,edx ,dword ptr ds:[eax * 2] ; edx = eax * 2 add edx,eax ; edx = edx + eax sub edx,7 ; edx = edx - 7 invoke crt_printf,addr szFmt,edx
,dword ptr ds:[eax * 4 + eax] ; edx = 4eax + eax => 5eaxlea edx,dword ptr ds:[edx * 2 + edx] ; edx 8] ; edx = eax * 8sub edx,eax ; edx = edx - 1eaxadd edx,10 ; edx = edx + 10invoke crt_printf,addr szFmt,edx ; edx = eax * 7 + 10mov eax,dword ptr ds:[y] ; edx = edx + eaxsub edx,7 ; edx = edx - 7invoke crt_printf,addr szFmt,edx edx = n neg edx ; edx=6 结果neg取反invoke crt_printf,addr szFmt,edx; 还原除数: 2 ^(32
movl 16(%ebp), %edx //R[edx]<-M[R[ebp]+16],将z送EDX 7 andl 65520, %edx //R[edx]< -R[edx]&65520,将z&65520送EDX 8 addl %ecx, %edx //R[edx]<-R[edx]+R[ecx],将z&65520+y*256 movl 16(%ebp), %edx //R[edx]<-M[R[ebp]+16],将z送EDX 7 andl 65520, %edx //R[edx]< -R[edx]&65520,将z&65520送EDX 8 addl %ecx, %edx //R[edx]<-R[edx]+R[ecx],将z&65520+y*256 - i = 7i 5 addl %edx, %eax //R[eax] = 7*i + j 6 leal (%edx, %edx, 4), %edx //R[edx
), %edx 把 ecx+edx 的地址给 edx x*16+y 即 x 的系数 J=16movl %eax, array1(,%edx,4) 把 eax 的值给 array1 的 edx* 4 位的地方 =ecx-eax y-x*xmovl %edx, %eax eax=edx eax 处=ysall $3, %eax eax < < 3 相当于y < < 3 3 即是 J 的值addl %edx, % eax eax=eax+edx y< <3+ysall $2, %eax eax< <2 (y< <3+y)< <2addl %edx, %eax eax=edx+eax (y< <3+y)< <2+yaddl //edx=1=r imull %edx, %eax //eax*=edx 即eax=a[i]*rmovl %eax, -20(%ebp) //ebp小20处的位置的值等于eax r=eaxaddl //edx=6=jsubl %eax, %edx //edx=-4movl 20(%esp), %eax //eax=10addl $1, 20(%esp) //i=11movl
被除数为正, edx = 0, 否则 edx = -1 .text:00401044 and edx, 7 位与运算.被除数为正数,此条指令没用 ,因为edx = 0. 0 & 7还是0 被除数为负数 edx结果为7 .text:00401047 add eax, edx (eax + edx)/2^n edx = 0 则被除数是0 edx = -1 则被除数是负数. cdq sub eax,edx sar eax, n 除数进行还原: 2^n 被除数: eax eax是补码,则商为负,则 sub eax,edx会执行. 被除数为负数 edx = -1 正数为0 sub eax,edx也是判断被除数是否为正负数.而进行的无分支优化. 除法原理: b > 0 也就是除数大于0 使用公式: ?
然后下面 使用了 sar edx,N 直接使用了edx,我们说过 eax,edx用于乘法.那么eax就是高位.edx就是低位.这里直接对 edx 右移了一位. 那么是不是就是相当于 (eax,edx) >> 1位. 而eax是2^32次方.这里直接对edx移动了.默认就是操作了eax. 所以隐含的eax不要忘记. 获取被除数,因为被除数是无符号.所以edx为0.所以会使用指令 xor edx,edx 进行清零. .没有使用eax 除法会使用 eax,edx. 所以使用edx变相的相当于以及有了2^32次方了.
0000031d movzx edx,byte ptr [esi+edx+8] // 将ImageDataC[SpeedTwo]中的数据传送到edx寄存器 00000322 add edx,edi 00000340 jae 0000073C 00000346 movzx edx,byte ptr [esi+edx+8] 0000034b mov 00000361 movzx edx,byte ptr [esi+edx+8] 00000366 add edx,edx 00000368 sub 00000375 movzx edx,byte ptr [esi+edx+8] 0000037a mov dword ptr [ebp+FFFFFF74h],edx sub eax,edx 0000033a movzx edx,byte ptr [esi+ebx+6] 0000033f add edx,edx
edx //call printf (0040d6c0) //add esp,0Ch // == //mov edx, i //movsx eax,str[edx] //push eax //mov ecx,i //push ecx //mov edx ,i movsx eax,str[edx] mov ecx,j movsx edx ,j mov ecx,count[edx*4] push ecx movsx eax,pipei[edx ] push eax mov edx,str4 push edx call
;int 3;add edx,_Config - _Config_Before;跳过最开始的短跳movzx eax,BYTE PTR [edx]mov _bKey,eax;原始字节长度mov ax,WORD PTR [edx + 1]mov _dwCodeLen,eax;压缩后的长度mov ax,WORD PTR [edx + 3]mov _dwCompressLen,eax;判断执行类型;dll时,第一个参数 ,[esi+20h];edx = InInitOrder[X].module_namemov esi,[esi]cmp [edx+18h],cljne _LdrLooppop esimov esi,[esi ,WORD PTR [ecx + 2*edx];edx = ordinal number of functionmov ecx,[ebx+1Ch];ecx = address table RVAadd edi,eax;edi = XINFO地址pop edx;取出edx和ecxpop ecxassume edi:PTR XINFO;分配新的代码的内存xor eax,eaxpush ebx;40hpush
这里LZ举一个简单的例子,比如pushl %edx这条命令,它的任务是将%edx寄存器的值复制到栈顶。我们首先来看一下命令执行前,寄存器以及存储器的状态。 ? movl 8(%ebp), %edx 这一句将内存地址为%ebp+8的值复制到%edx,很明显,从上面的图中可以看出,%ebp+8这个位置存储着xp变量。 这一句指令做了一个简单的操作,就是将xp提取到%edx寄存器,如下所示。 ? 此时已经将%edx的值改为了变量xp,看接下来的一句操作。 movl (%edx), %eax 这一句将内存地址为%edx的值赋给寄存器%eax,并准备返回值。 movl %ecx, (%edx) 它的作用是将%ecx寄存器的值复制到内存中%edx的位置。此时%ecx的值为y,而%edx中为xp,因此目的操作数则为xp指向的位置,也就是*xp。
ecx 的值来自 [edx+esi],edx 的值断下后为 0,那么包地址就等于 esi,继续追 esi ? eax 来自 [ebx+8],ebx 来自 edx,而 edx 的地址是不变的,包内容 = [[edx]+8]+4],直接在 edx 下写入断点 ? 断到了第二次断下的位置 ? +ebx*4], ecx mov dword ptr [edi+eax*4], edx add edx, ecx inc al and edx mov dword ptr [edi+eax*4], edx add edx, ecx inc al and edx, 0x0FF add edx, ecx inc al and edx, 0x0FF mov edx, dword ptr [edi+edx*4]
扫码关注腾讯云开发者
领取腾讯云代金券