全面分析购买药品NPC 分析如下: 一.首先打开购买药品对话框,需要 载入游戏,下BP SEND,然后返回游戏点NPC,此时出现购买药品对话框,然后查看堆栈,找到如下几个地址: 0059880A 0059872E 005986F0 00510F08 0050FC85 第一二个下断,返回游戏走一下,发现会断下来,直接排除 第三个下断,太复杂,不像。先找后面的,如果不行再来详细分析 第四个下断有点像,注入如下代码: push 0 push 0 push 0 push 0 mov eax,[5f6a7c] mov eax,[eax] mov ecx,05ea9f40 mov edx,3f2 call 005986c0 测试通不过。 第五个下断,原型如下: 所以,写入注入代码,如下: 经分析:前面两行为无用的代码,所以省掉 mov edx,05ea9f40 //mov eax,esi//测试时发现这句也可以省掉 call 00510eb4 二.然后追踪edx值的来源 1.看清楚上面的原型,其中edx=[ebx+4],所以我们要追踪ebx的来源,所以往上看,你会发现在 0050FC09 /E9 AF030000 JMP BMir.0050FFBD 这个地方有个跳转,如果在这儿下断,当返回游戏中点购药NPC时,OD不会断下来。所以如果我们用od追踪,将会十分困难。所以我这里采用OD+CE的方法。 2.下断,查明ebx的值,当然每次重新打开游戏时此值不一样。我这里,ebx=06778A80,于是在ce中搜索067787A0,然后查找访问该地址的代码,出现: 00473a63 mov ebx,[eax+04] 00473a66 cmp edx,[ebx+ecx*4] 此时,ebx=067469d8,进一步发现: Ebx=[eax+04],其中eax=0115cef0,再搜索0115cef0的来源: 00566510:mov eax,[ebx+5fb5c],其中ebx=7ff30010,继续搜ebx的来源,发殃: [63e7c4] =7ff30010,综上所述:ebx=[[[[63e7c4]+5fb5c]+04]+4],所以edx=[ebx+4] 3.使用dd [[[[63e7c4]+5fb5c]+4]+4]+4查看,会发现里面的值就是edx. 三.用dephi写打开买药NPC的call,代码如下: procedure TForm1.Button34Click(Sender: TObject); begin { mov edx,05fef2d0//其中EDX=[EBX+4],所以追踪EBX的来源 call 00510eb4 //dd edx=[[[[63e7c4]+5fb5c]+4]+4]+4 } asm mov edx,$63e7c4 mov edx,[edx] add edx,$5fb5c mov edx,[edx] add edx,4 mov edx,[edx] add edx,4 mov edx,[edx] add edx,4 mov edx,[edx] mov ebx, $00510eb4 call ebx end; end; 好了,现在测试成功,可以打开药品npc了。然后呢,现在我要找点击买药中的买字后出现的窗口。 四.首先用bp send下断,跟踪到点击买后的CALL,原型如下: 买药NPC原型CALL: 0048E2A8 0059880A 0059871F 0055BE7F 004EDD04 004EDCED 8B15 20665F00 MOV EDX,DWORD PTR DS:[5F6620] ; BMir.00641D24 004EDCF3 8B12 MOV EDX,DWORD PTR DS:[EDX] 004EDCF5 A1 906A5F00 MOV EAX,DWORD PTR DS:[5F6A90] 004EDCFA 8B00 MOV EAX,DWORD PTR DS:[EAX] 004EDCFC 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4] ; ecx=[ebp-4] 004EDCFF E8 ACD90600 CALL BMir.0055B6B0 ; 买药NPC CALL 命令的来源: //db [[[[[63e800]+010]+4]+4+4*4]+0d8],其中数组下标4代表第四项,买药 注入测试一下: asm mov edx,$ 5F6620 mov edx,[edx] mov edx,[edx] mov eax,$5F6A90 mov eax,[eax] mov eax,[eax] mov ecx,command //字符串指针 @buy 打开卖对话框 @sell 打开买对话框 @main 主对话框(返回) mov ebx,$0055B6B0 // @repair 打开修理对话框 @doexit退出 call ebx end; 五.找选取物品CALL 原型如下: 005E7A65 57 PUSH EDI 005E7A66 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8] 005E7A69 50 PUSH EAX 005E7A6A 8BCE MOV ECX,ESI 005E7A6C 8BD3 MOV EDX,EBX 005E7A6E 8B83 DC000000 MOV EAX,DWORD PTR DS:[EBX+DC] 005E7A74 FF93 D8000000 CALL DWORD PTR DS:[EBX+D8] 写如下源代码测试: push 0 push 0012facc mov ecx,0 mov ebx,0681cdb0 mov edx,ebx mov eax,[ebx+0dc] call [ebx+0d8] 跟踪一下ebx的来源:dd [[[63e834]+10]+4]+1c里面放的值就是ebx的值 六.购买药品CALL 0055C65B 004D9300 005DB248 005B59E7 原型如下: 005DB237 57 PUSH EDI 005DB238 8BCE MOV ECX,ESI 005DB23A 8BD3 MOV EDX,EBX ; [ebx+0d8] 005DB23C 8B83 94000000 MOV EAX,DWORD PTR DS:[EBX+94] 005DB242 FF93 90000000 CALL DWORD PTR DS:[EBX+90] ; [edx+0d8] 分析EBX的来源:其中EBX=0681ca80,此时: mov eax,[ebx+04] mov eax,[eax+esi*4],所以: eax=[[ebx+04]+4],此时ebx=01162470,然后追踪其来源,此时 mov eax,[ebx+10],此时ebx=06832440,发现[63e834]=6832440 综合一下: eax=[[[[63e834]+10]+4]+4] 以下测试成功,可以成功购买物品: asm push 4 //固定 mov esi,$b //固定 mov ecx,esi mov ebx,$63e834 mov ebx,[ebx] mov ebx,[ebx+$10] mov ebx,[ebx+4] mov ebx,[ebx+4] mov edx,ebx mov eax,[ebx+$94] mov ebx,[ebx+$90] call ebx end; 本文章根据 手把手项目开发 - 一站式开发项目培训平台中的视频教程整理而成,指导大师:QQ:1026165915,转载请注明出处。
|