飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 7930|回复: 17

[分享] 巧用游戏修改器快速定位

  [复制链接]

该用户从未签到

发表于 2010-5-27 15:51:52 | 显示全部楼层 |阅读模式
本帖最后由 月之精灵 于 2010-5-27 17:09 编辑

大牛飘过,不要用鸡蛋砸我哟。
   本人近期迷上了小游戏植物大战僵尸,太阳来得太慢,总是没钱用,于是想了修改一下,于是用OD交游戏载入,看看了不知道总是找不到关键的所在。于是想到了游戏修改器,下载了几个都不能用,偶系统是WIN7。最后找到了个星云游戏修改器,可以用,对太阳的数量进行搜索,通过多次过虑,定位到了内存地址,于是用OD附加进程,在相应的内存地址下硬写入断点。又出太阳了,哈哈,断下了。找到关键代码所在了。这回想怎么改就怎么改。钱多得用不完了。
PYG19周年生日快乐!
  • TA的每日心情
    慵懒
    2019-3-12 17:25
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2010-5-27 16:30:38 | 显示全部楼层
    本帖最后由 whypro 于 2010-5-27 16:40 编辑

    CE吧!最好详细点!
    PYG19周年生日快乐!
  • TA的每日心情
    慵懒
    2019-3-12 17:25
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2010-5-27 16:33:37 | 显示全部楼层
    植物大战僵尸 修改版(一)
    这一段时间,周围很多朋友玩一个叫植物大战僵尸这个游戏,我也耍了一下,是比较好玩,
    可是后面的一些关还是有点难的,于是乎,就用逆向的知识修改一下。
    这里主要修改了3步,
    一 双开
    二 一个阳光改为增加100点阳光值   
    三  所有的武器不消耗阳光数值  
    四 金钱限制突破
    五 暂停功能突破
    第一步,双开功能突破
    这个程序不能双开的,我们来突破这个功能,
    根据跟踪,我们发现了这个下数据
    00553EAD  |.  56            push    esi                              ; |pSecurity => NULL
    00553EAE  |.  FF15 E0206500 call    dword ptr [<&KERNEL32.CreateMute>; \CreateMutexA
    00553EB4  |.  BF 10000000   mov     edi, 10
    00553EB9  |.  39BC24 080100>cmp     dword ptr [esp+108], edi
    00553EC0  |.  8983 F8000000 mov     dword ptr [ebx+F8], eax
    00553EC6  |.  72 10         jb      short 00553ED8
    00553EC8  |.  8B9424 F40000>mov     edx, dword ptr [esp+F4]
    00553ECF  |.  52            push    edx
    00553ED0  |.  E8 C5820C00   call    0061C19A
    00553ED5  |.  83C4 04       add     esp, 4
    00553ED8  |>  C78424 800200>mov     dword ptr [esp+280], -1
    00553EE3  |.  397C24 38     cmp     dword ptr [esp+38], edi
    00553EE7  |.  C78424 080100>mov     dword ptr [esp+108], 0F
    00553EF2  |.  89B424 040100>mov     dword ptr [esp+104], esi
    00553EF9  |.  C68424 F40000>mov     byte ptr [esp+F4], 0
    00553F01  |.  72 0D         jb      short 00553F10
    00553F03  |.  8B4424 24     mov     eax, dword ptr [esp+24]
    00553F07  |.  50            push    eax
    00553F08  |.  E8 8D820C00   call    0061C19A
    00553F0D  |.  83C4 04       add     esp, 4
    00553F10  |>  FF15 B4206500 call    dword ptr [<&KERNEL32.GetLastErr>; [GetLastError
    00553F16  |.  3D B7000000   cmp     eax, 0B7
    00553F1B  |.  75 0C         jnz     short 00553F29                   ;  关键判断
    00553F1D  |.  8B13          mov     edx, dword ptr [ebx]
    00553F1F  |.  8B82 BC000000 mov     eax, dword ptr [edx+BC]
    00553F25  |.  8BCB          mov     ecx, ebx
    00553F27  |.  FFD0          call    eax


    也就是说
    关键判断是 00553F1B

    把这里的jnz改成jmp 就可以了
    好了 第一步完成






    第2步 修改阳光数值

    这里就不用说了 这里的阳光呢,就相当于其他游戏的金钱,我们修改这个就可以了
    先用内存查看工具,查询阳光这个数值在内存中的位置,然后再od当中 DD 这个地址
    下内存写入断点,然后呢,F9运行,你就可以玩了, 当你的程序这个数改变的时候,程序就断下来了,然后我们就可以看到相应的汇编代码,  哈哈
    我们点击阳光, 程序断了下来,我们看到这个
    004309EF  |>  B9 19000000   mov     ecx, 19                     (阳光数值为25)
    004309F4  |.  EB 18         jmp     short 00430A0E
    004309F6  |>  83F8 05       cmp     eax, 5
    004309F9  |.  75 05         jnz     short 00430A00
    004309FB  |.  8D48 0A       lea     ecx, dword ptr [eax+A]
    004309FE  |.  EB 0E         jmp     short 00430A0E
    00430A00  |>  33C9          xor     ecx, ecx
    00430A02  |.  83F8 06       cmp     eax, 6
    00430A05  |.  0F95C1        setne   cl
    00430A08  |.  83E9 01       sub     ecx, 1
    00430A0B  |.  83E1 32       and     ecx, 32
    00430A0E  |>  8B46 04       mov     eax, dword ptr [esi+4]
    00430A11  |.  0188 60550000 add     dword ptr [eax+5560], ecx  (增加阳光数值 )
    按,理说,收集一个阳光,增加25点阳光数值,可是这个有点太少了,我们改成100吧
    好,我们开工
    004309EF   mov     ecx, 19    改成  mov ecx, 64

    第三步 打造免费武器
    好了,只改了阳光数值,还不爽,我们再来改改别的东西,
    我们现在改一下价值100阳光的 豌豆射手),恩 还是那个方法,这次我们可以看到下面指令

    0041BA60  /$  56            push    esi
    0041BA61  |.  8BB7 60550000 mov     esi, dword ptr [edi+5560]
    0041BA67  |.  8BD7          mov     edx, edi
    0041BA69  |.  E8 12FFFFFF   call    0041B980
    0041BA6E  |.  03C6          add     eax, esi
    0041BA70  |.  3BD8          cmp     ebx, eax
    0041BA72  |.  7F 0C         jg      short 0041BA80
    0041BA74  |.  2BF3          sub     esi, ebx       (这里是修改)
    0041BA76  |.  89B7 60550000 mov     dword ptr [edi+5560], esi
    0041BA7C  |.  B0 01         mov     al, 1
    0041BA7E  |.  5E            pop     esi
    0041BA7F  |.  C3            retn

    我们把这个阳光0041BA74 的sub     esi, ebx   
    我们nop掉
    也就是说,这次 ,所有的东西就都是免费的了

    第四步  金钱突破
    大家可以看到,如果有了钱,这个游戏会出现很多好玩的物品,可是这个钱挣得也太慢了,怎么突破呢,看我的。
    先让程序显示缺少金钱的对话框,这时候缺少金钱的相关代码已经可以在OD中找到了,我们很容易找到下面代码

    0048C78E  |.  8B8F 50010000 mov     ecx, dword ptr [edi+150]
    0048C794  |.  8B91 2C080000 mov     edx, dword ptr [ecx+82C]
    0048C79A  |.  3942 28       cmp     dword ptr [edx+28], eax
    0048C79D  |.  8D73 0F       lea     esi, dword ptr [ebx+F]
    0048C7A0  |.  0F8D 1E010000 jge     0048C8C4   (关键判断处)
    0048C7A6  |.  6A 02         push    2
    0048C7A8  |.  68 7C7B6500   push    00657B7C                         ;  好
    0048C7AD  |.  8D4C24 18     lea     ecx, dword ptr [esp+18]
    0048C7B1  |.  897424 30     mov     dword ptr [esp+30], esi
    0048C7B5  |.  895C24 2C     mov     dword ptr [esp+2C], ebx
    0048C7B9  |.  885C24 1C     mov     byte ptr [esp+1C], bl
    0048C7BD  |.  E8 6E7BF7FF   call    00404330
    0048C7C2  |.  899C24 A40000>mov     dword ptr [esp+A4], ebx
    0048C7C9  |.  6A 43         push    43
    0048C7CB  |.  68 A0D96600   push    0066D9A0                         ;  你现在还买不起这个物品。\n去杀僵尸赚取更多钱币。
    0048C7D0  |.  8D4C24 34     lea     ecx, dword ptr [esp+34]
    0048C7D4  |.  897424 4C     mov     dword ptr [esp+4C], esi
    0048C7D8  |.  895C24 48     mov     dword ptr [esp+48], ebx
    0048C7DC  |.  885C24 38     mov     byte ptr [esp+38], bl
    0048C7E0  |.  E8 4B7BF7FF   call    00404330
    0048C7E5  |.  C68424 A40000>mov     byte ptr [esp+A4], 1
    0048C7ED  |.  6A 10         push    10
    0048C7EF  |.  68 E4D96600   push    0066D9E4                         ;      资金不足
    0048C7F4  |.  8D4C24 50     lea     ecx, dword ptr [esp+50]
    0048C7F8  |.  897424 68     mov     dword ptr [esp+68], esi
    0048C7FC  |.  895C24 64     mov     dword ptr [esp+64], ebx
    0048C800  |.  885C24 54     mov     byte ptr [esp+54], bl
    0048C804  |.  E8 277BF7FF   call    00404330


    0048C7A0  |.  0F8D 1E010000 jge     0048C8C4   (关键判断处)
    这一段引起了我们的注意,如果金钱少于价格,则显示不足
    将jge改成jmp就可以了
    (当金钱不足的时候,我们的金钱不会变为负数,只会变成0)
    哈哈,这次我们可以想买什么东西就买什么东西了

    第五步  游戏暂停功能突破

    这个游戏有一个功能,就是当你玩的时候,突然坐别的事情,这个游戏的窗口失去焦点后,就会暂停,这个在有时候是很人性化,可是有时候却很讨厌,比如我要双开,那么只能让一个运行,比如我要又玩这个游戏,又搞别的,那么也不行,所以我们开突破这个暂停功能。
    方法和上一个一样,很容易的找到暂停的窗口,指定的相关代码。

    004502C0  /$  55            push    ebp
    004502C1  |.  8BEC          mov     ebp, esp
    004502C3  |.  83E4 F8       and     esp, FFFFFFF8
    004502C6      64:A1 0000000>mov     eax, dword ptr fs:[0]
    004502CC      6A FF         push    -1
    004502CE      68 88DF6400   push    0064DF88
    004502D3      50            push    eax
    004502D4      64:8925 00000>mov     dword ptr fs:[0], esp
    004502DB      83EC 58       sub     esp, 58
    004502DE      53            push    ebx
    004502DF      56            push    esi
    004502E0      8BF1          mov     esi, ecx
    004502E2      57            push    edi
    004502E3      8BBE 68070000 mov     edi, dword ptr [esi+768]
    004502E9      33DB          xor     ebx, ebx
    004502EB      80BF 64010000>cmp     byte ptr [edi+164], 1
    004502F2      74 4B         je      short 0045033F
    004502F4      8B87 8C000000 mov     eax, dword ptr [edi+8C]
    004502FA      C687 64010000>mov     byte ptr [edi+164], 1
    00450301      8B88 2C080000 mov     ecx, dword ptr [eax+82C]
    00450307      3959 28       cmp     dword ptr [ecx+28], ebx
    0045030A      7E 0A         jle     short 00450316
    0045030C      C787 F4550000>mov     dword ptr [edi+55F4], 3E8
    00450316      83B8 FC070000>cmp     dword ptr [eax+7FC], 2
    0045031D      74 20         je      short 0045033F
    0045031F      8B80 84070000 mov     eax, dword ptr [eax+784]
    00450325      6A 01         push    1
    00450327      E8 A44F0C00   call    005152D0
    0045032C      8B97 8C000000 mov     edx, dword ptr [edi+8C]
    00450332      8BBA 3C080000 mov     edi, dword ptr [edx+83C]
    00450338      6A 01         push    1
    0045033A      E8 F1B50000   call    0045B930
    0045033F      6A 0B         push    0B
    00450341      BF 0F000000   mov     edi, 0F
    00450346      68 78756600   push    00667578                         ;   返回游戏
    0045034B      8D4C24 4C     lea     ecx, dword ptr [esp+4C]
    0045034F      897C24 64     mov     dword ptr [esp+64], edi
    00450353      895C24 60     mov     dword ptr [esp+60], ebx
    00450357      885C24 50     mov     byte ptr [esp+50], bl
    0045035B      E8 D03FFBFF   call    00404330
    00450360      895C24 6C     mov     dword ptr [esp+6C], ebx
    00450364      6A 14         push    14
    00450366      68 84756600   push    00667584                         ;      点击返回游戏
    0045036B      8D4C24 30     lea     ecx, dword ptr [esp+30]
    0045036F      897C24 48     mov     dword ptr [esp+48], edi
    00450373      895C24 44     mov     dword ptr [esp+44], ebx
    00450377      885C24 34     mov     byte ptr [esp+34], bl
    0045037B      E8 B03FFBFF   call    00404330
    00450380      C64424 6C 01  mov     byte ptr [esp+6C], 1
    00450385      6A 0B         push    0B
    00450387      68 9C756600   push    0066759C                         ;   游戏暂停
    0045038C      8D4C24 14     lea     ecx, dword ptr [esp+14]
    00450390      897C24 2C     mov     dword ptr [esp+2C], edi
    00450394      895C24 28     mov     dword ptr [esp+28], ebx
    00450398      885C24 18     mov     byte ptr [esp+18], bl
    0045039C      E8 8F3FFBFF   call    00404330
    004503A1      6A 03         push    3
    004503A3      8D4C24 48     lea     ecx, dword ptr [esp+48]
    004503A7      51            push    ecx
    004503A8      8D5424 30     lea     edx, dword ptr [esp+30]
    004503AC      52            push    edx
    004503AD      8D4C24 18     lea     ecx, dword ptr [esp+18]
    004503B1      51            push    ecx
    004503B2      C64424 7C 02  mov     byte ptr [esp+7C], 2
    004503B7      8B06          mov     eax, dword ptr [esi]
    004503B9      8B90 20010000 mov     edx, dword ptr [eax+120]
    004503BF      6A 01         push    1
    004503C1      6A 13         push    13
    004503C3      8BCE          mov     ecx, esi
    004503C5      FFD2          call    edx
    004503C7      837C24 24 10  cmp     dword ptr [esp+24], 10
    004503CC      8BF0          mov     esi, eax
    004503CE      72 0D         jb      short 004503DD
    004503D0      8B4424 10     mov     eax, dword ptr [esp+10]
    004503D4      50            push    eax
    004503D5      E8 C0BD1C00   call    0061C19A
    004503DA      83C4 04       add     esp, 4
    004503DD      837C24 40 10  cmp     dword ptr [esp+40], 10
    004503E2      897C24 24     mov     dword ptr [esp+24], edi
    004503E6      895C24 20     mov     dword ptr [esp+20], ebx
    004503EA      885C24 10     mov     byte ptr [esp+10], bl
    004503EE      72 0D         jb      short 004503FD
    004503F0      8B4C24 2C     mov     ecx, dword ptr [esp+2C]
    004503F4      51            push    ecx
    004503F5      E8 A0BD1C00   call    0061C19A
    004503FA      83C4 04       add     esp, 4
    004503FD      C74424 6C FFF>mov     dword ptr [esp+6C], -1
    00450405      837C24 5C 10  cmp     dword ptr [esp+5C], 10
    0045040A      897C24 40     mov     dword ptr [esp+40], edi
    0045040E      895C24 3C     mov     dword ptr [esp+3C], ebx
    00450412      885C24 2C     mov     byte ptr [esp+2C], bl
    00450416      72 0D         jb      short 00450425
    00450418      8B5424 48     mov     edx, dword ptr [esp+48]
    0045041C      52            push    edx
    0045041D      E8 78BD1C00   call    0061C19A
    00450422      83C4 04       add     esp, 4
    00450425      D905 149A6700 fld     dword ptr [679A14]
    0045042B      83EC 08       sub     esp, 8
    0045042E      D95C24 04     fstp    dword ptr [esp+4]
    00450432      897C24 64     mov     dword ptr [esp+64], edi
    00450436      D905 B89A6700 fld     dword ptr [679AB8]
    0045043C      895C24 60     mov     dword ptr [esp+60], ebx
    00450440      885C24 50     mov     byte ptr [esp+50], bl
    00450444      D91C24        fstp    dword ptr [esp]
    00450447      8B86 58010000 mov     eax, dword ptr [esi+158]
    0045044D      50            push    eax
    0045044E      E8 2D760000   call    00457A80
    00450453      6A 0A         push    0A
    00450455      53            push    ebx
    00450456      C786 2C010000>mov     dword ptr [esi+12C], 9B
    00450460      E8 CB6A0000   call    00456F30
    00450465      8B4E 3C       mov     ecx, dword ptr [esi+3C]
    00450468      8B7E 38       mov     edi, dword ptr [esi+38]
    0045046B      8B1E          mov     ebx, dword ptr [esi]
    0045046D      B8 58020000   mov     eax, 258
    00450472      2BC1          sub     eax, ecx
    00450474      99            cdq
    00450475      2BC2          sub     eax, edx
    00450477      51            push    ecx
    00450478      D1F8          sar     eax, 1
    0045047A      57            push    edi
    0045047B      50            push    eax
    0045047C      B8 20030000   mov     eax, 320
    00450481      2BC7          sub     eax, edi
    00450483      99            cdq
    00450484      2BC2          sub     eax, edx
    00450486      8B93 A0000000 mov     edx, dword ptr [ebx+A0]
    0045048C      D1F8          sar     eax, 1
    0045048E      50            push    eax
    0045048F      8BCE          mov     ecx, esi
    00450491      FFD2          call    edx
    00450493      8B4C24 64     mov     ecx, dword ptr [esp+64]
    00450497      5F            pop     edi
    00450498      5E            pop     esi
    00450499      64:890D 00000>mov     dword ptr fs:[0], ecx
    004504A0      5B            pop     ebx
    004504A1  |.  8BE5          mov     esp, ebp
    004504A3  |.  5D            pop     ebp                              ;  (initial cpu selection)
    004504A4  \.  C3            retn

    这个函数,其实就是创建干扰窗口的函数,我们把这个函数整体清理掉
    我的做法是 004502C6 到004504A0 全部nop填充
    这样就行了,当我们去做别的事情的时候,程序不会被断下来了。

    评分

    参与人数 1威望 +12 收起 理由
    月之精灵 + 12 热心可嘉

    查看全部评分

    PYG19周年生日快乐!
  • TA的每日心情
    慵懒
    2019-3-12 17:25
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2010-5-27 16:34:06 | 显示全部楼层
    标 题: 【原创】植物大战僵尸 修改版
    作 者: 思远软件
    时 间: 2010-02-09,02:11:24
    链 接: http://bbs.pediy.com/showthread.php?t=106966
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2015-8-3 23:07
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2010-5-27 17:09:12 | 显示全部楼层
    实在没看出什么原创的东西哈
    PYG19周年生日快乐!

    该用户从未签到

     楼主| 发表于 2010-5-27 17:55:06 | 显示全部楼层
    我想说的是内存搜索快速定位,原来这种方法大家早就在用了哟。水平太菜,不要说我是抄人家的哟。很多大牛做的教程没说到点子上。比如如何定位,如何确定关键点等等……我等菜鸟看也只是看了。
    PYG19周年生日快乐!
  • TA的每日心情
    慵懒
    2019-3-12 17:25
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2010-5-27 18:03:50 | 显示全部楼层
    本帖最后由 whypro 于 2010-5-27 18:04 编辑

    RA2edit.jpg

    RA2edit.rar (9.28 KB, 下载次数: 6)
    可以参考内存修改器的编写!
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2015-8-3 23:07
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2010-5-27 18:24:05 | 显示全部楼层
    我想说的是内存搜索快速定位,原来这种方法大家早就在用了哟。水平太菜,不要说我是抄人家的哟。很多大牛做 ...
    anyone 发表于 2010-5-27 17:55



        不是那个意思,因为我没有看到任何分析东西哈
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2010-5-27 19:03:19 | 显示全部楼层
    呵呵 我也写过一个 他的金钱数量 在内存中的数据要 * 10
    0.JPG
    PYG19周年生日快乐!

    该用户从未签到

     楼主| 发表于 2010-5-27 19:37:26 | 显示全部楼层
    只要确定的关键位置,就几个API函数。马上找资料也把他写出来了。
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表