00402300 SUB ESP,24
00402303 MOV EAX,DS:[405020]
00402308 PUSH EDI
00402309 MOV EDI,SS:[ESP+2C]
0040230D MOV SS:[ESP+24],EAX
00402311 LEA EAX,SS:[ESP+4]
00402315 PUSH EAX
00402316 PUSH 0
00402318 PUSH 0
0040231A PUSH 8004
0040231F PUSH EDI
00402320 CALL DS:[<&ADVAPI32.CryptCreateHash>]
00402326 TEST EAX,EAX
00402328 JE cryptex.004023CA
0040232E MOV EDX,SS:[ESP+30]
00402332 MOV EAX,EDX
00402334 PUSH ESI
00402335 LEA ESI,DS:[EAX+1]
00402338 MOV CL,DS:[EAX]
0040233A ADD EAX,1
0040233D TEST CL,CL
0040233F JNZ SHORT cryptex.00402338
00402341 MOV ECX,SS:[ESP+8]
00402345 PUSH 0
00402347 SUB EAX,ESI
00402349 PUSH EAX
0040234A PUSH EDX
0040234B PUSH ECX
0040234C CALL DS:[<&ADVAPI32.CryptHashData>]
00402352 TEST EAX,EAX
00402354 POP ESI
00402355 JE SHORT cryptex.004023BF
00402357 XOR EAX,EAX
00402359 MOV SS:[ESP+11],EAX
0040235D MOV SS:[ESP+15],EAX
00402361 MOV SS:[ESP+19],EAX
00402365 MOV SS:[ESP+1D],EAX
00402369 MOV SS:[ESP+21],AX
0040236E LEA ECX,SS:[ESP+C]
00402372 LEA EDX,SS:[ESP+10]
00402376 MOV SS:[ESP+23],AL
0040237A MOV BYTE PTR SS:[ESP+10],0
0040237F MOV DWORD PTR SS:[ESP+C],14
00402387 PUSH EAX
00402388 MOV EAX,SS:[ESP+8]
0040238C PUSH ECX
0040238D PUSH EDX
0040238E PUSH 2
Listing 6.5 The Cryptex key-generation function.
214 Chapter 6