(图+源码+详细分析)全面分析购买药品NPC
c吧
全部回复
仅看楼主
level 1
溥沛雯7Y 楼主
做挂第十步:全面分析购买药品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 打开卖对话框 @贴吧用户_007JEa2 打开买对话框 @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,转载请注明出处。
2025年07月07日 13点07分 1
level 1
前九步你发在哪里了?[呵呵]
2025年07月10日 00点07分 2
1