这期我们来找一下人物的基础信息 人物的基础信息往往是最重要的 因为其它的所有数据都需要人物信息支持 例如发包 打怪 吃药 等等。。。
那么还是老样子 先开CE 附加游戏
下一步我们来确定突破口 突破口有很多 比如:血量 蓝量 等级 经验条等等。。。
我们今天先用常规的血量作为突破口 首先找到能够改变任务血量的装备 这样方便我们搜索
首先我们先搜索穿上装备的血量
然后脱掉装备在搜索血量 然后再穿上装备反复搜索 筛选得出几个值
现在我们打开工具 xdbg64 然后附加游戏 然后我们对CE扫描出来的地址依次进行访问
$+1E | 4C 89 64 24 60 | mov qword ptr ss:[rsp+60],r12 |
$+23 | 45 33 E4 | xor r12d,r12d | $+26 | 4C 89 7C 24 20 | mov qword ptr ss:[rsp+20],r15 |
$+2B | 45 8B FC | mov r15d,r12d |
$+2E | FF 90 70 04 00 00 | call qword ptr ds:[rax+470] |
$+34 | 83 F8 01 | cmp eax,1 |
$+37 | 0F 85 6A 01 00 00 | jne nightmarebreaker.7FF71981561B |
$+3D | 8B 46 28 | mov eax,dword ptr ds:[rsi+28] |
$+40 | 48 89 6C 24 50 | mov qword ptr ss:[rsp+50],rbp |
$+45 | A8 04 | test al,4 |
$+47 | 0F 84 9F 00 00 00 | je nightmarebreaker.7FF719815560 |
$+4D | 48 8B AF C0 01 00 00 | mov rbp,qword ptr ds:[rdi+1C0] | rdi+1C0
$+54 | 4C 89 74 24 28 | mov qword ptr ss:[rsp+28],r14 |
$+59 | E8 9E 49 42 FF | call nightmarebreaker.7FF718C39E70 |
$+5E | 48 8B C8 | mov rcx,rax | $+61 | 48 8B D3 | mov rdx,rbx |
$+64 | E8 F3 10 80 FF | call nightmarebreaker.7FF7190165D0 |
$+69 | 4C 8B F0 | mov r14,rax | $+6C | 48 85 C0 | test rax,rax |
$+6F | 74 0F | je nightmarebreaker.7FF7198154F4 |
$+71 | 48 8B 10 | mov rdx,qword ptr ds:[rax] |
$+74 | 48 8B C8 | mov rcx,rax |
$+77 | FF 92 40 03 00 00 | call qword ptr ds:[rdx+340] |
在上面的代码中 我们断到了 rdi+1C0 的地方 这是我们需要继续向上最rdi的来源
$-14 | 40 53 | push rbx |
$-12 | 56 | push rsi |
$-11 | 57 | push rdi |
$-10 | 48 83 EC 30 | sub rsp,30 |
$-C | 49 8B F1 | mov rsi,r9 |
$-9 | 48 8B DA | mov rbx,rdx |
$-6 | 48 8B F9 | mov rdi,rcx | rcx+10C
$-3 | 48 85 D2 | test rdx,rdx |
$ ==> | 0F 84 B8 01 00 00 | je nightmarebreaker.7FF719815632 |
$+6 | 48 8B 02 | mov rax,qword ptr ds:[rdx] |
$+9 | 48 8B CA | mov rcx,rdx |
来源于rcx 我们需要返回到上一层CALL去追溯来源
$-62 | 48 8B D9 | mov rbx,rcx |
$-5F | 48 8B FA | mov rdi,rdx |
$-5C | 48 8B 49 14 | mov rcx,qword ptr ds:[rcx+14] | [rcx+14]+1C0
$-58 | 48 85 C9 | test rcx,rcx |
$-55 | 0F 84 A0 00 00 00 | je nightmarebreaker.7FF7194E65E2 |
$-4F | 48 83 7B 0C 00 | cmp qword ptr ds:[rbx+C],0 |
$-4A | 0F 84 95 00 00 00 | je nightmarebreaker.7FF7194E65E2 |
$-44 | 48 8B 01 | mov rax,qword ptr ds:[rcx] |
$-41 | FF 50 08 | call qword ptr ds:[rax+8] |
$-3E | 83 F8 01 | cmp eax,1 |
发现来源于rcx+14 我们继续追RCX的来源
00007FF718ED4097 | 48 63 77 10 | movsxd rsi,dword ptr ds:[rdi+10] | 00007FF718ED409B | 48 C1 E6 04 | shl rsi,4 |
00007FF718ED409F | 49 03 B6 CC 05 00 00 | add rsi,qword ptr ds:[r14+5CC] |[[[[r14+5CC]+70]+08]+14]+1C0
00007FF718ED40A6 | 33 C0 | xor eax,eax | 等于0
00007FF718ED40A8 | 8B D8 | mov ebx,eax |
00007FF718ED40AA | 66 0F 1F 44 00 00 | nop word ptr ds:[rax+rax] | 00007FF718ED40B0 | 85 DB | test ebx,ebx |
00007FF718ED40B2 | 78 1B | js nightmarebreaker.7FF718ED40CF | 00007FF718ED40B4 | 3B 5E 08 | cmp ebx,dword ptr ds:[rsi+8] | 00007FF718ED40B7 | 7D 16 | jge nightmarebreaker.7FF718ED40CF | 00007FF718ED40B9 | 48 63 C3 | movsxd rax,ebx |
00007FF718ED40BC | 48 8B 0E | mov rcx,qword ptr ds:[rsi] | 00007FF718ED40BF | 48 8B D7 | mov rdx,rdi |
00007FF718ED40C2 | 48 8B 0C C1 | mov rcx,qword ptr ds:[rcx+rax8] | [[rcx+0*8]+14]+1C0
00007FF718ED40C6 | E8 85 1C 61 00 | call nightmarebreaker.7FF7194E5D50 |
rcx来源于一个数组 这里的rax 向上追了一下发现就是0 来源于:xor eax,eax
继续向上 追rcx 来源于 [rsi]
来源于 add rsi,qword ptr ds:[r14+5CC] 这里我们向上追来源于一个常量进行计算得来的rsi 它一直是保持70 那么我们先不管它 就是直接写固定的就行
这里我们继续追 r14 的来源
$+50 | 48 89 5C 24 30 | mov qword ptr ss:[rsp+30],rbx |
$+55 | 48 8B 98 50 07 00 00 | mov rbx,qword ptr ds:[rax+750] | [[[[[rax+750]+5CC]+70]+0*8]+14]+1C0
$+5C | 48 85 DB | test rbx,rbx | $+5F | 74 2A | je nightmarebreaker.7FF7195F518B |
$+61 | 48 8B 03 | mov rax,qword ptr ds:[rbx] |
$+64 | 48 8B CB | mov rcx,rbx |
$+67 | FF 50 08 | call qword ptr ds:[rax+8] |
$+6A | 83 F8 01 | cmp eax,1 |
来源于rax rax的特性 是遇CALL需要进到CALL里面追
00007FF79771513C | 33 D2 | xor edx,edx |
00007FF79771513E | E8 1D F7 C4 FE | call nightmarebreaker.7FF796364860 |
00007FF797715143 | 48 8B C8 | mov rcx,rax |
00007FF797715146 | E8 D5 46 A3 FF | call nightmarebreaker.7FF797149820 | 基址以及偏移
00007FF79771514B | 48 85 C0 | test rax,rax |
00007FF79771514E | 74 40 | je nightmarebreaker.7FF797715190 | 00007FF797715150 | 48 89 5C 24 30 | mov qword ptr ss:[rsp+30],rbx | 00007FF797715155 | 48 8B 98 50 07 00 00 | mov rbx,qword ptr ds:[rax+750] |
我们在外面下断 然后进到里面就会得到完整的公式
如下:
[[[[[[[[[[7FF7998D02F8]+88]+68]]+8E4]+750]+5CC]+70]+0*8]+14]+1C0 最大血量
因为是动态加载的基址 需要算一下偏移
nightmarebreaker.exe+38102F8 基址
然后我们在附近会看到别的数据
[[[[[[[[[[7FF7998D02F8]+88]+68]]+8E4]+750]+5CC]+70]+08]+14]+1C8 最大血量 DWORD
[[[[[[[[[[7FF7998D02F8]+88]+68]]+8E4]+750]+5CC]+70]+08]+14]+1D0 当前蓝量 DWORD
[[[[[[[[[[7FF7998D02F8]+88]+68]]+8E4]+750]+5CC]+70]+0*8]+14]+1D4 最大篮量 DWORD
我就不全部记录了 有兴趣的同学 就去看一下 附近还有很多别的数据
这里需要说明下 因为我们是在副本外找的数据 当我们进到副本内 发现这里的数据是不会被访问的 也就是说 人物的数据不止一个 还有个副本内的数据 应该不会离我们这个公式太远 也就是偏移不一样罢了
转载:https://blog.csdn.net/qq_36553941/article/details/113981062