首页
社区
课程
招聘
[旧帖] [求助]请帮忙看看注册算法 0.00雪花
发表于: 2007-6-12 10:09 4222

[旧帖] [求助]请帮忙看看注册算法 0.00雪花

2007-6-12 10:09
4222
某仓管软件(delphi)的核心算法,软件已经爆了,侥幸跟到算法,发现该软件是通过将得到的BIOS数据通过计算转换为字符串即注册码,无奈汇编基础太菜(属于查字典一族),请各位详细指点一二。

00508F20  /$55              PUSH EBP
00508F21  |.8BEC            MOV EBP,ESP
00508F23  |.83C4 F0         ADD ESP,-10
00508F26  |.53              PUSH EBX
00508F27  |.56              PUSH ESI
00508F28  |.8BF1            MOV ESI,ECX
00508F2A  |.8955 FC         MOV DWORD PTR SS:[EBP-4],EDX
00508F2D  |.8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
00508F30  |.E8 4BBEEFFF     CALL csoft.00404D80                      ;  D7.System.@LStrAddRef(void;void):Pointer;
00508F35  |.33C0            XOR EAX,EAX
00508F37  |.55              PUSH EBP
00508F38  |.68 AF8F5000     PUSH csoft.00508FAF
00508F3D  |.64:FF30         PUSH DWORD PTR FS:[EAX]
00508F40  |.64:8920         MOV DWORD PTR FS:[EAX],ESP
00508F43  |.33DB            XOR EBX,EBX
00508F45  |.8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
00508F48  |.E8 4BBCEFFF     CALL csoft.00404B98                      ;  D7.System.@LStrLen(String):Integer;
00508F4D  |.85C0            TEST EAX,EAX
00508F4F  |.76 1C           JBE SHORT csoft.00508F6D
00508F51  |.BA 01000000     MOV EDX,1

以下为循环取字符串,然后将取出的字符转换为ASCII码,进行计算,过程不复杂,先加码值,
然后*2,得到的值+该值*7,重复循环,直至取完。

00508F56  |>8B4D FC         /MOV ECX,DWORD PTR SS:[EBP-4]
00508F59  |.0FB64C11 FF     |MOVZX ECX,BYTE PTR DS:[ECX+EDX-1]      
00508F5E  |.03D9            |ADD EBX,ECX
00508F60  |.8BCB            |MOV ECX,EBX
00508F62  |.03C9            |ADD ECX,ECX
00508F64  |.8D0C89          |LEA ECX,DWORD PTR DS:[ECX+ECX*7]
00508F67  |.8BD9            |MOV EBX,ECX
00508F69  |.42              |INC EDX
00508F6A  |.48              |DEC EAX
00508F6B  |.75 E9           \JNZ SHORT csoft.00508F56

从以下开始,看不懂了,晕!请各位帮忙看看,详细指点一二!

00508F6D  |>69C3 39300000   IMUL EAX,EBX,4069    ;从这句起就对不上号了,计算出来的结果是1A4CB026E,
                                                 ;而软件得到的正确结果却将第一位“1”截去了,何故!
00508F73  |.8945 F0         MOV DWORD PTR SS:[EBP-10],EAX
00508F76  |.33C0            XOR EAX,EAX
00508F78  |.8945 F4         MOV DWORD PTR SS:[EBP-C],EAX
00508F7B  |.DF6D F0         FILD QWORD PTR SS:[EBP-10]
00508F7E  |.D835 BC8F5000   FDIV DWORD PTR DS:[508FBC]
00508F84  |.D95D F8         FSTP DWORD PTR SS:[EBP-8]
00508F87  |.9B              WAIT
00508F88  |.D945 F8         FLD DWORD PTR SS:[EBP-8]
00508F8B  |.83C4 F4         ADD ESP,-0C
00508F8E  |.DB3C24          FSTP TBYTE PTR SS:[ESP]                  ; |
00508F91  |.9B              WAIT                                     ; |
00508F92  |.8BC6            MOV EAX,ESI                              ; |
00508F94  |.E8 9F1EF0FF     CALL csoft.0040AE38                      ; \csoft.0040AE38
00508F99  |.33C0            XOR EAX,EAX
00508F9B  |.5A              POP EDX
00508F9C  |.59              POP ECX
00508F9D  |.59              POP ECX
00508F9E  |.64:8910         MOV DWORD PTR FS:[EAX],EDX
00508FA1  |.68 B68F5000     PUSH csoft.00508FB6
00508FA6  |>8D45 FC         LEA EAX,DWORD PTR SS:[EBP-4]
00508FA9  |.E8 22B9EFFF     CALL csoft.004048D0                      ;  D7.System.@LStrClr(void;void);
00508FAE  \.C3              RETN

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
2
你给的这个算法不难,应该很好写注册机。
00508F6D  |>69C3 39300000   IMUL EAX,EBX,4069    ;从这句起就对不上号了,计算出来的结果是1A4CB026E,
                                                 ;而软件得到的正确结果却将第一位“1”截去了,何故!

这一句是因为你得出的结果已经超出32位长度数据,32位的机器一个寄存器最长只能保存前32位长度,软件没有使用超出的32位后的数据,所以第一位1被截去了。
2007-6-12 11:50
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
3
你分析到这里,要做注册机可以说是很简单了,我看你发的代码除了下面几句不算楚外,其他都很明了。
00508F7E  |.D835 BC8F5000   FDIV DWORD PTR DS:[508FBC]  ; 508FBC保存的是什么值?是固定不变的值,还是动态计算得到的?
00508F84  |.D95D F8         FSTP DWORD PTR SS:[EBP-8]
00508F87  |.9B              WAIT
00508F88  |.D945 F8         FLD DWORD PTR SS:[EBP-8]
00508F8B  |.83C4 F4         ADD ESP,-0C
00508F8E  |.DB3C24          FSTP TBYTE PTR SS:[ESP]                  ; |
00508F91  |.9B              WAIT                                     ; |
00508F92  |.8BC6            MOV EAX,ESI                              ; |
00508F94  |.E8 9F1EF0FF     CALL csoft.0040AE38                      ; \csoft.0040AE38  ; 这个Call是干什么用?
2007-6-12 11:56
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bqe
4
谢谢版主的解答,后面几句是将整数又转换成了小数(跟踪结果),看了半天,查了书藉还是弄不懂,请详细说明一下后半部份的意思,谢谢!(版主说的保存的值我再跟跟看看!)
2007-6-12 12:02
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
5
; 下面的指令都是浮点运算指令。
00508F7B  |.DF6D F0         FILD QWORD PTR SS:[EBP-10]     ; 将运算得到的整数装入FPU寄存器st(0)里
00508F7E  |.D835 BC8F5000   FDIV DWORD PTR DS:[508FBC]     ; st(0) 除以 [508FBC]里保存的值,结果保存在st(0)
00508F84  |.D95D F8         FSTP DWORD PTR SS:[EBP-8]      ; 将st(0)里的运算后的数据出栽,转成实数格式放到[EBP-8]的局部变量中
00508F87  |.9B              WAIT                           ; 同步CPU和FPU,停止CPU运行,直到FPU完成操作
00508F88  |.D945 F8         FLD DWORD PTR SS:[EBP-8]       ; 将[EBP-8]局部变量中保存的实数装入st(0)
00508F8B  |.83C4 F4         ADD ESP,-0C
00508F8E  |.DB3C24          FSTP TBYTE PTR SS:[ESP]        ; 放到某个局部变量,上面两句似乎没有作用,可能只是转移变量用的。中                  ; |
00508F91  |.9B              WAIT                                     ; |
00508F92  |.8BC6            MOV EAX,ESI                              ; |
00508F94  |.E8 9F1EF0FF     CALL csoft.0040AE38                      ; \csoft.0040AE38
2007-6-12 12:15
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bqe
6
谢谢版主,看来汇编功底太差了看算法简直就是看天书,还是得打好基础!
2007-6-12 15:24
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bqe
7
00508F7E  |.D835 BC8F5000   FDIV DWORD PTR DS:[508FBC]  ;[508FBC]里保存的值是固定值。
;通过跟踪后发现以下几句运行后与计算结果又对不上号了,软件计算出的结果为带小数的数值,通过截取前十位转换为字符即注册码,但运行以下四行后,前6-7位可和手工计算出来的结果一一对应,后3-4位直接对不上号了(运行至此得到结果为123.1234567)
00508F84  |.D95D F8         FSTP DWORD PTR SS:[EBP-8]
00508F87  |.9B              WAIT
00508F88  |.D945 F8         FLD DWORD PTR SS:[EBP-8]
00508F8B  |.83C4 F4         ADD ESP,-0C

;运行以上四行后,结果为123.1236543(看不出规律),晕(软件注册要求十位全对上)。烦劳各位再指点一二。
2007-6-13 11:39
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
8
将[508FBC]保存的值发上来看看。
2007-6-13 11:43
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bqe
9
谢谢版主的指导,[508FBC]保存的值是856779,运算出来的数据为带二十多位小数的值,从第6-7位起全对不上。
2007-6-13 11:45
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
10
没办法帮你测试,信息太少,而且有几个东西还没搞清楚。
LEA ECX,DWORD PTR DS:[ECX+ECX*7] ; 这一句汇编似乎没办法汇编成功,汇编指令中似乎没有*7的这条指令lea ecx,dword ptr [ecx+ecx*2]或[ecx+ecx*4]或[ecx+ecx*8]指令倒是有。
[508FBC]你说出的数值是16进制的数还是10进制数,或者是浮点的数?
还有你测试用的假码是什么,用你的假码软件最后得出的值和你算的值又是什么(要说明是十六进制还是十进制或小数的)?
2007-6-13 12:58
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bqe
11
谢谢版主不断的指导,非常感谢!弄了一个星期了,头也晕了,放弃了(反正软件已经爆了)!
2007-6-13 14:36
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bqe
12
小虾版主,有关信息已发到你的邮箱,谢谢您的指导!
2007-6-29 09:43
0
游客
登录 | 注册 方可回帖
返回
//