这是老外的一个程序中的注册部分,关键算法代码,看了一个星期了,仍不明白其算法思路,请高手帮忙分析:
.text:1000A830 fCalDigit proc near ; CODE XREF: sub_1000A080+6Dp
.text:1000A830 ; sub_1000A080+84p
.text:1000A830 ; fRegCal+5Fp
.text:1000A830 ; sub_1000A550+9Fp
.text:1000A830 ; sub_1000AD30+1CCp
.text:1000A830 ; sub_1000AD30+1E3p ...
.text:1000A830
.text:1000A830 arg_0 = dword ptr 4
.text:1000A830 arg_4 = dword ptr 8
.text:1000A830
.text:1000A830 mov eax, [esp+arg_4]
.text:1000A834 push eax ; eax=1A5634AFh
.text:1000A835 call sub_1000A7F0 <=== 见下
.text:1000A83A imul eax, [esp+4+arg_0]
.text:1000A83F add esp, 4
.text:1000A842 retn
.text:1000A842
.text:1000A842 fCalDigit endp
;---------------------------------------------------------------------------------------------
.text:1000A7F0 sub_1000A7F0 proc near ; CODE XREF: fMulCalDigit+5p
.text:1000A7F0
.text:1000A7F0 arg_0 = dword ptr 8
.text:1000A7F0
.text:1000A7F0 push esi
.text:1000A7F1 mov eax, 1 ; eax=1
.text:1000A7F6 mov edx, eax ; edx=1
.text:1000A7F8 mov esi, [esp+arg_0] ; esi=1A5634AFh
.text:1000A7FC sub edx, esi ; edx = E5A9CB52
.text:1000A7FE test esi, eax
.text:1000A800 mov ecx, edx ; ecx=E5A9CB52
.text:1000A802 jnz short loc_1000A808
.text:1000A802
.text:1000A804 xor eax, eax
.text:1000A806 pop esi
.text:1000A807 retn
.text:1000A807
.text:1000A808 loc_1000A808: ; CODE XREF: sub_1000A7F0+12j
.text:1000A808 ; sub_1000A7F0+1Fj
.text:1000A808 add eax, ecx
.text:1000A80A imul ecx, edx
.text:1000A80D test ecx, ecx
.text:1000A80F jnz short loc_1000A808
.text:1000A80F
.text:1000A811 pop esi
.text:1000A812 retn
.text:1000A812
.text:1000A812 sub_1000A7F0 endp
;---------------------------------------------------------------------------------------------
说明:
这个程序注册过程中,多次调用:fCalDigit这个子程序,这个子程序接收两个DWORD数据后,再传入第2个参数调用sub_1000A7F0子程序,在这里面,和一个固定数(edx)反复相乘,然后将结果的低32位与eax累加,直到ecx的数值全部溢出(ecx=0),时才停止。然后将eax的累加结果返回后,和fCalDigit函数的第一个参数相乘。这个结果就是fCalDigit函数的返回值。
程序中很多地方就是比较这个返回值与内存中某个值是否相等,不等,则出错。
这里面的算法思想实在弄不明白,也不知道这种算法是否可以逆推求解,恳请高手们给予分析指点,谢谢。
另注:fCalDigit 函数中第2个参数经常传入一个固定值:1A5634AFh, 有时也是其它值。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课