首页
社区
课程
招聘
[求助]老外的一个算法分析
2007-12-6 15:22 4831

[求助]老外的一个算法分析

2007-12-6 15:22
4831
这是老外的一个程序中的注册部分,关键算法代码,看了一个星期了,仍不明白其算法思路,请高手帮忙分析:

.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直播授课

收藏
点赞0
打赏
分享
最新回复 (6)
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
shoooo 16 2007-12-6 15:30
2
0
指到函数头 F5
雪    币: 266
活跃值: (52)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
szdbg 5 2007-12-6 15:59
3
0
不明白shoooo大哥的意思, 能否说明白一点,谢谢!
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
shoooo 16 2007-12-6 16:19
4
0
http://bbs.pediy.com/showthread.php?t=55801
雪    币: 266
活跃值: (52)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
szdbg 5 2007-12-6 16:38
5
0
小弟真是愚钝, 怎么就弄不明白shoooo大哥的意思呢?
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
shoooo 16 2007-12-6 16:39
6
0
装IDA 5.2 和那个hex-rays插件
然后就可以反编译你的函数
雪    币: 266
活跃值: (52)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
szdbg 5 2007-12-6 16:43
7
0
哦,原来如此,谢谢shoooo大哥指点,我试试看.
游客
登录 | 注册 方可回帖
返回