ikeeper爱克吧上网卡磁条信息算法分析

ikeeper爱克吧上网卡现在早已退出了历史舞台,不过对于学习,把当时分析的爱克吧上网卡磁条信息算法归纳整理一下,算做温故而知新吧!本文属原创,百脑问bnwin.com首发!

ikeeper爱克吧是什么?
【Ikeeper计费管理系统】是重庆智多信息发展有限公司继【实名上网管理系统】后全新开发的计费管理版本。主要用于网吧,学校及各种收费机房的管理,是一款真正全方位从各网吧老板及各种营业性收费机房业主经营管理角度出发,设计体贴入微的经营管理软件。经过我公司不断的升级完善,目前已经得到了广大用户广泛认可。在重庆地区拥有百分之九十以上的市场占有率,目前公司正在积极拓展四川、海南、内蒙等市场并取得了巨大的成就,充分显示了【Ikeeper计费管理系统】与其他同类产品比较所具备的明显技术优势。
简而言之爱克吧就是公安网监强制要求网吧安装的网吧安全及计费实名管理系统!

上网卡是什么?
上网卡是爱克吧系统为实现实名制而采用的一种磁卡,上网卡根据身份证信息注册后使用,和银行的磁卡形状及使用方法一样!上网卡有10位数字(如0231466248),但磁条信息并不是只记录了10位数字,而是这种;200329902314662482=500999000113801? 记录了相关信息。
看看上网卡的实物

上网卡磁条信息算法解析

本文本着学习的思想,当前已经不能使用上网卡,所以发布上网卡磁条信息算法,仅供学习使用,费话不多说,下面入正题,正式分析上网卡磁条信息内容:

先设置一个常量

常量表
493806291608186256487098521453479841593425669412557213331214712906201512413249919383758208612080780228491236189833979289217766495864839471398976449709001708631663736696479153718969090756731903064662430102993165969185690184619921373013471

然后我们举一个例,如上网卡号 7474747474
磁条信息为
;200391774747474742=500999000151993?

分解为
;200 3917 7474747474 2 =5009990001 51993 ?
1234 5 67890 算法及分析此1-10位的算法
而;200 =5009990001和末尾的?为常量,无需要计算。中间为卡号也无需计算,需要计算的就是上图标识的1-10位的数的由来

以下是上网卡磁条信息的delphi的源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
function getnumtotal(firstnum:Integer;jsstring:string;ys:Boolean):Integer; //字符串acsii相加减
var
ls,x:integer;
ls1:string;
begin
x:=firstnum;
for ls:=1 to Length(jsstring) do
begin
if ys then
x:=x+ord(jsstring[ls])
else
x:=x-ord(jsstring[ls]);
ls1:='$'+inttohex(x,2);
if Length(ls1)>3 then
x:=strtoint('$'+rightstr(ls1,2));
end;
result:=x;
end;

function fullcard(numcard:string):string; //取得完整磁卡编码
var
mycont,mycont1,mycont2,mycont3,mycont4,mycont5:string;
mystr1,mystr2,lsstring:string;
a1,a2,a3,a4,a5,a6,a7,a8,a9,a10:integer;
b1,b2,b3,b4,b5,b6,b7,b8,b9,b10:string;
ls1,ls2:integer;
begin
//常量表
mycont:='493806291608186256487098521453479841593425669412557213331214712906201512413249919383758208612080780228491236189833979289217766495864839471398976449709001708631663736696479153718969090756731903064662430102993165969185690184619921373013471';
mystr1:=Trim(numcard); //上网卡号
mystr2:='5009990001'; //常数
mycont1:=mystr1+mystr2; //形成 74747474745009990001
mycont2:=LeftStr(mystr1,5)+rightstr(mystr2,5); //形成7474790001
mycont3:=RightStr(mystr1,5)+leftstr(mystr2,5); //形成4747450099
//第一位
a1:=getnumtotal($35,mycont1,true)*getnumtotal($0C,mycont1,false);
a1:=a1 mod $D7;
b1:=mycont[a1+1];
//第二位
a2:=(a1 shl 2)*3 ;
a2:=a2 mod $93;
b2:=mycont[a2+1];
//第四位
a4:=(a2+a1) shl 3;
a4:=a4 mod $DA;
b4:=mycont[a4+1];
//第七位
a7:=(a1 shl 5)+a4;
a7:=a7*$20 mod $DA;
b7:=mycont[a7+1];
//第八位
a8:=((a1 shl 5)+a1+a7)*$21;
a8:=a8 mod $DA;
b8:=mycont[a8+1];
//第九位
a9:=((a1 shl 5)+a1+a1+a8)*$22;
a9:=a9 mod $DA;
b9:=mycont[a9+1];
//第三位
a3:=getnumtotal($7,mycont2,True)+a1;
a3:=(a3 shl 3)-getnumtotal($7,mycont2,True)-a1;
a3:=a3 mod $93;
b3:=mycont[a3+1];
//第十位
a10:=getnumtotal($11,mycont3,false)+a1;
a10:=(a10 shl 3)-getnumtotal($11,mycont3,false)-a1;
a10:=a10+(a10 shl 2);
a10:=a10 mod $93;
b10:=mycont[a10+1];
//第五位
mycont4:=';=200'+b1+b2+b3+b4+mystr1; //;=20039177474747474
ls1:=getnumtotal(a1,mycont4,False);
lsstring:='='+mystr2;
ls2:=getnumtotal(ls1,lsstring,True);
a5:=getnumtotal(ls2,b7+b8+b9+b10,False)+a1;
a5:=a5+(a5+(a5 shl 3))*2;
a5:=a5 mod $93;
b5:=mycont[a5+1];
//第六位
mycont5:=mycont4+b5+'='+mystr2;
a6:=getnumtotal(getnumtotal(a1,mycont5,True),b7+b8+b9+b10,False)+a1;
a6:=(a6 shl 5)-a6;
a6:=a6 mod $93;
b6:=mycont[a6+1];
result:='200'+b1+b2+b3+b4+mystr1+b5+'='+mystr2+b6+b7+b8+b9+b10;
end;
1
2
3
4
5
6
7
8
9
10
11
0058C14B . 8D55 9C lea edx, [ebp-64]
0058C14E . 8B86 00030000 mov eax, [esi+300]
0058C154 . E8 F7DCEDFF call 00469E50
0058C159 . 8B55 9C mov edx, [ebp-64] ;输入的卡号
0058C15C . A1 64355900 mov eax, [593564]
0058C161 . 8B00 mov eax, [eax]
0058C163 . 59 pop ecx
0058C164 . E8 7360FFFF call 005821DC ;磁条完整信息生成函数
0058C169 . A1 64645900 mov eax, [596464]
0058C16E . 50 push eax
0058C16F . 8B45 FC mov eax, [ebp-4] ;完整的磁条信息

15=200 0847 A 5=5009990001 89124

常量表
493806291608186256487098521453479841593425669412557213331214712906201512413249919383758208612080780228491236189833979289217766495864839471398976449709001708631663736696479153718969090756731903064662430102993165969185690184619921373013471

例 ;200 3917 7474747474 2 =5009990001 51993?
1234 5 67890
;200

  1. (35+74747474745009990001)(0C-74747474745009990001) MOD D7=4DF4 mod d7=18788 mod D7=53——-[ebp-$68]——->3

  2. 53 shl 2=14C (14c+14c*2) MOD 93=3E4 MOD 93=72—————————————-[ebp-$6C]———–>9

4 (72+53)=C5 shl 3=628 MOD DA=32———————————————————-[ebp-$70]————>7

7 53 shl 5=A60 (A60+32)*20(常量) MOD DA=2E———————————————-[ebp-$74]————->1

8 53 shl 5=A60 ((A60+53)+2E)*21(常量) mod DA=7F—————————————–[ebp-$78]————->9

9 ((53 shl 5)+53+53+7F)*22(常量) MOD Da=CC ————————————————[ebp-$7C]——————->9

  1. (7+7474790001)=0E+53=61左移三位 (308-0E-53=2A7) mod 93=5B——————————[ebp-$80]————–>1

10 (11-4747450099)=00+53=53左移三位 (298-00-53=245+(245左移两位914))=B59 mod 93=70——-[ebp+$FFFFFF7C]——->3

5 (53-;=20039177474747474=5E)+(=5009990001)=9C-(最后四位即7+8+9+10位)1993=C6+53=119左移三位 8C8+119=9E1 9E1+9E1+119=14DB MOD 93=2F—>2

开始拼凑前面的部分 [ebp+$FFFFFF78]

6 [(53+;=200391774747474742=5009990001=B8)-(最后四位即7+8+9+10位)1993]=E2+53=135左移5位 26A0-135=256B Mod 93=18—-[ebp+$FFFFFF74]–>5

-------------本文已结束赏个小钱吧-------------
×

感谢您的支持,我们会一直保持!

扫码支持
请土豪扫码随意打赏

打开微信扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

64.7K

相关文章推荐