用乘法和移位实现mod 53 - 可打印的版本 +- WeHack BBS (https://bbs.wehack.space) +-- 版块: 计算机技术 (https://bbs.wehack.space/forum-5.html) +--- 版块: 逆向工程讨论区 (https://bbs.wehack.space/forum-9.html) +--- 主题: 用乘法和移位实现mod 53 (/thread-54.html) |
用乘法和移位实现mod 53 - vimacs - 09-09-2018 今天逆向某个程序的时候发现了下面的代码: 代码: | 0x180000595 4c8b01 mov r8, qword [rcx] 注意 movabs 那条指令将一个很奇怪的 64 位立即数赋值给了 rbp,后面又有 mul 指令,可以推测出它是用乘法、加减法和位运算模拟除法或取模指令(可以参考RE4B里面除以9的那章)。 这里我没找到任何线索,于是用 Python 模拟了一下: 代码: def fn(r64): 然后打出输入为200之内的结果: 代码: for i in range(200): 发现其实这个函数就是 r64%53. 这个的实现原理是什么呢? 刚刚再细看了一下,0x35就是53,所以最后两个操作是商 rax 乘 53,然后被除数 r64 减去 rax*53 得到余数,剩下的问题就是前面除以 53 是怎么做的,原理和 RE4B 里面讲的应该一样。 不过有点奇怪的就是移位因子的选择问题,怎样选择移位因子才能保证没有误差? |