客户需求:
由于要发行新卡,但是这个软件没有写磁卡的功能,用HCE300 系列写磁卡软件写的磁卡在软件内读出时无法读出正确的对应的卡面号码,需要分析卡面号码与磁条号码的转换算法,写出转换程序。
分析过程:
1、 用RESSCOPE 打开软件没有找到对应的界面资源,客户提醒在 Rcjz.dll.dll 文件中。用 RESSCOPE 打开,找到了对应的对话框资源。查找到一个编辑框控件 EditCardNo:TEdit ,
有三个事件和对应的响应函数,分别是:
OnExit = EditCardNoExit
OnKeyDown = FormKeyDown
OnKeyPress = EditCardNoKeyPress
用WINHEX 打开 RCJZ..DLL 查找 EditCardNoExit 、 EditCardNoKeyPress ,它们对应的处理函数地址为:
EditCardNoExit : 007380DC
EditCardNoKeyPress : 00738D68
2、 OD载入主程序 EPI.exe ,运行到发卡界面。 Alt+M 找到 RCJZ.DLL 载入地址, F2 下断点。进入了 RCJZ.DLL 领空,分别找到后面为 80DC 、 8D68 的地址,对应为 036380DC 和 03638D68 。在它们的入口下断点。 F9 回到主界面,输入 ; 2056948222 ,输入分号时无显示(为什么?后面会说)。每次输入都会激活 03638D68 ,其中有些检测代码包括分号的检测,如果输入分号开头就会自动进行磁条号码到卡面号码的转换,否则不会。输入完成后,回到主界面,点击‘确定’按钮,但不要松开鼠标,激活了 03680DC 地址(如果没有在 03680DC 下断点编辑框里就有对应的卡面号码,说明这个地址开始的代码进行了转换)。继续跟踪,主要代码是三个循环,它们实现以下功能:
有几个基本码:
4065729813
5290673148
83641752
423901856742390185674239018567
以输入磁条号码 2056948222 为例,对后八个数字进行转换:
(1) 进行如下转换
56948222 ( A ) 4065729813 (B ) 5290673148 ( C )
(A )中的第 1 个数字 5 出现在( B )中第 4 个位置,( C )中第 4 个位置为 0
2 6 3 9 ^
3 9 7 3 |
4 4 1 5 |
5 8 8 1 |
6 2 6 7 |
7 2 6 7 |
8 2 6 7 |
从下往上念为:77715390 ( D )
(2 )进行如下转换
先对基本号码83641752 进行转换,依次找到
1 2 3 4 5 6 7 8 在83641752 中的位置为:
5 8 2 4 7 3 6 1 (E )
以(E )中的数字为下标,依次找到( D )中的对应的值:
位置 值
5 5
8 0
2 7
4 1
7 9
3 7
6 3
1 7
值合成即:50719737 ( F )
(3) 进行如下转换
423901856742390185674239018567 (G)
从(F )中最后的数字 7 和输入的第二个数字 0 的和再除余 10 的结果(即( 7+0 ) %10 )) 为开始位置取(G )中的 10 个数字,为 5674239018 。
找(F )第 1 个数字 5 在 5674239018 中的位置为 1 数组下标为 0
2 0 6742390185 7 6
3 7 7423901856 1 0
4 1 4239018567 6 5
5 9 2390185674 3 2
6 7 3901856742 8 7
7 3 9018567423 10 9
合起来即:0605279 ,最后一个数字不变还是 7 ,头两个数字不变,因此最后结果为转换到的卡面号码: 2006052797
转换算法因为答应客户不要公布,所以请网友自己写出。