当前位置: 首页 > news >正文

游戏设计师网站有哪些旗袍网站架构

游戏设计师网站有哪些,旗袍网站架构,网站建设部分费用会计科目,建设网站项目总结Win32汇编学习笔记09.SEH和反调试-C/C基础-断点社区-专业的老牌游戏安全技术交流社区 - BpSend.net SEH - structed exception handler 结构化异常处理 跟筛选一样都是用来处理异常的,但不同的是 筛选器是整个进程最终处理异常的函数,但无法做到比较精细的去处理异常(例如处理…Win32汇编学习笔记09.SEH和反调试-C/C基础-断点社区-专业的老牌游戏安全技术交流社区 - BpSend.net SEH - structed exception handler 结构化异常处理 跟筛选一样都是用来处理异常的,但不同的是 筛选器是整个进程最终处理异常的函数,但无法做到比较精细的去处理异常(例如处理某个函数的异常), 跟 C 的 try { } catch { } 的思路一脉相承, SHE 实现的 就是 函数自己 来处理自己的异常,实现方式就是通过回调函数实现的,把回调函数注册给操作系统,当你函数内部出现异常时,系统就会调用你的回调函数,此时就可以处理了,处理完之后可以继续执行代码或者把异常交给筛选器 因此要使用SHE只需要做2件事,1是自己实现异常回调函数,2是吧异常回调函数注册给系统 把函数注册给系统的方式就是 把函数地址 存到 fs:[0] 就可以了 可以看到 偏移为0 的位置 是一个异常链 表, , 记录的是一个结构体指针 因此我们需要构造一个结构体 , 把 函数地址 放到 Handler 回调函数声明在 msdn 是没有定义,这是微软没有文档化的函数,但是在微软 C 库的 实现用了,可以直接到里面去搜 参数: 第一个 异常记录 (异常信息) 第二个 不用管 第3个环境记录 (寄存器环境) 第4个也可以不用管 第2个和第4个是给嵌套异常和展开异常用的 声明 第3个和第四个也是给 嵌套异常 和展开异常用的 .586 .model flat,stdcall option casemap:noneinclude windows.incinclude user32.incinclude kernel32.incincludelib user32.libincludelib kernel32.lib;构造结构体 异常回调函数结构体 EXCEPTION_REGISTRATION_RECORD strucNext dd 0 ;调用这异常回调函数函数结构体指针Handler dd 0 ;当前异常回调函数地址 EXCEPTION_REGISTRATION_RECORD ends.datag_szF0 db F0,0g_szF1 db F1,0.codeassume fs:nothing ;对fs的类型进行强转;处理 F1 异常的回调函数 F1Handler proc uses esi pER:ptr EXCEPTION_RECORD, pFrame:dword, pContext:ptr CONTEXT, pDC:dwordinvoke MessageBox, NULL, offset g_szF1, NULL, MB_OK;ExceptionContinueExecution, - 程序继续执行;ExceptionContinueSearch, - 此异常我不处理交给其它处理;异常交给F0 的 异常回调函数处理mov eax, ExceptionContinueSearch ;返回异常处理方式 不然会直接退出ret F1Handler endp ;产生异常函数 F1 F1 procLOCAL err:EXCEPTION_REGISTRATION_RECORDLOCAL dwOldSeh:dword ;原先的过程函数地址;保存调用者的异常回调函数mov eax, fs:[0]mov dwOldSeh, eax ;保存调用者回调函数地址 到 next,不然无法找到调用者异常函数处理的地址mov eax, fs:[0]mov err.Next, eax ;注册异常回调mov err.Handler, offset F1Handlerlea eax, errmov fs:[0], eax;产生异常xor esi, esidiv esi;卸载SEH 还原过程函数(不然 F0 产生的异常会又回来)mov eax, dwOldSehmov fs:[0], eaxret F1 endp ;处理 F0 异常的回调函数 F0Handler proc pER:ptr EXCEPTION_RECORD, pFrame:dword, pContext:ptr CONTEXT, pDC:dwordinvoke MessageBox, NULL, offset g_szF0, NULL, MB_OK;处理 F1 产生的除0异常 assume esi:ptr EXCEPTION_RECORD ;类型强转mov esi, pER ;将 异常信息 pER 给 esi .if [esi].ExceptionCode EXCEPTION_INT_DIVIDE_BY_ZERO ;如果是除0异常;处理跳过产生异常的代码mov esi, pContextassume esi:ptr CONTEXTadd [esi].regEip, 2 ;除0指令是2个字节 regEip 是返回的地址assume esi:nothingmov eax, ExceptionContinueExecution ;返回异常处理方式 不然会直接退出ret.endifassume esi:nothingret F0Handler endp;产生异常函数 F0 F0 procLOCAL err:EXCEPTION_REGISTRATION_RECORDLOCAL dwOldSeh:dword;保存调用者的异常回调函数mov eax, fs:[0]mov dwOldSeh, eax;保存调用者回调函数地址 到 next,不然无法找到调用者异常函数处理的地址mov eax, fs:[0]mov err.Next, eax;注册异常mov err.Handler, offset F0Handler ;存入异常回调函数地址lea eax, errmov fs:[0], eaxinvoke F1;产生异常mov eax, 1211hmov [eax], eax;卸载SEHmov eax, dwOldSehmov fs:[0], eaxret F0 endpstart:invoke F0xor eax, eaxinvoke ExitProcess,eax end start 异常链 : SEH链 尾结点是系统默认的异常函数处理地址 但是我们一般不会像上面写 因为结构体是2成员, 一个是调用者的异常回调函数信息结构体地址 , 一个是自己的异常回调函数地址,都是 4字节 那么我们只需要在栈上 push 2个 dword(2个地址指针) ,就可以了 .586 .model flat,stdcall option casemap:noneinclude windows.incinclude user32.incinclude kernel32.incincludelib user32.libincludelib kernel32.lib.datag_szF0 db F0,0g_szF1 db F1,0.codeassume fs:nothingF1Handler proc uses esi pER:ptr EXCEPTION_RECORD, pFrame:dword, pContext:ptr CONTEXT, pDC:dwordinvoke MessageBox, NULL, offset g_szF1, NULL, MB_OK;ExceptionContinueExecution, - 程序继续执行;ExceptionContinueSearch, - 此异常我不处理交给其它处理mov eax, ExceptionContinueSearchret F1Handler endp F1 proc;注册SEHpush offset F1Handler ; handler push 自己异常回调函数的地址push fs:[0] ;next ;push 调用者异常处理结构体信息地址mov fs:[0], esp ;注册回调函数,移位此时esp 存的就是结构体首地址xor esi, esidiv esi;卸载SEHpop fs:[0] ;把 next 弹回 fs:[0] add esp, 4 ;平栈,因为自己的异常回调函数地址不需要弹栈,直接丢弃ret F1 endp F0Handler proc pER:ptr EXCEPTION_RECORD, pFrame:dword, pContext:ptr CONTEXT, pDC:dwordinvoke MessageBox, NULL, offset g_szF0, NULL, MB_OKassume esi:ptr EXCEPTION_RECORDmov esi, pER.if [esi].ExceptionCode EXCEPTION_INT_DIVIDE_BY_ZERO;处理跳过产生异常的代码mov esi, pContextassume esi:ptr CONTEXTadd [esi].regEip, 2assume esi:nothingmov eax, ExceptionContinueExecutionret.endifassume esi:nothingret F0Handler endpF0 proc;注册异常; | next | --esp; | Fohandler | push offset F0Handler ;handler ;push 自己异常回调函数的地址push fs:[0] ;next ;push 调用者异常处理结构体信息地址mov fs:[0], esp ;注册回调函数,移位此时esp 存的就是结构体首地址invoke F1;产生异常mov eax, 1211hmov [eax], eax;卸载SEH pop fs:[0] ;把 next 弹回 fs:[0] add esp, 4 ;平栈,因为自己的异常回调函数地址不需要弹栈,直接丢弃ret F0 endpstart:invoke F0xor eax, eaxinvoke ExitProcess,eax end start 反调试 一切阻止调试的方法都被称为反调试 在 OD 或者 x32Dbg 中下断点时,他会插入一行代码,但在调试器中看不出来的 那就是把这一行指令在内存的第一个字节改成了 CC (int 3) 当 TF 被置位 为 1 时 ,执行一行代码 就会 抛出异常,抛出异常之后就会恢复为 0,因此可以不断通过 改变 TF 位,来判断每一行代码,判断是否被下断点 .586 .model flat,stdcall option casemap:noneinclude windows.incinclude user32.incinclude kernel32.incincludelib user32.libincludelib kernel32.lib.datag_szCaption db 友情提示,0g_szText db 你干嘛调试我,0g_szText2 db 结束了, 0g_ddEnd dd 0 ;函数结束地址.codeassume fs:nothingFuncTest proc;存储mov g_ddEnd, offset ENDTF ;保存函数结束位置;设置TF标志位 (将值置为1 就会抛异常)pushfdor dword ptr [esp], 100hpopfdxor eax, eaxxor eax, eaxxor eax, eaxxor eax, eaxxor eax, eaxxor eax, eaxxor eax, eaxxor eax, eaxxor eax, eaxxor eax, eaxxor eax, eaxxor eax, eaxxor eax, eaxxor eax, eaxENDTF:retFuncTest endp;异常回调函数,将 TF 置位 F0Handler proc uses esi edi pER:ptr EXCEPTION_RECORD, pFrame:dword, pContext:ptr CONTEXT, pDC:dwordassume esi:ptr EXCEPTION_RECORDmov esi, pERmov edi, pContextassume edi:ptr CONTEXT;判断mov eax, [edi].regEip.if byte ptr [eax] 0cch ;指令的第一个字节是CC 说明被调试;被设置断点了invoke MessageBox, NULL, offset g_szText, offset g_szCaption, MB_OKinvoke ExitProcess, 0 ;退出进程.endif;结束mov eax, g_ddEnd.if [edi].regEip eax ;程序结束, TF就不需要置位了mov eax, ExceptionContinueExecutionret.endif;继续设置TF标志位or [edi].regFlag, 100hmov eax, ExceptionContinueExecutionassume edi:nothingassume esi:nothingret F0Handler endpF0 proc;注册异常; | next | --esp; | Fohandler | push offset F0Handler ;handlerpush fs:[0] ;nextmov fs:[0], espinvoke FuncTest;卸载SEHpop fs:[0]add esp, 4ret F0 endpstart:invoke F0invoke MessageBox, NULL , offset g_szText2, NULL, MB_OKxor eax, eaxinvoke ExitProcess,eax end start对于部分调试器,他会接收所有异常,这种处理方式就是 把 主要代码放在异常中实现 异常很多时候都被用作反调试 对抗反调试的方法: 把代码分成多块,每块做加密,执行每块代码之前 先进异常还原,还原之后再进异常变成加密状态,因为不解密前面的代码,无法知道后面的代码去哪 处理方法:代码追踪,把执行的每一行代码记录下来 把代码放到堆里面,在堆里面执行完再回到代码区,这样代码追踪就失效了,因为重启地址就变了
http://www.hkea.cn/news/14259863/

相关文章:

  • h5 网站模板全屏类网站
  • 番禺网站建设怎么样注册安全工程师报名时间
  • 西安微网站制作做网站需要哪些框架
  • 教育机构网站建设方案个人网页设计作品排版
  • 众筹网站建设报价如何自学软件开发
  • 出名的网站制作正规公司局域网视频网站开发
  • 龙岗网站开发公司潍坊知名网站建设价格
  • 带数据库网站设计wordpress自定义文章分类
  • 下载jsp网站开发用啥工具wordpress网页登陆
  • 北京网站建设公司制作网站wordpress 中文付费主题
  • 在线做初中题网站wordpress 微博
  • 定制彩票网站开发1688手工活外发加工网
  • js怎么做网站企业网d1net
  • wordpress大学主惠州百度关键词优化
  • 无锡加盟网站建设外贸流程实训报告
  • 沈阳企业制作网站最新注册公司流程及费用
  • 特色的企业网站建设如何自己做网站赚钱
  • 所有爱做网站产品互联网营销推广
  • 微信网站怎么做的好处wordpress站点图标
  • 昆明制作网站公司网站如何做背景音乐
  • 广州化妆品网站设计企业网站建设需要哪些费用
  • win7本地架设网站河间网站建设公司
  • 厦门企业建站模板网站建设代码走查
  • 静态网站做等级保护深圳营销型网站制作建设
  • 2345网址导航官网下载安装东莞网站优化怎样
  • 网上代理 建网站如何做好网站站内优化
  • 厦门 外贸商城网站制作网站排名优化方案
  • 企业网站seo优化交流电子手工外发加工网
  • 商业网站建设案例教程微信朋友圈怎么投放广告
  • 移动微网站开发平面设计主要做什么工作