|
V哥,能不能解释下这段:
他们开始从kcbgtcr的第一个字节处分析反汇编代码,过程有点无聊,长话短说吧,从kcbgtcr+0x2c0处到kcbgtcr+0x385处,是Buffer Cache中的HASH算法:
kcbgtcr+0x2c0: movq 0xa723e59(%rip),%r8
kcbgtcr+0x2c7: movl 0x80(%r8),%eax
kcbgtcr+0x2ce: incl %eax
kcbgtcr+0x2d0: andl $0xf,%eax
kcbgtcr+0x2d3: movq 0xa723e46(%rip),%r8
kcbgtcr+0x2da: movl %eax,0x80(%r8)
kcbgtcr+0x2e1: movl (%r14),%eax
kcbgtcr+0x2e4: movq 0xa723e35(%rip),%r8
kcbgtcr+0x2eb: movq 0xa723e2e(%rip),%r9
kcbgtcr+0x2f2: movl 0x80(%r9),%ecx
kcbgtcr+0x2f9: movl %ecx,%r9d
kcbgtcr+0x2fc: movl %eax,(%r8,%r9,8)
kcbgtcr+0x300: movl 0x4(%r14),%eax
kcbgtcr+0x304: movq 0xa723e15(%rip),%r8
kcbgtcr+0x30b: movq 0xa723e0e(%rip),%r9
kcbgtcr+0x312: movl 0x80(%r9),%ecx
kcbgtcr+0x319: movl %ecx,%r9d
kcbgtcr+0x31c: movl %eax,0x4(%r8,%r9,8)
kcbgtcr+0x321: movq 0xa714018(%rip),%r8
kcbgtcr+0x328: movl (%r8),%eax
kcbgtcr+0x32b: movl %eax,-0x448(%rbp)
kcbgtcr+0x331: movl (%r14),%eax
kcbgtcr+0x334: shll $0x11,%eax
kcbgtcr+0x337: addl 0x4(%r14),%eax
kcbgtcr+0x33b: imull $0x9e370001,%eax,%eax
kcbgtcr+0x341: movq 0xa72ed30(%rip),%r8
kcbgtcr+0x348: movl (%r8),%ecx
kcbgtcr+0x34b: movl %eax,%edx
kcbgtcr+0x34d: shrl %cl,%edx
kcbgtcr+0x34f: movq 0xa72ed2a(%rip),%r8
kcbgtcr+0x356: movl (%r8),%eax
kcbgtcr+0x359: andl %edx,%eax
kcbgtcr+0x35b: movl %eax,%r8d
kcbgtcr+0x35e: shlq $0x4,%r8
kcbgtcr+0x362: movq 0xa72ed1f(%rip),%r9
kcbgtcr+0x369: movl (%r9),%ecx
kcbgtcr+0x36c: movl %edx,%eax
kcbgtcr+0x36e: shrl %cl,%eax
kcbgtcr+0x370: movl %eax,%r9d
kcbgtcr+0x373: shlq $0x4,%r9
kcbgtcr+0x377: movq 0xa72ed12(%rip),%r10
kcbgtcr+0x37e: movq (%r10),%r10
kcbgtcr+0x381: movq (%r10,%r9),%r12
kcbgtcr+0x385: addq %r8,%r12
这段代码对应的C语言伪码是:
int sp1=0x11;
int sp2=0x7f;
int sp3=0x7;
int hash_header=0x394953140;
hash(int p1,int p2)
{
int uk=p1;
int rdba=p2;
int v1,v2;
int target_addr;
uk=uk<<0x11+rdba;
uk=(0x9e370001*uk)&0x00000000FFFFFFFF;
uk=uk>>sp1;
v1=uk&sp2;
v1=v1<<0x4;
v2=uk>>0xsp3;
v2=v2<<0x4;
target_addr=hash_header+v2+v1;
}
通过解析反汇编代码,对于HASH运算消耗的CPU,更加清楚了。
这么一大片汇编,你是怎么看出他是HASH算法的?我觉得这种技术是最难的,我看的头都大了现在也没理解为啥这是HASH算法
|
|