欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

易语言写的硬件挷定程序爆破(破解一个简单外挂)

程序员文章站 2022-07-07 22:26:49
【文章标题】: 易语言写的硬件挷定程序爆破【文章作者】: v仔【作者邮箱】: vxf155@sina.com【软件名称】: 魔力宝贝外挂【软件大小】: 1.49MB【加壳方式】: 无【保护方式...

【文章标题】: 易语言写的硬件挷定程序爆破
【文章作者】: v仔
【作者邮箱】: vxf155@sina.com
【软件名称】: 魔力宝贝外挂
【软件大小】: 1.49MB
【加壳方式】: 无
【保护方式】: 机器挷定
【编写语言】: 易语言
【使用工具】: OD
【操作平台】: Windows2003
【软件介绍】: 一个游戏的简单外挂,作者写得比较简单。
【作者声明】: 只是感兴趣,没有其他目的。本人菜鸟一个,请各位多多指教!
--------------------------------------------------------------------------------
【详细过程】
  算起来在看雪也是一菜鸟。这是本人的第一篇破文,爆破的大家就不要见笑。
  先向朋友了解一下外挂的行为:
  1、程序就得一个文件,未注册机器不能运行,启动时窗口一闪而过。
  2、运行前要向作者发送机器码,然后作者把能在该机运行的程序发过来。
  3、程序是易语言写的。
  根据这些情况,估计程序是把机器码硬编码到程序里的。
  虽然知道是用易语言写的,但还是要用PEID看看是否有壳。显示Microsoft Visual C++ 6.0,无壳。(第一次非常走运)
  再看看区段,没有发现.ecode,是用新版易语言写的(这个上网查了才知道,OUT了!)。
  在网上搜索了一会,知道大概的处理方法。
  硬件挷定的就找字符串\.PhysicalDrive0
  OD载入,CPU窗口任意位置右键 -> 超级字符串参考 -> 查找ASCII -> \.PhysicalDrive0
  双击后定位到
 
  0046F6AA  |.  53            PUSH    EBX                              ; /hTemplateFile => NULL
  0046F6AB  |.  53            PUSH    EBX                              ; |Attributes => 0
  0046F6AC  |.  6A 03         PUSH    3                                ; |Mode = OPEN_EXISTING
  0046F6AE  |.  53            PUSH    EBX                              ; |pSecurity => NULL
  0046F6AF  |.  6A 03         PUSH    3                                ; |ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE
  0046F6B1  |.  68 000000C0   PUSH    C0000000                         ; |Access = GENERIC_READ|GENERIC_WRITE
  0046F6B6  |.  68 28C45500   PUSH    复件_热?0055C428                 ; |\.PhysicalDrive0
  0046F6BB  |.  FF15 E0B25100 CALL    NEAR DWORD PTR DS:[<&KERNEL32.Cr>; CreateFileA
 
  返回、返回、返回,返回到调用这个函数的地方,发现和网上找到的方法差不多。
  但没能找到看雪论坛上有一个贴子说的哪个通用切入点。
  不管了,返回得了。到了动态库的领空,那么就Ctrl+F9一直执行。回到当前程序后发现EAX已经得到了机器码。
  那就返回调用的地方。
  一般取完机器码后都要对比的,那么下面的函数就有可能是对比的了。一个一个看看。
 
  004182BF  |.  50            |PUSH    EAX
  004182C0  |.  E8 A5D10000   |CALL    复件_热?0042546A                   ;  这个函数取得机器码
  004182C5  |.  8945 E8       |MOV     [LOCAL.6],EAX                      ;  保存返回值
  004182C8  |.  8B5D EC       |MOV     EBX,[LOCAL.5]
  004182CB  |.  85DB          |TEST    EBX,EBX
  004182CD  |.  74 09         |JE      SHORT 复件_热?004182D8
  004182CF  |.  53            |PUSH    EBX
  004182D0  |.  E8 BC780200   |CALL    复件_热?0043FB91                   ;  可疑函数
  004182D5  |.  83C4 04       |ADD     ESP,4
  004182D8  |>  8B5D F0       |MOV     EBX,[LOCAL.4]
  004182DB  |.  E8 759AFEFF   |CALL    复件_热?00401D55                   ;  可疑函数
  004182E0  |.  53            |PUSH    EBX
  004182E1  |.  51            |PUSH    ECX
  004182E2  |.  8B45 F8       |MOV     EAX,[LOCAL.2]
  004182E5  |.  48            |DEC     EAX
  004182E6  |.  79 0D         |JNS     SHORT 复件_热?004182F5
  004182E8  |.  68 04000000   |PUSH    4
  004182ED  |.  E8 AB780200   |CALL    复件_热?0043FB9D
  004182F2  |.  83C4 04       |ADD     ESP,4
  004182F5  |>  59            |POP     ECX
  004182F6  |.  5B            |POP     EBX
  004182F7  |.  3BC1          |CMP     EAX,ECX
  004182F9  |.  7C 0D         |JL      SHORT 复件_热?00418308
  004182FB  |.  68 01000000   |PUSH    1
  00418300  |.  E8 98780200   |CALL    复件_热?0043FB9D
 
  此处略去几行
  最后找到这个,后来才知道如果自己仔细耐心点就不用一个个地找的。
 
  00418319  |.  E8 ED8CFEFF   |CALL    复件_热?0040100B                   ;  比较函数
  0041831E  |.  83C4 08