本文主要是介绍追逐自己的梦想----------辅助制作第三十六课:物品购买分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
要分析物品购买功能,可以通过bp WSASend 来找到购买物品的call找到这个缓冲区 :
db显示0018A488 00 00 92 00 80 00 01 00 00 00 00 00 00 00 65 CA ..?€........e?
0018A498 9A 3B 00 00 00 00 01 00 00 00 00 00 00 00 00 00 ?.............
0018A4A8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................dd显示
$-2 >00007327
$+2 >00800092 Client.00800092
$+6 >00000001
$+A >00000000
$+E >3B9ACA65
$+12 >00000000
$+16 >00000001
$+1A >00000000
$+1E >00000000
$+22 >00000000
$+26 >00000000
$+2A >00000000
$+2E >00000000下面就来测试下这个缓冲区
007A9844 8DB3 0C170000 LEA ESI,DWORD PTR DS:[EBX+170C]
007A984A B9 20000000 MOV ECX,20
007A984F 8DBD EED7FFFF LEA EDI,DWORD PTR SS:[EBP-2812]
007A9855 F3:A5 REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
007A9857 8B0D 8048F300 MOV ECX,DWORD PTR DS:[F34880]
007A985D 68 86000000 PUSH 86
007A9862 8D85 E8D7FFFF LEA EAX,DWORD PTR SS:[EBP-2818]
007A9868 50 PUSH EAX
007A9869 C785 EED7FFFF 0>MOV DWORD PTR SS:[EBP-2812],1
007A9873 E8 6802D0FF CALL Client.004A9AE0要实现这个 可以采用汇编来实现
sub esp, 090
mov eax , esp
mov DWORD ptr [eax+ 02],00800092
mov DWORD ptr [eax+ 06],1
mov DWORD ptr [eax+ 0A],0
mov DWORD ptr [eax+ 0e],3B9ACA65
mov DWORD ptr [eax+ 12],0
mov DWORD ptr [eax+ 16],1
push 0x86
push eax
MOV ECX,DWORD PTR DS:[0F34880]
CALL 004A9AE0
add esp, 90
经过测试 ,这段汇编代码能够实现购买 金创药(小) 数量 1+2 购买属性 00800092
+6 1表示买入,2表示卖出
+0E 物品信息 来自+4c的4个字节
+16 物品数量 //自己写入
用到的属性差不多就是这些了下面最重要的就是封装购买物品这个函数了,但是从上面的属性来看,要封装这个函数
BOOL BuyGoods(char* szpName , DWORD ndNum);
要用到的就是“物品信息”,所以下面要做的就是分析商店列表基址
以及得到他对应的名字,描述信息,+4c偏移等一系列属性 。
就从分析商店列表基址开始
174BA998 174BB820
98A94B1720B84B17找到一个相对基址:
然后查找访问了这个基址的代码:
007B2E94 - 0F84 92110000 - je Client.exe+3B402C
007B2E9A - 8B 0D 2054F600 - mov ecx,[Client.exe+B65420]
007B2EA0 - 8B 84 9F 10040000 - mov eax,[edi+ebx*4+00000410] <<
007B2EA7 - 85 C0 - test eax,eax007B383B - E8 F0ACF0FF - call Client.exe+2BE530
007B3840 - E9 E7070000 - jmp Client.exe+3B402C
007B3845 - 8B 84 9F 10040000 - mov eax,[edi+ebx*4+00000410] <<
007B384C - 8B 0D 0C54F600 - mov ecx,[Client.exe+B6540C]
007B3852 - 89 81 28020000 - mov [ecx+00000228],eax得到公式
dd [edi + 0x410 + 4* i]
转到那个地址 007B2EA0
然后分析EDI的来源:得到这个地址
004A8D54 B9 B88FF300 MOV ECX,Client.00F38FB8
004A8D59 E8 A2030000 CALL Client.004A9100
004A8D5E EB 5F JMP SHORT Client.004A8DBF
004A8D60 8B4E 04 MOV ECX,DWORD PTR DS:[ESI+4] ; 来自这个ESI
004A8D63 6A 03 PUSH 3
004A8D65 51 PUSH ECX ; 来自这个ECX
004A8D66 E8 65AE3400 CALL Client.007F3BD0
004A8D6B 83C4 10 ADD ESP,10
004A8D6E 57 PUSH EDI
004A8D6F B9 B88FF300 MOV ECX,Client.00F38FB8
004A8D74 E8 87030000 CALL Client.004A9100
004A8D79 85C0 TEST EAX,EAX
004A8D7B 74 42 JE SHORT Client.004A8DBF
004A8D7D C746 0C 0100000>MOV DWORD PTR DS:[ESI+C],1dc [[1B09DC68 + 4]+0x410+4*0]+5c用ce 1B09DC68
找到一个地址 ,这个地址下硬件访问断点:
hr 0F39B3C得到以下数据:
004A9111 33C0 XOR EAX,EAX
004A9113 5D POP EBP
004A9114 C2 0400 RETN 4
004A9117 8B4481 04 MOV EAX,DWORD PTR DS:[ECX+EAX*4+4]
004A911B 5D POP EBP ; 0018CE50
004A911C C2 0400 RETN 4
004A911F CC INT3
004A9120 55 PUSH EBP
004A9121 8BEC MOV EBP,ESP
004A9123 56 PUSH ESI
004A9124 57 PUSH EDI通过分析 就发现数据来源就是上面的公式 ,最后得到的公式就是下面这样
商店列表:
dc [[[00F38FB8+ 2e0*4 + 0x4] + 4]+0x410+4*4]+5c
+4C 物品类型
这篇关于追逐自己的梦想----------辅助制作第三十六课:物品购买分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!