(帖子太大,所以分开发)
二、寻找解密算法 也是f5看访问,然后随便点一条下断点,可以看到RAX是我们的准星索引 根据x64的调用约定,这个rax应该是这个Call的返回值,我们直接出这个call看看这个值后边拿去干什么了。 我们慢慢跟,发现这个call执行之后我们寄存器的值就变动了 所以我们进这个call(client.dll+9C5226)看一下 继续跟,注意寄存器是什么时候变的,走到这里rax再次变动,我们跟进call里看一下,继续单步看寄存器的变动 跟到这个CALL后,我们往下翻到这里,仔细分析一下 他这条改了rax,那么大概率这个Call里要对我们的索引值进行计算了 此时rbx r8都存着我们的准星索引,继续往下看看 我们发现这一段可疑运算,跟着跑完后发现rax(也就是call的返回值),就是人物数组,给他添加血量的偏移就能的到血量 所以我们可以确定,这就是我们要找的解密算法,我们直接把他copy出来分析: client.dll+571430 - 48 83 EC 28 - sub rsp,28 { 40 } client.dll+571434 - 83 F9 FF - cmp ecx,-01 { 255 } client.dll+571437 - 75 17 - jne client.dll+571450 client.dll+571439 - 48 8B 0D 98EE4301 - mov rcx,[client.dll+19B02D8] { (7FFB3AEF2C80) } client.dll+571440 - 48 8D 54 24 30 - lea rdx,[rsp+30] client.dll+571445 - 48 8B 01 - mov rax,[rcx] client.dll+571448 - FF 90 D8020000 - call qword ptr [rax+000002D8] client.dll+57144E - 8B 08 - mov ecx,[rax] client.dll+571450 - 48 63 C1 - movsxd rax,ecx client.dll+571453 - 48 8D 0D 6E2D4301 - lea rcx,[client.dll+19A41C8] { (15239A94600) } client.dll+57145A - 48 8B 0C C1 - mov rcx,[rcx+rax*8] client.dll+57145E - 48 85 C9 - test rcx,rcx client.dll+571461 - 74 52 - je client.dll+5714B5 client.dll+571463 - 8B 91 0C060000 - mov edx,[rcx+0000060C] client.dll+571469 - 83 FA FF - cmp edx,-01 { 255 } client.dll+57146C - 74 47 - je client.dll+5714B5 client.dll+57146E - 4C 8B 0D F3183301 - mov r9,[client.dll+18A2D68] { (1500BE10010) } client.dll+571475 - 4D 85 C9 - test r9,r9 client.dll+571478 - 74 3B - je client.dll+5714B5 client.dll+57147A - 83 FA FE - cmp edx,-02 { 254 } client.dll+57147D - 74 36 - je client.dll+5714B5 client.dll+57147F - 8B CA - mov ecx,edx client.dll+571481 - 81 E1 FF7F0000 - and ecx,00007FFF { 32767 } client.dll+571487 - 8B C1 - mov eax,ecx client.dll+571489 - 44 8B C1 - mov r8d,ecx client.dll+57148C - C1 E8 09 - shr eax,09 { 9 } client.dll+57148F - 49 8B 0C C1 - mov rcx,[r9+rax*8] client.dll+571493 - 48 85 C9 - test rcx,rcx client.dll+571496 - 74 1D - je client.dll+5714B5 client.dll+571498 - 41 81 E0 FF010000 - and r8d,000001FF { 511 } client.dll+57149F - 49 6B C0 78 - imul rax,r8,78 client.dll+5714A3 - 48 03 C1 - add rax,rcx client.dll+5714A6 - 74 0D - je client.dll+5714B5 client.dll+5714A8 - 39 50 10 - cmp [rax+10],edx client.dll+5714AB - 75 08 - jne client.dll+5714B5 client.dll+5714AD - 48 8B 00 - mov rax,[rax] client.dll+5714B0 - 48 83 C4 28 - add rsp,28 { 40 } client.dll+5714B4 - C3 - ret client.dll+5714B5 - 33 C0 - xor eax,eax client.dll+5714B7 - 48 83 C4 28 - add rsp,28 { 40 } client.dll+5714BB - C3 - ret 整理一下,去除无关信息,主要看怎么赋值的 首先是 client.dll+571453 - 48 8D 0D 6E2D4301 - lea rcx,[client.dll+19A41C8] { (15239A94600) } 然后在对rcx进行操作 client.dll+57145A - 48 8B 0C C1 - mov rcx,[rcx+rax*8] 注意此时的rax是0 紧接着就是吧值赋值给edx client.dll+571463 - 8B 91 0C060000 - mov edx,[rcx+0000060C] 然后有对r9赋值 client.dll+57146E - 4C 8B 0D F3183301 - mov r9,[client.dll+18A2D68] { (1500BE10010) } 又把edx赋值给ecx client.dll+57147F - 8B CA - mov ecx,edx 然后对ecx进行and运算 client.dll+571481 - 81 E1 FF7F0000 - and ecx,00007FFF { 32767 } 再分别赋值给eax.r8d,同时吧eax右移了9位 client.dll+571487 - 8B C1 - mov eax,ecx client.dll+571489 - 44 8B C1 - mov r8d,ecx client.dll+57148C - C1 E8 09 - shr eax,09 { 9 } 然后在对rcx赋值 client.dll+57148F - 49 8B 0C C1 - mov rcx,[r9+rax*8] 最后 对r8d进行与运算,在对吧r8乘以0x78在赋值给rax, 然后吧rax和rcx相加,就能的到了我们要的人物数组 client.dll+571498 - 41 81 E0 FF010000 - and r8d,000001FF { 511 } client.dll+57149F - 49 6B C0 78 - imul rax,r8,78 client.dll+5714A3 - 48 03 C1 - add rax,rcx 理清楚了逻辑,我们来看看寄存器具体是那些参数 首先and ecx,00007FFF,从上边分析的逻辑可以知道ecx是[[client.dll+19A41C8]+0x60c] 我们翻看dump文件,搜索0x60c 知道这是一个m_hPwan,所以and ecx,00007FFF,可以表示为 m_hPwan & 0x7FFF 然后是第二条: shr eax,09 ,从上边的逻辑分析,我们知道 eax=m_hPwan & 0x7FFF 所以这里表示为 (m_hPwan & 0x7FFF)>>9 然后是第三条:mov rcx,[r9+rax*8],从上边可知rax的值为0 ,所以此处表达为 [[client.dll+18A2D68]+0]+((m_hPwan & 0x7FFF)>>9)*8) 然后是第四条:and r8d,000001FF,从上边可知r8d=m_hPwan & 0x7FFF,所以这里表示为 (m_hPwan & 0x7FFF)&0x1FF 第五条:imul rax,r8,78,表示为 ((m_hPwan & 0x7FFF)&0x1FF)*78 第六条:add rax,rcx,如上rcx=[client.dll+18A2D68]+((m_hPwan & 0x7FFF)>>9)*8),所以最后的表达式为 ((m_hPwan & 0x7FFF)&0x1FF)*78+[client.dll+18A2D68]+((m_hPwan & 0x7FFF)>>9)*8) 最后我通过比较寄存器的值,知道了m_hPwan & 0x7FFF就是我们找的的准星索引的值 所以最终的表达是应该为: (准星索引&0x1FF)*78+[[client.dll+18A2D68]+0]+((准星索引)>>9)*8) .版本 2 .子程序 解密鼠标索引, 长整数型 .参数 索引值, 整数型 .参数 r9, 长整数型 .局部变量 A, 长整数型 .局部变量 C, 长整数型 A = 位与 (进制_十六到十_ASM (索引值), 十六进制 (“1FF”)) × 120 C = 进制_十六到十 (r9) + 右移 (进制_十六到十_ASM (索引值), 9) × 8 返回 (进制_十到十六 (A + C) 如此一来就能读取人物的阵营从而判断开枪了。 补充: r9值的特征码:4C 8B 0D ?? ?? ?? ?? 4D 85 C9 74 3B 83 FA FE 74 36
联系我时,请说是在 挂海论坛 上看到的,谢谢! |