edi

什么是WebService

江枫思渺然 提交于 2020-07-24 17:49:40
一句话概括什么是WebService   WebService是一种跨编程语言、跨操作系统平台的远程调用技术。 远程调用技术:远程调用是指一台设备上的程序A可以调用另一台设备上的方法B。比如:银联提供给商场的pos刷卡系统,商场的pos机转账调用的转账方法的代码其实是跑在银行服务器上的。再比如,amazon,天气预报系统,淘宝网,校内网,百度等把自己的系统服务以WebService服务的形式暴露出来,让第三方网站和程序可以调用这些服务功能,这样扩展了自己系统的市场占有率。 跨编程语言:是指服务端、客户端程序的编程语言可以不同 跨操作系统平台:是指服务端、客户端可在不同的操作系统上运行 从表面上看,WebService是指一个应用程序向外界暴露了一个能通过Web调用的API接口,我们把调用这个WebService的应用程序称作客户端,把提供这个WebService的应用程序称作服务端。 从深层上看,WebService是建立可互操作的分布式应用程序的新平台,是一个平台,是一套标准。它定义了应用程序如何通过Web实现互操作性,通过WebService标准对服务进行查询和访问。 如何实现WebService 1. 远程调用   远程调用的过程是这样的,先从客户端和服务端的角度考虑,客户端向服务端发送服务请求,服务端接收请求并处理,再向客户端回复请求,客户端接收回复。接着

Delphi 对象模型学习笔记(转)

旧时模样 提交于 2020-05-08 19:40:15
摘要 Borland Object Pascal 对象模型(现在已经正是命名为 Delphi 语言)与其他 OOP 语言一样,都提供了一些基础服务: 如对象创建服务、对象释放服务、对象识别服务、对象信息服务,除此之外在编译器和 VCL framework 级别上提供了一些额外的服务,例如对象消息分派服务。 前言   首先说一下,Delphi 对象模型涉及的概念非常多,因此在这篇笔记中,我无法将所有的知识点都点到,只是理出一条线方便后来人。可以说这部分内容不是很容易搞懂的,建议大家多看 VCL 源码,它可真是一座金山,有你挖不完的金子,每次你都会有意外收获的。另外有些概念恐怕看源码也不见得搞得懂,这时候你可以通过 Debug 看看反汇编的结果,通常会看到编译器为你做了很多幕后工作。有了这种钻研精神,我想恐怕没有什么问题解决不了的。 正文 Delphi 中万物之源是 TObject,不管你自定义的类是否指明了所继承的父类,一定都是 TObject 的子孙,一样具有 TObject 定义的所有特性[3]。由于在 TObject 中已经提供了大部分的对象基础服务,因此继承类自然而然也就具备了这些对象服务,强烈建议每一个学 Delphi 的朋友都要仔细研习一下 TObject 的源码。   一个对象的生命周期是从它被创建那一刻开始。通常我们都用类似 TMyObject.Create

汇编语言 Part 2——寄存器

自古美人都是妖i 提交于 2020-05-08 00:26:10
处理器操作主要涉及处理数据。这些数据可以存储在内存中并从中访问。但是,读取数据并将其存储到内存中会减慢处理器的速度,因为它涉及将数据请求通过控制总线发送到内存存储单元并通过同一通道获取数据的复杂过程。 为了加快处理器操作速度,处理器包括了一些称为**寄存器 **(Registers) 的内部内存存储位置。 寄存器存储了用于处理的数据元素,而不必访问内存。处理器芯片中内置了数量有限的寄存器。 处理器寄存器 在 IA-32 体系结构中,有10个32位和6个16位处理器寄存器。寄存器分为三类—— 通用寄存器 (General registers), 控制寄存器 (Control registers),以及 段寄存器 (Segment registers)。 通用寄存器可进一步划分成—— 数据寄存器 (Data registers), 指针寄存器 (Pointer registers),以及 变址寄存器 (Index registers)。 数据寄存器 四个32位数据寄存器用于算术、逻辑和其他操作。这些32位寄存器可以用三种方式—— 完整的32位数据寄存器: EAX、EBX、ECX、EDX。 32位寄存器的下半部分可以用作4个16位数据寄存器: AX、BX、CX 和 DX。 上述4个16位寄存器的以上部分可用作8个8位数据寄存器: AH、AL、BH、BL、CH、CL、DH 和 DL。

《操作系统真象还原》线程

こ雲淡風輕ζ 提交于 2020-05-07 11:53:26
线程 简介   线程是什么?一般我们在书上看到的定义都是:线程是被操作系统调度的最小单位。这定义可能给出的意义并不多,我们在之后讲到为什么有线程之后,就会有一个比较清楚的理解。   先从线程建立的角度来说一下,线程是什么。 int pthread_create(pthread_t * __restrict __newthread, __const pthread_attr * __restrict __attr, void *(*__start_routine)( void * ), void *__restrict __arg) __THROW __nonnull (( 1 , 3 ));   这是Posix版本线程库中创建线程的定义。   __newthread用于存储线程的id。   __attr用于指定线程的类型。   __start_routine是函数指针,用于指定线程执行程序的入口地址。   __arg用于指定线程执行程序的参数,即__start_routine的参数。   再看看一个调用该函数的简单例子: #include <stdio.h> #include <pthread.h> void * thread_func( void * _arg) { unsigned int *arg = _arg; printf( " new thread: my tid is

学习笔记分享之汇编---2.汇编指令/语法

一曲冷凌霜 提交于 2020-04-19 17:56:26
学习内容:汇编指令/语法: 拷贝源操作数到目标操作数: mov 目标操作数,源操作数 源操作数可以是任意单元(r/m/sr/imm) (sr:Segment Register) 目标操作数可以是 除了立即数之外的 任意单元(r/m/sr) 操作数的宽度必须前后一致 源操作数和目标操作数不能同时为内存单元 加/减/与/或/异或: 🞕 add/sub/and/or/xor 目标操作数,源操作数 源操作数可以是r/m/imm 目标操作数可以是r/m 操作数的宽度 除了源操作数是立即数的情况之外(即:立即数可以是任意位) 必须前后一致 🞕 非: not r/m8   not r/m16   not r/m32 从指定内存中写入/读取数据: mov dword ptr ds:[m],imm   //写 mov r,dword ptr ds:[r]     //读 ptr: Point 代表后面是一个指针 (指针即里面存的不是普通的值,而是个地址) 在8086中设置4个16位的段寄存器,用于管理4种段: ①数据段---ds(Data Segment):数据段寄存器 ②代码段---cs(Code Segment):代码段寄存器 ③堆栈段---ss(Stack Segment):堆栈段寄存器 ④附加段---es(Extra Segment):附加段寄存器 BYTE 字节 = 8(BIT) WORD

学习笔记分享之汇编---3. 堆栈&标志寄存器

亡梦爱人 提交于 2020-04-19 13:33:56
前言:   此文章收录在本人的《学习笔记分享》分类中,此分类记录本人的学习心得体会,现全部分享出来希望和大家共同交流学习成长。附上分类链接:    https://www.cnblogs.com/tibbors/category/1729804.html 学习内容:堆栈 堆栈的优点:临时存储大量数据,便于查找 堆栈中越往顶部地址编号越小 压栈出栈变的都是栈顶 堆栈的操作分解: 前提操作: MOV EBX,13FFDC //BASE MOV EDX,13FFDC //TOP 操作一:压入数据 法一: MOV DWORD PTR DS:[EDX-4],0xAAAAAAAA //先压入数据 SUB EDX,4 //再上移地址(寄存器) 法二: SUB EDX,4 //先上移地址(寄存器) MOV DWORD PTR DS:[EDX],0xBBBBBBBB //再压入数据 法三: MOV DWORD PTR DS:[EDX-4],0xDDDDDDDD //先压入数据 LEA EDX,DWORD PTR DS:[EDX-4] //再通过LEA指令上移地址(寄存器) 法四: LEA EDX,DWORD PTR DS:[EDX-4] //先通过LEA指令上移地址(寄存器) MOV DWORD PTR DS:[EDX],0xEEEEEEEE //再压入数据 操作二:读取某个数据 法一: //通过

HOOK相关原理与例子

自作多情 提交于 2020-04-06 18:27:47
消息 HOOK 原理: 1. 用户输入消息,消息被放到系统消息队列。 2. 程序发生了某些需要获取输入的事件,就从系统消息队列拿出消息放到程序消息队列中。 3. 应用程序检测到有新的消息进入到程序消息队列中后,调用相应的事件去处理该消息。 所以在系统消息队列与程序消息队列的中间安装 hook,即可获取消息队列中的信息。 安装: SetWindowsHookEx(键盘消息(WH_xxx),Hook函数(处理键盘输入的函数),句柄(hook函数所在的DLL的句柄),线程ID(要hook的线程ID,0为所有线程)) API在简单高效的同时也有一个弊端,就是它只能监视较少的消息,如:击键消息、鼠标移动消息、窗口消息。 SEH(调试) HOOK 原理:与调试器工作方式类似,让进程发生异常,然后自己捕获到异常,对于除于被调试状态下的级进行操作。 1. 正常情况下,进程未被其他进程调试时,当进程发生异常事件,系统将捕获该事件,并进行事件处理。 2. 当进程被其他进程调试时,处理该进程的异常事件的工作则交给了调试进程。(调试进程未处理或不关心的调试事件由系统处理) 3. 调试 HOOK的核心思路就是将API的第一个字节修改为0xCC(INT 3,留给调试工具的中断,调试工具运行完后,会将下一条指令手动替换回原先的代码),当API被调用时,由于触发了异常,控制权就被转交给调试器(调试进程)。

手脱Upack 2.x - 3.x

狂风中的少年 提交于 2020-03-23 13:47:13
1.PEID查壳 Upack 2.x - 3.x Heuristic Mode -> Dwing 2.载入OD,一上来就是一个大跳转,先F8跟一会 00401030 >- E9 56D40300 jmp 跑跑排行.0043E48B ; //程序入口点 00401035 42 inc edx ; 跑跑排行.<ModuleEntryPoint> 00401036 79 44 jns short 跑跑排行.0040107C 00401038 77 69 ja short 跑跑排行.004010A3 0040103A 6E outs dx,byte ptr es:[edi] 0040103B 67:40 inc eax ; kernel32.BaseThreadInitThunk 0040103D 0000 add byte ptr ds:[eax],al 3.来到这里,我们看到一个push,可以使用ESP定律,下硬件访问断点,然后shift+F9运行一下 0043E49B F3:AB rep stos dword ptr es:[edi] 0043E49D AD lods dword ptr ds:[esi] 0043E49E 50 push eax 0043E49F 97 xchg eax,edi ; //ESP定律 0043E4A0 51 push ecx 0043E4A1 58

X86-64寄存器和栈帧

十年热恋 提交于 2020-03-17 10:40:35
某厂面试归来,发现自己落伍了!>>> X86-64寄存器和栈帧 概要 说到x86-64,总不免要说说AMD的牛逼,x86-64是x86系列中集大成者,继承了向后兼容的优良传统,最早由AMD公司提出,代号AMD64;正是由于能向后兼容,AMD公司打了一场漂亮翻身战。导致Intel不得不转而生产兼容AMD64的CPU。这是IT行业以弱胜强的经典战役。不过,大家为了名称延续性,更习惯称这种系统结构为x86-64。 X86-64在向后兼容的同时,更主要的是注入了全新的特性,特别的:x86-64有两种工作模式,32位OS既可以跑在传统模式中,把CPU当成i386来用;又可以跑在64位的兼容模式中,更加神奇的是,可以在32位的OS上跑64位的应用程序。有这种好事,用户肯定买账啦。 值得一提的是,X86-64开创了编译器的新纪元,在之前的时代里,Intel CPU的晶体管数量一直以摩尔定律在指数发展,各种新奇功能层出不穷,比如:条件数据传送指令cmovg,SSE指令等。但是GCC只能保守地假设目标机器的CPU是1985年的i386,额。。。这样编译出来的代码效率可想而知,虽然GCC额外提供了大量优化选项,但是这对应用程序开发者提出了很高的要求,会者寥寥。X86-64的出现,给GCC提供了一个绝好的机会,在新的x86-64机器上,放弃保守的假设,进而充分利用x86-64的各种特性,比如

一种在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