首先找到消息处理函数处。就是下面
/*401EC0*/ PUSH EBP
/*401EC1*/ MOV EBP,ESP
/*401EC3*/ SUB ESP,4C
/*401EC6*/ PUSH EBX
/*401EC7*/ PUSH ESI
/*401EC8*/ PUSH EDI
/*401EC9*/ PUSH ECX
/*401ECA*/ LEA EDI,DWORD PTR SS:[EBP-4C]
/*401ECD*/ MOV ECX,13
/*401ED2*/ MOV EAX,CCCCCCCC
/*401ED7*/ REP STOS DWORD PTR ES:[EDI]
/*401ED9*/ POP ECX
/*401EDA*/ MOV DWORD PTR SS:[EBP-4],ECX
/*401EDD*/ MOV EAX,DWORD PTR SS:[EBP-4]
/*401EE0*/ ADD EAX,98
/*401EE5*/ MOV DWORD PTR SS:[EBP-8],EAX
/*401EE8*/ MOV ECX,DWORD PTR SS:[EBP-4]
/*401EEB*/ ADD ECX,5C
/*401EEE*/ MOV DWORD PTR SS:[EBP-C],ECX
/*401EF1*/ PUSH 0
/*401EF3*/ PUSH 0
/*401EF5*/ PUSH 0
/*401EF7*/ PUSH 0
/*401EF9*/ LEA EDX,DWORD PTR SS:[EBP-C]
/*401EFC*/ PUSH EDX
/*401EFD*/ PUSH math.00401023
/*401F02*/ CALL math.0047B275
/*401F07*/ PUSH 0
/*401F09*/ PUSH 0
/*401F0B*/ PUSH 0
/*401F0D*/ PUSH 0
/*401F0F*/ LEA EAX,DWORD PTR SS:[EBP-C]
/*401F12*/ PUSH EAX
/*401F13*/ PUSH math.00401091
/*401F18*/ CALL math.0047B275
/*401F1D*/ PUSH 0
/*401F1F*/ PUSH 0
/*401F21*/ PUSH 0
/*401F23*/ PUSH 0
/*401F25*/ LEA ECX,DWORD PTR SS:[EBP-C]
/*401F28*/ PUSH ECX
/*401F29*/ PUSH math.00401069
/*401F2E*/ CALL math.0047B275
/*401F33*/ PUSH 0
/*401F35*/ PUSH 0
/*401F37*/ PUSH 0
/*401F39*/ PUSH 0
/*401F3B*/ LEA EDX,DWORD PTR SS:[EBP-C]
/*401F3E*/ PUSH EDX
/*401F3F*/ PUSH math.00401046
/*401F44*/ CALL math.0047B275
/*401F49*/ PUSH 0
/*401F4B*/ PUSH 0
/*401F4D*/ PUSH 0
/*401F4F*/ PUSH 0
/*401F51*/ LEA EAX,DWORD PTR SS:[EBP-C]
/*401F54*/ PUSH EAX
/*401F55*/ PUSH math.00401037
/*401F5A*/ CALL math.0047B275
/*401F5F*/ PUSH 0
/*401F61*/ PUSH 0
/*401F63*/ PUSH 0
/*401F65*/ PUSH 0
/*401F67*/ LEA ECX,DWORD PTR SS:[EBP-C]
/*401F6A*/ PUSH ECX
/*401F6B*/ PUSH math.0040106E
/*401F70*/ CALL math.0047B275
/*401F75*/ PUSH 0
/*401F77*/ PUSH 0
/*401F79*/ PUSH 0
/*401F7B*/ PUSH 0
/*401F7D*/ PUSH 0
/*401F7F*/ PUSH math.0040100A
/*401F84*/ CALL math.0047B275
/*401F89*/ POP EDI
/*401F8A*/ POP ESI
/*401F8B*/ POP EBX
很明显是用多线程来检测的。
哇,7个线程,好多啊
我们一个个的看每个线程的作用
第一个:401023--->401fd0
作者可能用debug模式的静态库编译的 程序超大 里面代码很罗嗦 我就不复制了
第一个线程主要是检测
(用户名长度+注册码长度)mod (0xc)=0
那我们姑且先认为是(用户名长度+注册码长度)=12
接下来看第2个线程。
401091--->402080
这里是检测用户名必须是0-9中的数字
第3个线程
401069---->4021d0
这里是检测注册码必须是0-9中的数字
第4个线程
401046--->402320
到第四个线程便是算法部分了
我们不妨这样假设
user:x1x2
sn:y1y2
那么第四个线程所要求的是
x1 mod 3=0
y2 mod 7=0
y2-x1=2
可以再假设x1=3a y2=7b
满足7b-3a=2即可 当然a,b为正整数
接下来看第5个线程:
401037--->4025e0
/*4026E1*/ MOV DWORD PTR SS:[EBP-50],EAX
/*4026E4*/ MOV EDX,DWORD PTR SS:[EBP-50]
/*4026E7*/ PUSH EDX
/*4026E8*/ CALL <math._atoi>
/*4026ED*/ ADD ESP,4
/*4026F0*/ MOV DWORD PTR SS:[EBP-28],EAX
/*4026F3*/ PUSH 0
/*4026F5*/ LEA ECX,DWORD PTR SS:[EBP-20]
/*4026F8*/ CALL math.00487C08
/*4026FD*/ MOV DWORD PTR SS:[EBP-54],EAX
/*402700*/ MOV EAX,DWORD PTR SS:[EBP-54]
/*402703*/ PUSH EAX
/*402704*/ CALL <math._atoi>
/*402709*/ ADD ESP,4
/*40270C*/ MOV DWORD PTR SS:[EBP-24],EAX
/*40270F*/ MOV ECX,DWORD PTR SS:[EBP-28]
/*402712*/ SUB ECX,DWORD PTR SS:[EBP-24]
/*402715*/ CMP ECX,-2
/*402718*/ JNZ SHORT math.00402741
/*40271A*/ MOV EAX,DWORD PTR SS:[EBP-28]
/*40271D*/ CDQ
/*40271E*/ MOV ECX,5
/*402723*/ IDIV ECX
/*402725*/ TEST EDX,EDX
/*402727*/ JNZ SHORT math.00402741
/*402729*/ MOV EAX,DWORD PTR SS:[EBP-24]
/*40272C*/ CDQ
/*40272D*/ MOV ECX,9
/*402732*/ IDIV ECX
/*402734*/ TEST EDX,EDX
/*402736*/ JNZ SHORT math.00402741
/*402738*/ MOV DWORD PTR SS:[EBP-58],1
/*40273F*/ JMP SHORT math.00402748
/*402741*/ MOV DWORD PTR SS:[EBP-58],0
/*402748*/ MOV EDX,DWORD PTR SS:[EBP-58]
/*40274B*/ MOV DWORD PTR DS:[5EB73C],EDX
这里需要满足的条件是:
x2 mod 5=0
y1 mod 9=0
y1-x2=2
可以再假设x2=5c y2=9d
满足9d-5c=2即可。
下面看第6个线程。
40106e---->4028a0
/*4029BA*/ ADD ESP,4
/*4029BD*/ MOV DWORD PTR SS:[EBP-28],EAX
/*4029C0*/ MOV EDX,DWORD PTR SS:[EBP-24]
/*4029C3*/ SUB EDX,DWORD PTR SS:[EBP-28]
/*4029C6*/ CMP EDX,-1
/*4029C9*/ JNZ SHORT math.004029F2
/*4029CB*/ MOV EAX,DWORD PTR SS:[EBP-24]
这里需要满足x2-x1=1
也就是5c-3a=1
第7个线程是这里
/*402BEF*/ CMP ESI,ESP
/*402BF1*/ CALL <math.__chkesp>
/*402BF6*/ CMP DWORD PTR DS:[5EB74C],0
/*402BFD*/ JE SHORT math.00402C35
/*402BFF*/ CMP DWORD PTR DS:[5EB748],0
/*402C06*/ JE SHORT math.00402C35
/*402C08*/ CMP DWORD PTR DS:[5EB744],0
/*402C0F*/ JE SHORT math.00402C35
/*402C11*/ CMP DWORD PTR DS:[5EB740],0
/*402C18*/ JE SHORT math.00402C35
/*402C1A*/ CMP DWORD PTR DS:[5EB73C],0
/*402C21*/ JE SHORT math.00402C35
/*402C23*/ CMP DWORD PTR DS:[5EB738],0
/*402C2A*/ JE SHORT math.00402C35
/*402C2C*/ MOV DWORD PTR SS:[EBP-8],1
/*402C33*/ JMP SHORT math.00402C3C
/*402C35*/ MOV DWORD PTR SS:[EBP-8],0
/*402C3C*/ MOV EAX,DWORD PTR SS:[EBP-8]
显然是对比 前面6个线程是否都符合条件
符合的话就OK了。
根据前面的总结
也就是3个方程 4个未知数。
7b-3a=2
9d-5c=2
5c-3a=1
由以上方程求出a,b,c,d就行了 再分别代入前面的假设就可以求出x1,x2,y1,y2
我随便算了下面三组
a=53 b=23 c=32 d=18
a=158 b=68 c=95 d=53
a=263 b=113 c=158 d=88
x1=3a 159 474 789 y2=7b 161 476 791
x2=5c 160 475 790 y1=9d 162 477 792
第一组
159160
162161
第二组
474475
477476
第三组
789790
792791
现在有计算机了 不用手算了
我最笨的办法算的
int main(int argc, char* argv[])
{
int a,b,c,d;
for(a=0;a<300;a++){
for(b=0;b<300;b++){
for(c=0;c<300;c++){
for(d=0;d<300;d++){
if( (7*b-3*a==2)&&(9*d-5*c==2)&&(5*c-3*a==1) )
{
printf("a=%d b=%d c=%d d=%d\n",a,b,c,d);
}
}
}
}
}
printf("Hello World!\n");
return 0;
}
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)