11分处理第③讲(SEH),筛选器相当,以及__asm的扩张,寄存器注入简介

 

王者荣耀 1

              格外处理第壹讲(SEH),筛选器相当,以及__asm的扩展

新浪IBinary原创  博客连接:http://www.cnblogs.com/iBinary/

转发请表明出处,多谢

本期核心是王者荣耀,有局地相对有深度的解析。三个生死攸关的理念是:《王者荣耀》的流行基于熟人社交。

一丶__Asm的恢弘知识

全体评价3星。

①丶使用主要字,消除一些变量申请难点

前几日曾经介绍了__asm的主导用法,以往对其做个扩展(上一篇是32为汇编第8讲)

后天大家写的裸函数,那么变量的题材要求化解

请看C的内联系汇率编

_declspec(naked) int MySub(int n1,int n2)
{
    int nLocal1;        //注意变量
    int nLocal2;
    _asm
    {
        push ebp
        mov ebp,esp
        sub esp,8       //申请了两个变量,那么栈就要抬高8个字节,一个变量4个字节

        push 0
        push 0
        push 0
        push 0


        pop ebp
        ret
    }
}

那么对于地方的主次,你觉着只怕没难题,不过我们想转手,倘若本人在概念两个变量,那么下边包车型客车吩咐就要反复改观

sub esp,xxx

也就那样不好,为何,假如来个数组,来个结构体套结构体,你怎么确认保障大家要开辟多少个部分变量?

于是VC为大家提供了语法的协助

__LOCAL_SIZE 申请局地变量的时候自动抬栈

王者荣耀 2

,ALT + 8看下反汇编窗口到底做了哪些

王者荣耀 3

我们来看了,大家就定义了多个部分变量,为啥是申请了50个字节,原因是本身那边是Debug版本,默许编写翻译器会帮我们提请40h(也正是63个字节)的片段空间,那么丰硕大家的五个部分变量正好48H个字节

倘纵然公布版(Release)那么则会依照你写的汇编代码的不等,申请分裂的长空,为什么如此说.

因为您定义了八个部分变量,而在__王者荣耀,asm里面你只利用了一个

例如:

__asm
{
  ...
   mov nLocal,eax  //把eax的值给局部变量  
  ...    
}

若果另1个从未有过接纳,编写翻译器就恐怕给你优化掉,只给你报名伍个部分变量空间,以为不是Debug版本,所以不会在附加给你申请40H个字节了

留意,在裸函数中您定义的有的变量是无法伊始化的

也正是说您能够写成自身下面的那样子,可是无法早先化值,因为那一个时候还一直不抬栈,比如抬栈之后初始化,

而初步化就大概在__asm里面去写

自然越来越多的扩充的__asm语法能够MSDN查询

比如说上边那一个

王者荣耀 4

输入__asm查询即可

以下是本期一些内容的摘要:

②丶消除数组求大小,求数组类型大小,以及求数组/类型的难题

作者们一些时候会想,我们的Sizeof()仍然想选拔的,很方便的

那便是说今后大家不能够接纳了,然则VC为了帮助,照旧提供了附加的语法扶助

诸如MSDN上询问到的

王者荣耀 5

地点说了详实的例证

LENGTH 数组   代表了C语言的 Sizeof(数组) / sizeof(数组[0])

SIZE    数组  代表了C语言的求数组大小

TYPE   数组  代表了C语言的求数组第1项项指标尺寸

切切实实地衡量试,请自个儿上机实践

1:或许有人会问:难道不是有万能的谷歌(谷歌)翻译啊?那就关系“游客不打听的大不列颠及英格兰联合王国”的一有的:直至三年前,加州理工科市中坚的手提式有线电话机信号还差得分外,在熙熙攘攘的街道上打不出电话是常事,更不要说用手提式有线电话机查地图了。两年前升级到4G互连网,情况才稍有革新。#245

③丶化解db定义数据的根本字

在VC内联汇编中,db关键字 dd dw
….等等都不得以行使了,不过提供了附加的语法

_emit指令

王者荣耀 6

上面说的很清楚,假设想利用db命令则用那一个命令代替

例如:

  

__asm
{
  _emit 04ah

}

借使想使用DW 则定义三个,使用DD 着用三个即可.

只顾,使用那一个命令大家能够把OUT指令的二进制定义出来,还有操作码,那么汇编正是相应的OUT指令了

大家都精通,大家三拾陆人汇编下都是体贴形式了,也正是说,IN
OUT不管用了,(不代表不可能用)我们同样能够用,只可是

IN OUT
指令是三环,所以实行这条二进制指令的时候,CPU是拒绝执行的,大家要举行便是在0环下举办,也正是常说的操作系统内部,内核执行.

 

和讯IBinary原创  博客连接:http://www.cnblogs.com/iBinary/

转发请表明出处,多谢

2:极光大数据在七月份通告的《王者荣耀研究告诉》印证了田丰的估量,《王者荣耀》用户机型价格占比最高的是三千至2999元以内,占比28.7%,用户偏好的APP前贰人是QQ、QQ音乐和一把手,2陆虚岁以下的用户超过四分之二,② 、三线及以下城市用户占比高达90.5%。#445

 二丶极度数处理(SEH)筛选器很是

第③我们要了然如何是可怜,以及那八个的效应(抱着难题来学学,一矢双穿)

何以是尤其:

SEH(“Structured Exception
Handling”),即结构化非常处理.是操作系统提须求程序设计者的强有力的处理程序错误或越发的武器.在VISUAL
C++中您或者早已深谙了_try{} _finally{} 和_try{} _except {}
结构,那个并不是
编写翻译程序自个儿所固有的,本质上只可是是对windows内在提供的结构化格外处理的包装

大约,正是 try cath的尤其和那几个尤其不是同二个

咱俩那边说的不胜,是以此分外怎么产生的,以及怎么处理的,也正是说你写程序长出新的C00005那种万分,空指针分外

作用:

  相信大家只怕都碰到进程序崩溃的景观,可能大家有时候使用QQ
通信工具的时候也会崩溃 🙂

那么QQ处理的就是弹出三个框,让您发送错误报告什么的,为啥,因为QQ用户量相当大,都以巨大级的用户量

而这几个用户正是测试QQ的最好的人,比如部分用户无聊,好友列表来回点上1个钟头,对,正是那么无聊.

比如说王者荣耀,有人还打个游戏多少个钟头 :)废话好多

效率正是让我们急忙稳定程序难题,假如您弹出二个崩溃框框,那么用户也许随手关了,用户也不懂这个对吧.

那正是说后天牵线一下筛选器万分

3:心流也是一个有关游戏的常用理论。张晰说,它起点于澳大塞维利亚的心境学家、阅览美术大师在实行创作时呈现出来的专心一志、不愿意被干扰、抗拒中断的思想状态。#505

①丶筛选器至极

4:并不是各种人都会沉迷于游戏。在玩耍设计师法师K看来,电游在炎黄的流行水平超出美利坚联邦合众国,相当大原因是大家的游艺缺乏。#553

1.装置筛选器十分

啥是筛选器极度?

  筛选器处理卓殊是由程序钦命八个可怜处理回调函数,当发生尤其的时候,系统将调用这么些回调函数,并依据回调函数的再次来到值决定如何进展下一步操作。
在经过范围内,筛选器分外处理回调函数是独一无二的,设置了2个新的回调函数后,原来的就失效了。

啥意思,正是你提供贰个函数,当程序出错了系统会调用这些函数,固然那一个回调就两个,那么大家能够保存一下,当大家设置新的时候,也能够调用旧的,然则这一个貌似不行使

看下API 和回调函数

API,和API原型:

SetUnhandledExceptionFilter  //设置贰个格外处理回调

LPTOP_LEVEL_EXCEPTION_FILTER SetUnhandledExceptionFilter(
  LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter 
);

MSDN图片

王者荣耀 7

非常粗大略,大家写个回调,然后传入函数的指针即可.

要是大家打消分外处理,则用

UnhandledExceptionFilter 

 

回调函数的装置

LONG __stdcall 自己的回调函数名字(__EXCEPTION_POINTERS *ExceptionInfo)
{
  MessageBoxA(NULL,NULL,NULL,NULL);
  return 0;    
}

且看本人写一个当真的万分处理C/C++程序

实际上很不难,正是给个回调,设置一下就完了.

看下C++代码

#include <stdio.h>
#include <windows.h>
LONG __stdcall MyException(_EXCEPTION_POINTERS *Ecptpoints)
{
    MessageBox(NULL, NULL, NULL, NULL);
    return 0;
}
int main(_In_ int _Argc, _In_reads_(_Argc) _Pre_z_ char ** _Argv, _In_z_ char ** _Env)
{

    SetUnhandledExceptionFilter(MyException); //设置异常的回调函数,如果有异常,操作系统会调用我们给的回调
    int *pNum = NULL;  
    *pNum = 1;      //这里故意引发异常,空指针异常
    return 0;
}

咱俩打开程序,看看会怎样的结果

王者荣耀 8

因为空指针卓殊了,所以操作系统调用了大家的回调函数,而在回调函数里面大家谢了MsgBox,所以弹框了

可是我们点击分明,又会产出系统崩溃,我们看下

王者荣耀 9

怎么?,对了,我们没有调用退出函数,也正是没有调用  

ExitProcess 退出进程

调用了就足以了.

而是,猜错了,就算大家调用退出进度能够消除难题,可是结果不是那般的,那和平谈判会议调用的重临值有关,且看下文

详解回调重返值

5:比如西浙大学的三个人专家就透过商量表示:媒体中的暴力情节与攻击性的相关涉嫌比二手烟的致癌性、铅中毒导致的智力损伤还要高得多,而玩耍对人的影响力又超过古板媒体类型,因而,游戏中的暴力剧情会促成丧气影响是明确无疑的。#647

2.筛选器至极回调函数的再次来到值难题

他有二种情景:

那里介绍两种,

1.EXCEPTION_CONTINUE_SEAOdysseyCH  宏定义便是 0 
意思正是处理落成之后,不处理了,你跟着处理,上文大家的代码正是如此

2.EXCEPTION_EXECUTE_HANDLE奥迪Q3  宏定义便是1 
意思正是自作者处理完了,不让下方处理了,也就代表那结束进度

内外多个协调MSDN查询把 🙂

6:事实上,《王者荣耀》恐怕便是手游“碎片化”与“重度”的最好意味着,MOBA游戏(Multiplayer
Online Battle
Arena,多少人在线战术竞赛游艺)的重度沉浸特征与平均1五分钟左右的每局时间长度让它既能吸引玩家的兴味,又不会过分占用用户时间。#749

3.筛选器卓殊的反调试功效

何以这么说,上面大家用非凡输出了二个音信框,可是以往我们在里面藏着大家的代码,假设大家调节和测试,

那正是说分外就会被OD接受,也正是说大家的要命函数不会到的,也就不会输出了.比如

王者荣耀 10

以此是我们地点的代码,首先给eax清空,然后 又把1
给空地址写入内容,所以发生分外了.

唯独注意,那些只是大家的代码,而小编辈选择回调函数能学有所成输出字符串,所未来后那里OD调节和测试的时候,则会承受相当

大家找下我们参数在何地

王者荣耀 11

能够观察,大家压栈的参数则是
回调函数的地点,大家跳转到那里,则足以见到大家的代码了

王者荣耀 12

因为我们是Debug版本,所以里面多了一程JMP跳转

具体怎么写大家温馨调节

7:而他的竞争对手们则都认为腾讯的张罗优势变为那款游戏分别于他者的最根本原由之一。某玩耍厂商职员就直接对记者表示“社交成分”是《王者荣耀》成功的“最大助推力”。#774

4.回调函数的参数难题

今后我们得以看下参数了,大家掌握回调函数有二个参数,那么些参数首要保存了错误新闻

看下内容是何许

typedef struct _EXCEPTION_POINTERS {
    PEXCEPTION_RECORD ExceptionRecord;    //保存异常信息的结构体
    PCONTEXT ContextRecord;           //保存但是寄存器信息的结构体
} EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;

能够看看在那之中依然嵌套了结构体

首先个结构体的意义: 主要保存卓殊音信,例如错误代码,产生错误的地址等等…

其次个结实提的效能:
首要保存了而是错误音讯发生的时候的寄存器音信,记录了EIP,而笔者辈知道EIP保存了脚下错误地址的信息

那正是说具体进展看下把,即便没兴趣,则不用看了,直接看下方的目录即可.

第三个结构体消息:

typedef struct _EXCEPTION_RECORD { 
  DWORD ExceptionCode;                 //保存了错误代码
  DWORD ExceptionFlags;                 //保存了错误标志
  struct _EXCEPTION_RECORD *ExceptionRecord;    //类似于链表,继续保存错误信息(异常链)
  PVOID ExceptionAddress;               //错误发生的时候的地址
  DWORD NumberParameters;               //个数
  ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
} EXCEPTION_RECORD, *PEXCEPTION_RECORD;      //附加数组

后天我们只关切错误代码,以及错误的地址即可.

看下第贰个结构体消息:

typedef struct _CONTEXT {

    //
    // The flags values within this flag control the contents of
    // a CONTEXT record.
    //
    // If the context record is used as an input parameter, then
    // for each portion of the context record controlled by a flag
    // whose value is set, it is assumed that that portion of the
    // context record contains valid context. If the context record
    // is being used to modify a threads context, then only that
    // portion of the threads context will be modified.
    //
    // If the context record is used as an IN OUT parameter to capture
    // the context of a thread, then only those portions of the thread's
    // context corresponding to set flags will be returned.
    //
    // The context record is never used as an OUT only parameter.
    //

    DWORD ContextFlags;

    //
    // This section is specified/returned if CONTEXT_DEBUG_REGISTERS is
    // set in ContextFlags.  Note that CONTEXT_DEBUG_REGISTERS is NOT
    // included in CONTEXT_FULL.
    //

    DWORD   Dr0;    
    DWORD   Dr1;
    DWORD   Dr2;
    DWORD   Dr3;      //这些寄存器我们没见过,主要是Dr0 - 3 是我们OD中硬件断点使用的,而 6 - 7是内存断点使用,具体设置寄存器,有专门的API
    DWORD   Dr6;
    DWORD   Dr7;

    //
    // This section is specified/returned if the
    // ContextFlags word contians the flag CONTEXT_FLOATING_POINT.
    //

    FLOATING_SAVE_AREA FloatSave;

    //
    // This section is specified/returned if the
    // ContextFlags word contians the flag CONTEXT_SEGMENTS.
    //

    DWORD   SegGs;
    DWORD   SegFs;
    DWORD   SegEs;
    DWORD   SegDs;

    //
    // This section is specified/returned if the
    // ContextFlags word contians the flag CONTEXT_INTEGER.
    //

    DWORD   Edi;
    DWORD   Esi;
    DWORD   Ebx;
    DWORD   Edx;
    DWORD   Ecx;
    DWORD   Eax;

    //
    // This section is specified/returned if the
    // ContextFlags word contians the flag CONTEXT_CONTROL.
    //

    DWORD   Ebp;
    DWORD   Eip;
    DWORD   SegCs;              // MUST BE SANITIZED
    DWORD   EFlags;             // MUST BE SANITIZED
    DWORD   Esp;
    DWORD   SegSs;

    //
    // This section is specified/returned if the ContextFlags word
    // contains the flag CONTEXT_EXTENDED_REGISTERS.
    // The format and contexts are processor specific
    //

    BYTE    ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];

} CONTEXT;

可以观察,这些就是保存然则错误的时候的寄存器的条件

乐乎IBinary原创  博客连接:http://www.cnblogs.com/iBinary/

转发请表明出处,多谢

8:低端在线娱乐,与其说是因为收益率较低纯属打发无聊的大运,不如说在硬件上败给了手游的造福火速,在体验感上败给了单机的游戏性。#933

三丶修改寄存器,和收获寄存器的值,以及寄存器注入

简短的一场我们也知道了

此处大约提一下,大家得以行使API来设置寄存器的音信,也足以收获

分别是

SetThreadContext    //设置寄存器音讯

GetThreadContext    //获取寄存器消息

 

看下SetThreadContext的效果

BOOL SetThreadContext(
  HANDLE hThread,            // handle to thread
  CONST CONTEXT*lpContext   // context structure
);

此地她需求八个线程的句柄,还亟需二个ConText结构体

地点说了这一个结构体中保留的寄存器,所以大家给二个结构体则可以设置

此间关键回顾提一下

留神,大家得以用那几个做2个注入

您能够修改EIP的值,让它成为loadlibray的地点,那样能够不要求创立远程现成

此地质大学约提下,因为时间涉及,没时间细写了

/*
1.OpenThread     打开一个线程
2.SuspendThread 暂定这个线程
3.VirtualAllocEX    申请空间
4.WriteProcessMemory  写入DLL路径
5.修改Eip
6.ResumeThread  启动线程
....
*/
具体先看下网上的内容,时间关系,后面写

 明日首倘诺代码没有课堂资料

博客园IBinary原创  博客连接:http://www.cnblogs.com/iBinary/

转发请阐明出处,多谢

 

9:“有钱就足以犯错。”那条中国休闲游的铁律已然过时。在马丹看来,《王者荣耀》之所以拉动了新一代玩家的浪潮,正是因为相对公平的游戏规则。#964

10:你能够禁止孩子玩电子游戏,但那并不比“散养”更高明。最好的法门是作育孩子自笔者管理的习惯,天天玩一个钟头之内。与此同时,则要尽量督促他到露天运动。#1411

11:“撤稿就是不是认切磋成果的客观性。韩春雨的试行结果人家不可能再一次,本身又拿不出新的数目,撤稿是不可或缺的。主动撤稿,只是一种程序上的礼貌。”中国社会科学院教育学钻探所商讨员段伟文说。#1573

12:纵然小保方晴子事件对扶桑物医学家的名气造成了宏伟影响,让日本理化商量所碰着了巨大损失,可是东瀛生化切磋所尊重科学、勇于担责、干净利落回应困惑的神态和做法,也获取了国际同行的注重。#1733

13:也等于说,海外早在20年前就把吗啡丰裕用于解决癌症晚期病者的呼吸困难,使伤者临终前憋气的感想能获得明显缓和。#2307

14:在美利坚合众国等较发达国家,医务卫生职员超表达书用药是还不错的……中华人民共和国那上边的鲜明相对贫乏,直到中华夏族民共和国药学会于二〇一五年五月宣布了《中华夏族民共和国药学会超表明书用药材专科学校家共同的认识》,建议“超表达书用药必须有丰裕的文献电视发表、循证军事学探讨结果等证据支撑”,并将现实证据分为多少个级次,以展现不相同的引进强度。#2367

15:刘端祺认为,笔者国是唯一因为鸦片在邻里打过三回大战的国度,对吗啡有很深的恐惧心境;其余,历史上海南大学学名鼎鼎人物“刮骨疗伤”等正是痛的有趣的事影响深切,使得我们甘愿歌颂“忍痛文化”。直到明日,笔者国人口占满世界的1/5,但吗啡的使用量还相差全球的5%。#2401

16:那四个人物医学家以为,暴涨理论建立于一多级的误会之上。实际上依据当前的钻研,要发生宇宙膨胀,对于伊始标准的供给一定严峻,另一方面,暴涨一旦发生,又会招致永久的膨大——那又会发生其余的题目。#3307

17:从某种角度讲,那是极限格局的“治未病”,因为物历史学家已经知道病因在哪个地方,便足以经过基因编辑手段提前将其勘误复原。#3386

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website