易语言教程_易语言源码_易语言视频教程_易语言论坛

 找回密码
 点击注册

Vip新手入门区
新手学习指南  学员作品展示 Vip课程总纲  Vip绝密课程系列

Vip相关下载区
Vip模块下载   Vip模块绑定   Vip模块例子 魔鬼插件下载  魔鬼插件例子  教程工具下载

Vip论坛服务区
教程问题提问区   模块问题提问区 技术交流区   魔鬼插件建议   忘记密码找回

VIP会员办理QQ: 8643245   
【请先加好友,然后到好友列表双击联系客服,办理VIP会员。】
【基础篇】易语言辅助入门基础教程
VIP模块办理QQ: 7189694 办理正版魔鬼作坊VIP模块 【基础篇】OD与CE入门基础教程
办理【终身VIP会员】“秒杀价” 仅需 RMB278.00元… 【基础篇】零基础绝密汇编语言入门课程 (共26课已完成)…
办理VIP详情…猛击这里查看详情 【基础篇】VIP辅助入门基础教程-新手必学 已发布10课 ……
VIP教程免费试看章节…猛击下载 【第1款】制作“辅助挂”教程目录查看(共107+16_x64下更新课已完成)…
亲爱的VIP学员,请到此写下你学习的感受与发布作品截图… 【第2款】制作“任务挂”教程目录查看(共77+1_x64下更新课已完成)…
卍解吧!不用bp send类封包断点找CALL的各种通杀思路 【第3款】驱动过保护技术课程(共38课已完成)…
【绝密教程】VIP绝密教程系列---注意:随时会更新! 【第4款】VIP邪恶二叉树辅助课程 (共31+17_x64下更新课已完成)…
【精品第13款】3D射击游戏与页游透视 智辅课程 已完成17课… 【第5款】零基础易语言按键辅助教程 (30课已完成)…
【精品第14款】变态功能辅助是如何炼成的 已完成36课… 【第6款】从零开始学习封包辅助技术教程(20课已完成) …
【精品第15款】DNF商业变态辅助的修炼之路 已完成27课… 【第7款】大杀特杀分析来源与CALL吸血鬼课程 (56课已完成)
【精品第16款】中控台多线程多开自动化商业辅助课程 已完成66课… 【第8款】完全零基础网页辅助课程(40课已完成)
【全新精品第17款】检测原理与过游戏内存检测技术课程 已发布9课… 【第9款】自动登录与操控LUA技术课程 (共46+8_x64下更新课已完成)…
【全新精品第18款】手游全自动化任务脚本辅助课程 已发布25课…… 【第10款】网页辅助封包脱机进阶课程 已完成30课…
【全新精品第19款】D3D方框骨骼透视与自瞄辅助课程进阶篇 已发布34课…… 【第11款】VC++ Lua脚本辅助课程 已完成112课…
【全新精品第20款】 X64模拟器吃鸡游戏方框透视自瞄辅助课程 发布中... 【第12款】网游脱机封包智辅课程 已完成35课…
查看: 2312|回复: 0

简单分析某游戏debugport清零

[复制链接]

53

主题

109

回帖

134

积分

终身VIP会员

Rank: 7Rank: 7Rank: 7

魔鬼币
55135
发表于 2011-1-21 15:46:36 | 显示全部楼层 |阅读模式
简单分析,小弟能力有限如果有什么错误的话,欢迎各位牛牛指正,共同进步嘛

第一处清零代码

  1. mov     edi, edi
  2. push    ebp
  3. mov     ebp, esp
  4. push    ecx
  5. push    esi
  6. mov     [ebp+var_1], 0
  7. call    ds:KeGetCurrentIrql
  8. cmp     al, 2 //判断中断级
  9. mov     esi, offset SpinLock
  10. mov     ecx, esi      
  11. jb      short loc_1002660
  12. call    ds:KefAcquireSpinLockAtDpcLevel
  13. mov     [ebp+var_1], 1
  14. jmp     short loc_1002669
复制代码
loc_1002660:

  1. call    ds:KfAcquireSpinLock
  2. mov     [ebp+NewIrql], al
复制代码
loc_1002669:

  1. mov     ecx, dword_100D1C0  //这里比较关键啦。 dword_100D1C0 这个全局变量很重要                 
  2. mov     edx, offset dword_100D1C0
  3. cmp     ecx, edx
  4. jz      short loc_10026BA// 这个是个关键比较啦
  5. push    ebx
  6. push    edi
复制代码
loc_100267A:

  1. mov     edi, dword_100CEDC  //这里存放着EPROCESS的下标
  2. mov     edi, [edi+4]        //CEDC+4的位置正是BC
  3. add     edi, [ecx-34h]     //[D1C0-34]的位置存放着EPROCESS结构的地址
  4. xor     eax, eax
  5. xchg    eax, [edi]        //清零
  6. mov     eax, dword_100CEDC
  7. mov     ebx, [ecx-2Ch]  //存放着EPROCESS+70位置的内容
  8. mov     eax, [eax+18h]  //CEDC+18位置存放70下标
  9. mov     edi, [ecx-34h]//EPROCESS结构的地址
  10. mov     [eax+edi], ebx  //写回去防止修改位置
  11. mov     ebx, [ecx-28h] //74的内容
  12. mov     [eax+edi+4], ebx//写回去
  13. mov     edi, dword_100CEDC
  14. mov     edi, [edi+1Ch] //取78位置
  15. add     edi, [ecx-34h]
  16. xor     eax, eax       //写回去
  17. stosd
  18. stosd
复制代码
上面这一段把EPROCESS+70,74,78的位置全部封杀了
防止把BC的位置修改为70,74,78,所以曾经某种方法改位置变得无效了               
      
第2段清零位代码,这里有个检测

  1.                                mov     edi, edi
  2.                                push    ebp
  3.                                mov     ebp, esp
  4.                                push    ecx
  5.                                push    ecx
  6.                                push    ebx
  7.                                xor     ebx, ebx
  8.                                push    esi
  9.                                mov     ecx, offset SpinLock
  10.                                mov     byte ptr [ebp-1], 1
  11.                                mov     [ebp-8], ebx
  12.                                call    ds:KfAcquireSpinLock
  13.                                mov     esi, dword_100D1C0 //这里同1的注释  这个变量很重要
  14.                                cmp     esi, offset dword_100D1C0//这里同1的注释一样
  15.                                mov     [ebp-2], al
  16.                                jz      loc_1004FE9 //关键跳
  17.                                mov     [ebp-1], bl
  18.                                push    edi
复制代码
loc_1004F62:

  1.                                mov     eax, dword_100CEDC //这里存放着EPROCESS的下标
  2.                                mov     eax, [eax+4]      //CEDC+4的位置正是BC   
  3.                                lea     edi, [esi-34h]  //[D1C0-34]的位置存放着EPROCESS结构的地址 注意这里是取地址
  4.                                add     eax, [edi]     //指到BC处
  5.                                xor     ebx, ebx         
  6.                                xchg    ebx, [eax]  //清零
  7.                                xor     eax, eax
  8.                                cmp     [ebp-8], eax
  9.                                jnz     short loc_1004F83
  10.                                cmp     ebx, eax
  11.                                jz      short loc_1004F83
  12.                                mov     ecx, [edi]
  13.                                mov     [ebp-8], ecx
复制代码
loc_1004F83:

  1.                                mov     ecx, 1505h
  2.                                movsx   edx, byte ptr [edi+eax] //这段算法主要是检测有没有被修改如果有的话就重启机器
  3.                                imul    ecx, 21h   //edi存放着EPROCESS的地址,有兴趣的朋友可以逆下
  4.                                add     ecx, edx
  5.                               inc     eax
  6.                               cmp     eax, 18h
  7.                               jb      short loc_1004F88
  8.                               cmp     ecx, [edi+1Ch] //1CH处存放着检验值 1CH+4位置存放着进程名
  9.                               jz      short loc_1004FA1
  10.                                call    sub_100163C //重启机器
复制代码
其实这里注意dword_100D1C0 变量这里很重要。                                          

这2个都好搞定,关键是有个监控
  1.                      mov     edi, edi
  2.                                push    ebp
  3.                                mov     ebp, esp
  4.                                sub     esp, 10h
  5.                               mov     eax, dword_100CA6C //CA6C=CF;
  6.                               push    ebx
  7.                               push    esi
  8.                               push    edi
  9.                               mov     edi, offset unk_100CA68
  10.                               sub     edi, 0CA68h  //EDI=模块载入地址
  11.                               lea     ecx, [eax+eax*2]//EAX=CF;
  12.                               shl     ecx, 2         //这步计算我估计应该是得出了100B268总大小
  13.                               push    0
  14.                              mov     [ebp+var_10], edi
  15.                              mov     [ebp+var_4], ecx
  16.                              pop     edx
  17.                              jz      short loc_100422B
复制代码
loc_100420C:
  1.                       movzx   esi, byte_100B268[edx]/*
  2.                            100B268这个变量指向一个结构 这个结构类似 struct{ULONG PY(偏移),INT LEN,ULONG HASH}
  3.                             CRC检验,估计是黑白名单之类的,我的猜测,如果有错那位朋友知道的话帮我纠正一下
  4.                          */   
  5.                           mov     ebx, [ebp+var_4]
  6.                            shr     ebx, 1Bh
  7.                            xor     esi, ebx
  8.                             mov     ebx, [ebp+var_4]
  9.                            shl     ebx, 5
  10.                             xor     esi, ebx
  11.                            inc     edx
  12.                           cmp     edx, ecx
  13.                          mov     [ebp+var_4], esi
  14.                         jb      short loc_100420C
复制代码
loc_100422B:
  1.                       cmp     [ebp+var_4], 17606A55h //上面一系列的计算和(17606A55计算后的总大小)比较,如果被修改了就重启
  2.                       jz      short loc_100423E
  3.                       call    sub_100163C  //重启
  4.                       mov     eax, dword_100CA6C
复制代码
loc_100423E:
  1.                      and     [ebp+var_C], 0
  2.                      test    eax, eax
  3.                      jbe     short loc_100429F //这个跳可以修改
  4.                      mov     esi, offset unk_100B26C
复制代码
loc_100424B:
  1.                     mov     ecx, [esi-4] //ECX==STRUCT结构的PY偏移
  2.              mov     edx, [esi]
  3.                     and     [ebp+var_8], 0
  4.                     add     ecx, edi   //加上模块载入地址址  
  5.               test    edx, edx
  6.                     mov     [ebp+var_4], edx
  7.                     jbe     short loc_1004282
复制代码
loc_100425D:
  1.                    mov     edi, [ebp+var_8]
  2.                    movzx   edi, byte ptr [ecx+edi] //取出PY下面的值来计算HASH
  3.                    mov     ebx, [ebp+var_4]
  4.                    shr     ebx, 1Bh
  5.                    xor     edi, ebx
  6.                    mov     ebx, [ebp+var_4]
  7.                    shl     ebx, 5
  8.                    xor     edi, ebx
  9.                    inc     [ebp+var_8]
  10.                    cmp     [ebp+var_8], edx  //edx == STRUCT结构中的LEN
  11.                    mov     [ebp+var_4], edi
  12.                    jb      short loc_100425D
  13.                    mov     edi, [ebp+var_10]
  14.                    mov     ecx, [ebp+var_4]
  15.                    cmp     ecx, [esi+4]   //经过一系列运算比较是不是STRUCT中的HASH
  16.                    jz      short loc_1004294 //相同就跳
  17.             call    sub_100163C //不同就重启
  18.             mov     eax, dword_100CA6C
复制代码
loc_1004294:
  1.                   inc     [ebp+var_C]
  2.                   add     esi, 0Ch
  3.                   cmp     [ebp+var_C], eax
  4.                   jb      short loc_100424B
  5.                   pop     edi
  6.                   pop     esi
  7.                   pop     ebx
  8.                   leave
  9.                  retn
复制代码
重启代码
  1.           in      al, 64h      
  2.                mov     bl, al
  3.                test    bl, 1
  4.                jz      short loc_1001660
  5.                in      al, 60h         
  6.                test    bl, 2
  7.                jnz     short loc_1001655
  8.                mov     al, 0FEh
  9.                out     64h, al         
  10.                popa
  11.                retn
复制代码
解决方法很多,我说几种

第一种是我以前用的一种比较挫的,其实最重要的是解决监控哪里,
     分2步 1。在监控哪里 跳走或者直接返回         
           2.注意我标的清零的2段代码
           mov     ecx, dword_100D1C0  //这里比较关键啦。                  
           mov     edx, offset dword_100D1C0
                cmp     ecx, edx
                 jz      short loc_10026BA// 这个是个关键比较啦
           在函数开头钩钩一下跳到我们的函数
           处理一下先查找到模块加载地址(Modulebase)。
          伪代码
           ULONG D1C0=Modulebase+0XD1C0;
            _asm{
                mov edi,edi
                push ebp
                mov ebp,esp
                mov eax,D1C0
                mov [eax],eax
                mov eax,Ret(返回地址)
          add eax,5
          jmp eax
   }                    
      jz      short loc_10026BA相等就跳啦

第二种方法 前天看到的,好像更加简便 查看
感谢这位朋友的共享精神;
第三种没尝试
直接修改
       jz      short loc_10026BA   
           jz      loc_1004FE9
           jbe     short loc_100429F

第三种没实践过只是大概估计,有兴趣的朋友可以尝试一下。多实践总不会错
至于那些SSDT HOOK呀inline-hook要我相信大部分人都能解决的。
本人能力有限。此文章如果有什么不正确的地方,希望大家指正一下,共同学习,共同进步嘛。
您需要登录后才可以回帖 登录 | 点击注册

本版积分规则

魔鬼作坊|易语言教程|易语言源码|易语言论坛|易语言视频教程| 论坛导航|免责申明|手机版||网站地图
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表魔鬼作坊立场!
任何人不得以任何方式翻录、盗版或出售本站视频,一经发现我们将追究其相关责任!
我们一直在努力成为最好的编程论坛!
Copyright© 2010-2019 All Right Reserved.
快速回复 返回顶部 返回列表