Господа! Столкнулся с алгоритмом. Выполняется как "Decrypt". аргументы при вызове: 0012EA30 0012EBBD |Arg1 = 0012EBBD ; cipher 0012EA34 0012EAF4 |Arg2 = 0012EAF4 0012EA38 0012EA74 |Arg3 = 0012EA74 0012EA3C 0012EBBD \Arg4 = 0012EBBD ; cipher / перезаписывается восстановленной информацией размер cipher = 0х80 используются два доп.блока тоже по 0х80 0012EAF4 Code (Text): 0012EAF4 11 1B 9F 3B EA 81 AB C1 2B F8 51 EF F1 81 6F 94 0012EB04 8E B6 7F 69 40 29 9F 59 B6 FC 87 1A AE 84 88 82 0012EB14 7F ED 8D 1F 6D 7A 47 A0 62 AB 4F ED E9 9C CA 3E 0012EB24 BD 00 F4 24 52 BF E5 3C 95 37 B5 D2 60 A5 1A 10 0012EB34 E8 96 F2 25 D2 DA 4D 7B 6B AC A9 56 4B 76 F6 4B 0012EB44 AF 86 31 0E C9 14 97 72 A1 DE 46 7C C4 E9 22 14 0012EB54 F0 DE 19 02 55 27 29 F1 06 F9 2F 16 E2 D7 68 C0 0012EB64 28 F9 98 33 16 7A 04 92 9F F0 B3 00 1D EA 71 5F и 0012EA74 Code (Text): 0012EA74 E9 07 9F 70 7D C3 51 11 E6 1D 71 C0 41 F1 A8 B6 0012EA84 BA 81 87 2D 7F D3 AE 47 01 DC 7E 10 12 42 DC 26 0012EA94 6D DB 2A 35 A0 ED E8 9D 66 39 7E DF 63 99 DD 90 0012EAA4 AB B4 89 17 A2 80 5C F0 5D 8C 90 61 CB AA FE 5F 0012EAB4 08 09 C7 22 F6 28 A2 23 EF 29 19 2D 05 CB 28 19 0012EAC4 2E C7 8B 8A DB 0B 46 34 98 96 1F 93 F0 FF 74 4A 0012EAD4 46 A5 71 9D 56 28 D0 00 49 60 32 7F 70 99 B6 89 0012EAE4 0C A6 52 46 BC 80 09 35 BC E9 96 0F 34 98 A4 0F собственно процедура: Code (Text): 00F22258 55 PUSH EBP 00F22259 8BEC MOV EBP, ESP 00F2225B 53 PUSH EBX 00F2225C 51 PUSH ECX 00F2225D 52 PUSH EDX 00F2225E 56 PUSH ESI 00F2225F 57 PUSH EDI 00F22260 FC CLD 00F22261 8B75 08 MOV ESI, DWORD PTR [EBP+8] 00F22264 8D3D FCA6F300 LEA EDI, DWORD PTR [F3A6FC] 00F2226A B9 80000000 MOV ECX, 80 00F2226F C1E9 02 SHR ECX, 2 00F22272 89CA MOV EDX, ECX 00F22274 F3:A5 REP MOVS DWORD PTR ES:[EDI], DWORD PTR [ESI] 00F22276 8B75 0C MOV ESI, DWORD PTR [EBP+C] 00F22279 8D3D 7CA6F300 LEA EDI, DWORD PTR [F3A67C] 00F2227F 89D1 MOV ECX, EDX 00F22281 F3:A5 REP MOVS DWORD PTR ES:[EDI], DWORD PTR [ESI] 00F22283 8B75 10 MOV ESI, DWORD PTR [EBP+10] 00F22286 8D3D 7CA7F300 LEA EDI, DWORD PTR [F3A77C] 00F2228C 89D1 MOV ECX, EDX 00F2228E F3:A5 REP MOVS DWORD PTR ES:[EDI], DWORD PTR [ESI] 00F22290 8D35 FCA6F300 LEA ESI, DWORD PTR [F3A6FC] 00F22296 8D3D FCA7F300 LEA EDI, DWORD PTR [F3A7FC] 00F2229C 89D1 MOV ECX, EDX 00F2229E F3:A5 REP MOVS DWORD PTR ES:[EDI], DWORD PTR [ESI] 00F222A0 8915 90A9F300 MOV DWORD PTR [F3A990], EDX 00F222A6 8B05 7CA6F300 MOV EAX, DWORD PTR [F3A67C] 00F222AC 31DB XOR EBX, EBX 00F222AE 89C1 MOV ECX, EAX 00F222B0 43 INC EBX 00F222B1 89DA MOV EDX, EBX 00F222B3 01D8 ADD EAX, EBX 00F222B5 74 12 JE SHORT 00F222C9 00F222B7 D1E3 SHL EBX, 1 00F222B9 72 0E JB SHORT 00F222C9 00F222BB D1E1 SHL ECX, 1 00F222BD 85D8 TEST EAX, EBX 00F222BF ^74 F6 JE SHORT 00F222B7 00F222C1 01C8 ADD EAX, ECX 00F222C3 01DA ADD EDX, EBX 00F222C5 D1E3 SHL EBX, 1 00F222C7 ^73 F2 JNB SHORT 00F222BB 00F222C9 8915 78A6F300 MOV DWORD PTR [F3A678], EDX 00F222CF 31C0 XOR EAX, EAX 00F222D1 8B0D 90A9F300 MOV ECX, DWORD PTR [F3A990] 00F222D7 C1E1 02 SHL ECX, 2 00F222DA 8DB9 7CA7F300 LEA EDI, DWORD PTR [ECX+F3A77C] 00F222E0 4F DEC EDI 00F222E1 FD STD 00F222E2 F3:AE REPE SCAS BYTE PTR ES:[EDI] 00F222E4 FC CLD 00F222E5 75 13 JNZ SHORT 00F222FA 00F222E7 8D3D FCA6F300 LEA EDI, DWORD PTR [F3A6FC] 00F222ED 8B0D 90A9F300 MOV ECX, DWORD PTR [F3A990] 00F222F3 F3:AB REP STOS DWORD PTR ES:[EDI] 00F222F5 E9 7C010000 JMP 00F22476 00F222FA 66:BA 0001 MOV DX, 100 00F222FE 66:D1EA SHR DX, 1 00F22301 8491 7CA7F300 TEST BYTE PTR [ECX+F3A77C], DL 00F22307 ^74 F5 JE SHORT 00F222FE 00F22309 80FA 01 CMP DL, 1 00F2230C 75 0D JNZ SHORT 00F2231B 00F2230E 39C1 CMP ECX, EAX 00F22310 0F84 60010000 JE 00F22476 00F22316 49 DEC ECX 00F22317 66:BA 0001 MOV DX, 100 00F2231B 890D 8CA9F300 MOV DWORD PTR [F3A98C], ECX 00F22321 66:D1EA SHR DX, 1 00F22324 66:8915 98A9F300 MOV WORD PTR [F3A998], DX 00F2232B 8D1D FCA6F300 LEA EBX, DWORD PTR [F3A6FC] 00F22331 E8 5B010000 CALL 00F22491 00F22336 8B1D 8CA9F300 MOV EBX, DWORD PTR [F3A98C] 00F2233C 66:8B15 98A9F300 MOV DX, WORD PTR [F3A998] 00F22343 8493 7CA7F300 TEST BYTE PTR [EBX+F3A77C], DL 00F22349 75 14 JNZ SHORT 00F2235F 00F2234B 8D35 FCA6F300 LEA ESI, DWORD PTR [F3A6FC] 00F22351 8D3D 7CA8F300 LEA EDI, DWORD PTR [F3A87C] 00F22357 8B0D 90A9F300 MOV ECX, DWORD PTR [F3A990] 00F2235D F3:A5 REP MOVS DWORD PTR ES:[EDI], DWORD PTR [ESI] 00F2235F 8D1D FCA7F300 LEA EBX, DWORD PTR [F3A7FC] 00F22365 E8 27010000 CALL 00F22491 00F2236A 8B1D 8CA9F300 MOV EBX, DWORD PTR [F3A98C] 00F22370 66:8B15 98A9F300 MOV DX, WORD PTR [F3A998] 00F22377 8493 7CA7F300 TEST BYTE PTR [EBX+F3A77C], DL 00F2237D 75 3E JNZ SHORT 00F223BD 00F2237F 8D35 FCA6F300 LEA ESI, DWORD PTR [F3A6FC] 00F22385 8D3D FCA8F300 LEA EDI, DWORD PTR [F3A8FC] 00F2238B 8B0D 90A9F300 MOV ECX, DWORD PTR [F3A990] 00F22391 F3:A5 REP MOVS DWORD PTR ES:[EDI], DWORD PTR [ESI] 00F22393 8D35 7CA8F300 LEA ESI, DWORD PTR [F3A87C] 00F22399 8D3D FCA6F300 LEA EDI, DWORD PTR [F3A6FC] 00F2239F 8B0D 90A9F300 MOV ECX, DWORD PTR [F3A990] 00F223A5 F3:A5 REP MOVS DWORD PTR ES:[EDI], DWORD PTR [ESI] 00F223A7 8D35 FCA8F300 LEA ESI, DWORD PTR [F3A8FC] 00F223AD 8D3D 7CA8F300 LEA EDI, DWORD PTR [F3A87C] 00F223B3 8B0D 90A9F300 MOV ECX, DWORD PTR [F3A990] 00F223B9 F3:A5 REP MOVS DWORD PTR ES:[EDI], DWORD PTR [ESI] 00F223BB EB 14 JMP SHORT 00F223D1 00F223BD 8D35 FCA6F300 LEA ESI, DWORD PTR [F3A6FC] 00F223C3 8D3D 7CA8F300 LEA EDI, DWORD PTR [F3A87C] 00F223C9 8B0D 90A9F300 MOV ECX, DWORD PTR [F3A990] 00F223CF F3:A5 REP MOVS DWORD PTR ES:[EDI], DWORD PTR [ESI] 00F223D1 66:D12D 98A9F300 SHR WORD PTR [F3A998], 1 00F223D8 73 16 JNB SHORT 00F223F0 00F223DA 66:C705 98A9F300 8000 MOV WORD PTR [F3A998], 80 00F223E3 832D 8CA9F300 01 SUB DWORD PTR [F3A98C], 1 00F223EA 0F82 86000000 JB 00F22476 00F223F0 8D1D FCA6F300 LEA EBX, DWORD PTR [F3A6FC] 00F223F6 E8 96000000 CALL 00F22491 00F223FB 66:8B15 98A9F300 MOV DX, WORD PTR [F3A998] 00F22402 8B1D 8CA9F300 MOV EBX, DWORD PTR [F3A98C] 00F22408 8493 7CA7F300 TEST BYTE PTR [EBX+F3A77C], DL 00F2240E ^74 C1 JE SHORT 00F223D1 00F22410 66:D1EA SHR DX, 1 00F22413 73 16 JNB SHORT 00F2242B 00F22415 66:19D3 SBB BX, DX 00F22418 73 0D JNB SHORT 00F22427 00F2241A 8D1D FCA7F300 LEA EBX, DWORD PTR [F3A7FC] 00F22420 E8 6C000000 CALL 00F22491 00F22425 EB 4F JMP SHORT 00F22476 00F22427 66:BA 8000 MOV DX, 80 00F2242B 66:8915 98A9F300 MOV WORD PTR [F3A998], DX 00F22432 891D 8CA9F300 MOV DWORD PTR [F3A98C], EBX 00F22438 8493 7CA7F300 TEST BYTE PTR [EBX+F3A77C], DL 00F2243E 75 1B JNZ SHORT 00F2245B 00F22440 8D1D FCA7F300 LEA EBX, DWORD PTR [F3A7FC] 00F22446 E8 46000000 CALL 00F22491 00F2244B 8D1D FCA6F300 LEA EBX, DWORD PTR [F3A6FC] 00F22451 E8 3B000000 CALL 00F22491 00F22456 ^E9 76FFFFFF JMP 00F223D1 00F2245B 8D1D FCA6F300 LEA EBX, DWORD PTR [F3A6FC] 00F22461 E8 2B000000 CALL 00F22491 00F22466 8D1D 7CA8F300 LEA EBX, DWORD PTR [F3A87C] 00F2246C E8 20000000 CALL 00F22491 00F22471 ^E9 5BFFFFFF JMP 00F223D1 00F22476 8D35 FCA6F300 LEA ESI, DWORD PTR [F3A6FC] 00F2247C 8B7D 14 MOV EDI, DWORD PTR [EBP+14] 00F2247F 8B0D 90A9F300 MOV ECX, DWORD PTR [F3A990] 00F22485 F3:A5 REP MOVS DWORD PTR ES:[EDI], DWORD PTR [ESI] 00F22487 5F POP EDI 00F22488 5E POP ESI 00F22489 5A POP EDX 00F2248A 59 POP ECX 00F2248B 5B POP EBX 00F2248C E9 2A010000 JMP 00F225BB 00F22491 53 PUSH EBX 00F22492 31C0 XOR EAX, EAX 00F22494 8D3D FCA8F300 LEA EDI, DWORD PTR [F3A8FC] 00F2249A 8B0D 90A9F300 MOV ECX, DWORD PTR [F3A990] 00F224A0 41 INC ECX 00F224A1 F3:AB REP STOS DWORD PTR ES:[EDI] 00F224A3 8905 94A9F300 MOV DWORD PTR [F3A994], EAX 00F224A9 89C7 MOV EDI, EAX 00F224AB 8B0D 90A9F300 MOV ECX, DWORD PTR [F3A990] 00F224B1 31F6 XOR ESI, ESI 00F224B3 58 POP EAX 00F224B4 8B1CB8 MOV EBX, DWORD PTR [EAX+EDI*4] 00F224B7 31FF XOR EDI, EDI 00F224B9 50 PUSH EAX 00F224BA 8B04B5 FCA6F300 MOV EAX, DWORD PTR [ESI*4+F3A6FC] 00F224C1 F7E3 MUL EBX 00F224C3 01F8 ADD EAX, EDI 00F224C5 83D2 00 ADC EDX, 0 00F224C8 0104B5 FCA8F300 ADD DWORD PTR [ESI*4+F3A8FC], EAX 00F224CF 83D2 00 ADC EDX, 0 00F224D2 46 INC ESI 00F224D3 89D7 MOV EDI, EDX 00F224D5 ^E2 E3 LOOPD SHORT 00F224BA 00F224D7 31FF XOR EDI, EDI 00F224D9 0114B5 FCA8F300 ADD DWORD PTR [ESI*4+F3A8FC], EDX 00F224E0 113CB5 00A9F300 ADC DWORD PTR [ESI*4+F3A900], EDI 00F224E7 8B05 78A6F300 MOV EAX, DWORD PTR [F3A678] 00F224ED 89FE MOV ESI, EDI 00F224EF F725 FCA8F300 MUL DWORD PTR [F3A8FC] 00F224F5 89C3 MOV EBX, EAX 00F224F7 F725 7CA6F300 MUL DWORD PTR [F3A67C] 00F224FD 0305 FCA8F300 ADD EAX, DWORD PTR [F3A8FC] 00F22503 11D7 ADC EDI, EDX 00F22505 8B0D 90A9F300 MOV ECX, DWORD PTR [F3A990] 00F2250B 49 DEC ECX 00F2250C 8B04B5 80A6F300 MOV EAX, DWORD PTR [ESI*4+F3A680] 00F22513 F7E3 MUL EBX 00F22515 01F8 ADD EAX, EDI 00F22517 83D2 00 ADC EDX, 0 00F2251A 0304B5 00A9F300 ADD EAX, DWORD PTR [ESI*4+F3A900] 00F22521 83D2 00 ADC EDX, 0 00F22524 8904B5 FCA8F300 MOV DWORD PTR [ESI*4+F3A8FC], EAX 00F2252B 89D7 MOV EDI, EDX 00F2252D 46 INC ESI 00F2252E ^E2 DC LOOPD SHORT 00F2250C 00F22530 31DB XOR EBX, EBX 00F22532 0314B5 00A9F300 ADD EDX, DWORD PTR [ESI*4+F3A900] 00F22539 131CB5 04A9F300 ADC EBX, DWORD PTR [ESI*4+F3A904] 00F22540 8914B5 FCA8F300 MOV DWORD PTR [ESI*4+F3A8FC], EDX 00F22547 891CB5 00A9F300 MOV DWORD PTR [ESI*4+F3A900], EBX 00F2254E 890CB5 04A9F300 MOV DWORD PTR [ESI*4+F3A904], ECX 00F22555 FF05 94A9F300 INC DWORD PTR [F3A994] 00F2255B 8B3D 94A9F300 MOV EDI, DWORD PTR [F3A994] 00F22561 3B3D 90A9F300 CMP EDI, DWORD PTR [F3A990] 00F22567 ^0F82 3EFFFFFF JB 00F224AB 00F2256D 39D9 CMP ECX, EBX 00F2256F 72 1A JB SHORT 00F2258B 00F22571 8B0D 90A9F300 MOV ECX, DWORD PTR [F3A990] 00F22577 8D348D 78A6F300 LEA ESI, DWORD PTR [ECX*4+F3A678] 00F2257E 8D3C8D F8A8F300 LEA EDI, DWORD PTR [ECX*4+F3A8F8] 00F22585 FD STD 00F22586 F3:A7 REPE CMPS DWORD PTR ES:[EDI], DWORD PTR [ESI] 00F22588 FC CLD 00F22589 77 1A JA SHORT 00F225A5 00F2258B F8 CLC 00F2258C 8B0D 90A9F300 MOV ECX, DWORD PTR [F3A990] 00F22592 31F6 XOR ESI, ESI 00F22594 8B04B5 7CA6F300 MOV EAX, DWORD PTR [ESI*4+F3A67C] 00F2259B 1904B5 FCA8F300 SBB DWORD PTR [ESI*4+F3A8FC], EAX 00F225A2 46 INC ESI 00F225A3 ^E2 EF LOOPD SHORT 00F22594 00F225A5 8B0D 90A9F300 MOV ECX, DWORD PTR [F3A990] 00F225AB 8D35 FCA8F300 LEA ESI, DWORD PTR [F3A8FC] 00F225B1 8D3D FCA6F300 LEA EDI, DWORD PTR [F3A6FC] 00F225B7 F3:A5 REP MOVS DWORD PTR ES:[EDI], DWORD PTR [ESI] 00F225B9 5B POP EBX 00F225BA C3 RETN 00F225BB 5D POP EBP 00F225BC C2 1000 RETN 10 в ней есть еще одна процедура: Code (Text): 00F22491 53 PUSH EBX 00F22492 31C0 XOR EAX, EAX 00F22494 8D3D FCA8F300 LEA EDI, DWORD PTR [F3A8FC] 00F2249A 8B0D 90A9F300 MOV ECX, DWORD PTR [F3A990] 00F224A0 41 INC ECX 00F224A1 F3:AB REP STOS DWORD PTR ES:[EDI] 00F224A3 8905 94A9F300 MOV DWORD PTR [F3A994], EAX 00F224A9 89C7 MOV EDI, EAX 00F224AB 8B0D 90A9F300 MOV ECX, DWORD PTR [F3A990] 00F224B1 31F6 XOR ESI, ESI 00F224B3 58 POP EAX 00F224B4 8B1CB8 MOV EBX, DWORD PTR [EAX+EDI*4] 00F224B7 31FF XOR EDI, EDI 00F224B9 50 PUSH EAX 00F224BA 8B04B5 FCA6F300 MOV EAX, DWORD PTR [ESI*4+F3A6FC] 00F224C1 F7E3 MUL EBX 00F224C3 01F8 ADD EAX, EDI 00F224C5 83D2 00 ADC EDX, 0 00F224C8 0104B5 FCA8F300 ADD DWORD PTR [ESI*4+F3A8FC], EAX 00F224CF 83D2 00 ADC EDX, 0 00F224D2 46 INC ESI 00F224D3 89D7 MOV EDI, EDX 00F224D5 ^E2 E3 LOOPD SHORT 00F224BA 00F224D7 31FF XOR EDI, EDI 00F224D9 0114B5 FCA8F300 ADD DWORD PTR [ESI*4+F3A8FC], EDX 00F224E0 113CB5 00A9F300 ADC DWORD PTR [ESI*4+F3A900], EDI 00F224E7 8B05 78A6F300 MOV EAX, DWORD PTR [F3A678] 00F224ED 89FE MOV ESI, EDI 00F224EF F725 FCA8F300 MUL DWORD PTR [F3A8FC] 00F224F5 89C3 MOV EBX, EAX 00F224F7 F725 7CA6F300 MUL DWORD PTR [F3A67C] 00F224FD 0305 FCA8F300 ADD EAX, DWORD PTR [F3A8FC] 00F22503 11D7 ADC EDI, EDX 00F22505 8B0D 90A9F300 MOV ECX, DWORD PTR [F3A990] 00F2250B 49 DEC ECX 00F2250C 8B04B5 80A6F300 MOV EAX, DWORD PTR [ESI*4+F3A680] 00F22513 F7E3 MUL EBX 00F22515 01F8 ADD EAX, EDI 00F22517 83D2 00 ADC EDX, 0 00F2251A 0304B5 00A9F300 ADD EAX, DWORD PTR [ESI*4+F3A900] 00F22521 83D2 00 ADC EDX, 0 00F22524 8904B5 FCA8F300 MOV DWORD PTR [ESI*4+F3A8FC], EAX 00F2252B 89D7 MOV EDI, EDX 00F2252D 46 INC ESI 00F2252E ^E2 DC LOOPD SHORT 00F2250C 00F22530 31DB XOR EBX, EBX 00F22532 0314B5 00A9F300 ADD EDX, DWORD PTR [ESI*4+F3A900] 00F22539 131CB5 04A9F300 ADC EBX, DWORD PTR [ESI*4+F3A904] 00F22540 8914B5 FCA8F300 MOV DWORD PTR [ESI*4+F3A8FC], EDX 00F22547 891CB5 00A9F300 MOV DWORD PTR [ESI*4+F3A900], EBX 00F2254E 890CB5 04A9F300 MOV DWORD PTR [ESI*4+F3A904], ECX 00F22555 FF05 94A9F300 INC DWORD PTR [F3A994] 00F2255B 8B3D 94A9F300 MOV EDI, DWORD PTR [F3A994] 00F22561 3B3D 90A9F300 CMP EDI, DWORD PTR [F3A990] 00F22567 ^0F82 3EFFFFFF JB 00F224AB 00F2256D 39D9 CMP ECX, EBX 00F2256F 72 1A JB SHORT 00F2258B 00F22571 8B0D 90A9F300 MOV ECX, DWORD PTR [F3A990] 00F22577 8D348D 78A6F300 LEA ESI, DWORD PTR [ECX*4+F3A678] 00F2257E 8D3C8D F8A8F300 LEA EDI, DWORD PTR [ECX*4+F3A8F8] 00F22585 FD STD 00F22586 F3:A7 REPE CMPS DWORD PTR ES:[EDI], DWORD PTR [ESI] 00F22588 FC CLD 00F22589 77 1A JA SHORT 00F225A5 00F2258B F8 CLC 00F2258C 8B0D 90A9F300 MOV ECX, DWORD PTR [F3A990] 00F22592 31F6 XOR ESI, ESI 00F22594 8B04B5 7CA6F300 MOV EAX, DWORD PTR [ESI*4+F3A67C] 00F2259B 1904B5 FCA8F300 SBB DWORD PTR [ESI*4+F3A8FC], EAX 00F225A2 46 INC ESI 00F225A3 ^E2 EF LOOPD SHORT 00F22594 00F225A5 8B0D 90A9F300 MOV ECX, DWORD PTR [F3A990] 00F225AB 8D35 FCA8F300 LEA ESI, DWORD PTR [F3A8FC] 00F225B1 8D3D FCA6F300 LEA EDI, DWORD PTR [F3A6FC] 00F225B7 F3:A5 REP MOVS DWORD PTR ES:[EDI], DWORD PTR [ESI] 00F225B9 5B POP EBX 00F225BA C3 RETN 00F225BB 5D POP EBP 00F225BC C2 1000 RETN 10 помогите понять алгоритм.. реализуем ли режим "Encrypt"? (если реализуем, то "как это сделать"?) Thanks in advance!
DMD перепишите алгоритм на высокоуровневом языке (типа C или паскаль), а там посмотрим что с ним можно сделать..
А вообще мы в 21м веке уже. Есть hexrays чтобы такие процедуры в С переводить за 5 сек прежде чем ими форумы засорять.
Code (Text): 00F2249A 8B0D 90A9F300 MOV ECX, DWORD PTR [F3A990] 00F224A0 41 INC ECX 00F224A1 F3:AB REP STOS DWORD PTR ES:[EDI] какой-то Pascal наверно. P.S. не Pascal, но всё-таки компилятор какой-то.
t00x Я у "нормальных" компиляторов не встречал таких манипуляций флажками, да еще инструкция loop используется. ИМХО все-таки написано на ассемблере. А если учесть тематику... Еще меня смущают две последние инструкции второй процедуры после retn.
а Code (Text): 00F2258B F8 CLC ? P.S. "вторая процедура" - конец первого блока кода ; P.P.S. Code (Text): 00F22588 FC CLD 00F22589 77 1A JA SHORT 00F225A5 00F2258B F8 CLC 00F2258C 8B0D 90A9F300 MOV ECX, DWORD PTR [F3A990] 00F22592 31F6 XOR ESI, ESI 00F22594 8B04B5 7CA6F300 MOV EAX, DWORD PTR [ESI*4+F3A67C] 00F2259B 1904B5 FCA8F300 SBB DWORD PTR [ESI*4+F3A8FC], EAX 00F225A2 46 INC ESI 00F225A3 ^E2 EF LOOPD SHORT 00F22594 длииное вычитание?
t00x Видимо я такой же внимательный как аффтар: Обычное, флажок C очищен. ЗЫЫЫ Сдается мне (после чтения по диагонали"), что во второй процедуре используется обычное умножение больших чисел в столбик.
Code (Text): 00F22492 31C0 XOR EAX, EAX 00F22494 8D3D FCA8F300 LEA EDI, DWORD PTR [F3A8FC] 00F2249A 8B0D 90A9F300 MOV ECX, DWORD PTR [F3A990] 00F224A0 41 INC ECX 00F224A1 F3:AB REP STOS DWORD PTR ES:[EDI] заполнение нулями... Code (Text): 00F224A3 8905 94A9F300 MOV DWORD PTR [F3A994], EAX 00F224A9 89C7 MOV EDI, EAX а может и ассемблер
crypto я тоже сначала думал, что это "лишние" команды.. ан-нет, не "лишние"... Code (Text): 00F2248C E9 2A010000 JMP 00F225BB . . 00F225B9 5B POP EBX 00F225BA C3 RETN 00F225BB 5D POP EBP 00F225BC C2 1000 RETN 10 "лучи" смогу опробовать, но это будет позднее вечером.. (если получится) основной проблемой, мне кажется, будет то, что код выполняется в виртуальной памяти, но есть Bin как дамп этой виртуальной секции с кодом. если в этом есть необходимость - hххp://ifolder.ru/5810862 (204К)
DMD Разобрались уже. Есть очень серьезные сомнения Точно, писано на ассемблере, потом встроено в код высокого уровня. ИМХО подобная конструкция написана руками, а не создана компилятором: Code (Text): 00F222B5 74 12 JE SHORT 00F222C9 00F222B7 D1E3 SHL EBX, 1 00F222B9 72 0E JB SHORT 00F222C9 00F222BB D1E1 SHL ECX, 1 00F222BD 85D8 TEST EAX, EBX 00F222BF ^74 F6 JE SHORT 00F222B7 00F222C1 01C8 ADD EAX, ECX 00F222C3 01DA ADD EDX, EBX 00F222C5 D1E3 SHL EBX, 1 00F222C7 ^73 F2 JNB SHORT 00F222BB
DMD Разбирайтесь во второй процедуре - она "ключевая". В ней похоже арифметические операции над большими числами: обнуление, умножение, вычитание, сравнение. По-крайней мере первый цикл можно коротко записать так: Code (Text): DWORD number_F3A8FC[var_F3A990 + 1]; memset(var_F3A8FC, 0, (var_F3A990 + 1)*sizeof(DWORD)); var_F3A994 = 0; number_F3A8FC = number_F3A6FC * A[0]; A[0] - первый DWORD массива A (arg_0 процедуры) Дальше реверсировать лениво...
crypto да, сомнения были, но развеялись. Ruptor согласен! банально в тот момент под рукой инструмента не было.. RElf Code (Text): /* Detected compiler: Unknown */ #include <defs.h> //------------------------------------------------------------------------- // Data declarations //------------------------------------------------------------------------- // Function declarations int __cdecl sub_12258(const void *a1, const void *a2, const void *a3, void *a4); _DWORD sub_12491(); // weak //----- (00012258) -------------------------------------------------------- int __cdecl sub_12258(const void *a1, const void *a2, const void *a3, void *a4) { int v4; // eax@1 signed int v5; // edx@1 int v6; // ecx@1 signed int v7; // ebx@1 char v8; // zf@5 int result; // eax@5 int v10; // ecx@5 int v11; // edi@5 unsigned __int16 v12; // dx@11 int v13; // ebx@23 __int16 v14; // dx@24 unsigned __int8 v15; // cf@2 unsigned __int8 v16; // cf@4 unsigned __int8 v17; // cf@21 char v18; // cf@22 memcpy((void *)0xF3A6FC, a1, 0x80u); memcpy((void *)0xF3A67C, a2, 0x80u); memcpy((void *)0xF3A77C, a3, 0x80u); memcpy((void *)0xF3A7FC, (const void *)0xF3A6FC, 0x80u); vf3a990 = 32; v6 = vf3a67c; v7 = 1; v5 = 1; v4 = vf3a67c + 1; if ( vf3a67c != -1 ) { while ( 1 ) { v15 = __MKCSHL__(v7, 1); v7 *= 2; if ( v15 ) break; while ( 1 ) { v6 *= 2; if ( !(v4 & v7) ) break; v4 += v6; v5 += v7; v16 = __MKCSHL__(v7, 1); v7 *= 2; if ( v16 ) goto LABEL_5; } } } LABEL_5: vf3a678 = v5; result = 0; v10 = 4 * vf3a990; v11 = 4 * vf3a990 + 15968123; v8 = 4 * vf3a990 == -15968123; do { if ( !v10 ) break; v8 = *MK_FP(__ES__, v11++) == 0; --v10; } while ( v8 ); if ( v8 ) { memset((void *)0xF3A6FC, 0, 4 * vf3a990); } else { v12 = 256; do v12 >>= 1; while ( !((_BYTE)v12 & *(_BYTE *)(v10 + 15968124)) ); if ( (_BYTE)v12 == 1 ) { if ( !v10 ) goto LABEL_31; --v10; v12 = 256; } vf3a98c = v10; vf3a998 = v12 >> 1; sub_12491(); if ( !(vf3a998 & *(_BYTE *)(vf3a98c + 15968124)) ) memcpy((void *)0xF3A87C, (const void *)0xF3A6FC, 4 * vf3a990); result = sub_12491(); if ( vf3a998 & *(_BYTE *)(vf3a98c + 15968124) ) { memcpy((void *)0xF3A87C, (const void *)0xF3A6FC, 4 * vf3a990); } else { memcpy((void *)0xF3A8FC, (const void *)0xF3A6FC, 4 * vf3a990); memcpy((void *)0xF3A6FC, (const void *)0xF3A87C, 4 * vf3a990); memcpy((void *)0xF3A87C, (const void *)0xF3A8FC, 4 * vf3a990); } while ( 1 ) { v17 = __MKCSHR__(vf3a998, 1); vf3a998 >>= 1; if ( v17 ) { vf3a998 = 128; v18 = vf3a98c-- < 1u; if ( v18 ) break; } result = sub_12491(); v13 = vf3a98c; if ( vf3a998 & *(_BYTE *)(vf3a98c + 15968124) ) { v14 = vf3a998 >> 1; if ( __MKCSHR__(vf3a998, 1) ) { LOWORD(v13) = (unsigned __int16)vf3a98c - (__MKCSHR__(vf3a998, 1) + v14); if ( (unsigned __int16)vf3a98c < (unsigned __int16)(__MKCSHR__(vf3a998, 1) + v14) ) { result = sub_12491(); break; } v14 = 128; } vf3a998 = v14; vf3a98c = v13; if ( (_BYTE)v14 & *(_BYTE *)(v13 + 15968124) ) { sub_12491(); result = sub_12491(); } else { sub_12491(); result = sub_12491(); } } } } LABEL_31: memcpy(a4, (const void *)0xF3A6FC, 4 * vf3a990); return result; } и Code (Text): /* Detected compiler: Unknown */ #include <defs.h> //------------------------------------------------------------------------- // Data declarations //------------------------------------------------------------------------- // Function declarations int __cdecl sub_12258(const void *a1, const void *a2, const void *a3, void *a4); int __cdecl sub_12491(); //----- (00012491) -------------------------------------------------------- int __cdecl sub_12491() { int v0; // edi@1 int v1; // ecx@2 unsigned int v2; // ebx@2 int v3; // edi@2 int v4; // esi@2 int v5; // edx@3 int v6; // ecx@4 int v7; // ebx@4 int v8; // edi@4 int v9; // esi@4 __int64 v10; // qax@5 int v11; // ebx@6 char v12; // cf@7 unsigned __int8 v13; // zf@7 int v14; // ecx@8 unsigned int v15; // edi@8 int v16; // esi@8 unsigned __int8 v17; // cf@13 int v18; // ecx@13 int v19; // esi@13 __int64 v20; // qax@3 unsigned __int8 v21; // cf@3 unsigned __int8 v22; // cf@4 int v23; // ett@14 int v24; // et0@14 int v25; // [sp+0h] [bp-4h]@2 memset((void *)0xF3A8FC, 0, 4 * (vf3a990 + 1)); vf3a994 = 0; v0 = 0; do { v1 = vf3a990; v4 = 0; v2 = *(_DWORD *)(v25 + 4 * v0); v3 = 0; v25 = v25; do { v20 = v3 + v2 * *(_DWORD *)(4 * v4 + 0xF3A6FC); v21 = __MKCADD__(v20, *(_DWORD *)(4 * v4 + 0xF3A8FC)); *(_DWORD *)(4 * v4 + 0xF3A8FC) += v20; v5 = v21 + *((_DWORD *)&v20 + 1); ++v4; v3 = v5; --v1; } while ( v1 ); v22 = __MKCADD__(v5, *(_DWORD *)(4 * v4 + 0xF3A8FC)); *(_DWORD *)(4 * v4 + 0xF3A8FC) += v5; *(_DWORD *)(4 * v4 + 0xF3A900) += v22; v9 = 0; v7 = vf3a8fc * vf3a678; v8 = (vf3a67c * (unsigned __int64)(unsigned int)(vf3a8fc * vf3a678) >> 32) + __MKCADD__(vf3a8fc, vf3a67c * vf3a8fc * vf3a678); v6 = vf3a990 - 1; do { v10 = *(_DWORD *)(4 * v9 + 0xF3A900) + v8 + (unsigned int)v7 * *(_DWORD *)(4 * v9 + 0xF3A680); *(_DWORD *)(4 * v9 + 0xF3A8FC) = v10; v8 = *((_DWORD *)&v10 + 1); ++v9; --v6; } while ( v6 ); v11 = *(_DWORD *)(4 * v9 + 0xF3A904) + __MKCADD__(*(_DWORD *)(4 * v9 + 0xF3A900), *((_DWORD *)&v10 + 1)); *(_DWORD *)(4 * v9 + 0xF3A8FC) = *(_DWORD *)(4 * v9 + 0xF3A900) + *((_DWORD *)&v10 + 1); *(_DWORD *)(4 * v9 + 0xF3A900) = v11; *(_DWORD *)(4 * v9 + 0xF3A904) = v6; ++vf3a994; v0 = vf3a994; } while ( vf3a994 < vf3a990 ); v12 = v6 < (unsigned int)v11; v13 = v6 == v11; if ( v6 < (unsigned int)v11 ) goto LABEL_19; v14 = vf3a990; v16 = 4 * vf3a990 + 15967864; v15 = 4 * vf3a990 + 15968504; do { if ( !v14 ) break; v12 = *(_DWORD *)v16 < *MK_FP(__ES__, v15); v13 = *(_DWORD *)v16 == *MK_FP(__ES__, v15); v16 += 4; v15 += 4; --v14; } while ( v13 ); if ( v12 | v13 ) { LABEL_19: v18 = vf3a990; v19 = 0; v17 = 0; do { *(_DWORD *)&v10 = *(_DWORD *)(4 * v19 + 0xF3A67C); v23 = v17 + (_DWORD)v10; v17 = *(_DWORD *)(4 * v19 + 0xF3A8FC) < (unsigned int)v17 + (_DWORD)v10; v24 = *(_DWORD *)(4 * v19 + 0xF3A8FC) - v23; *(_DWORD *)(4 * v19++ + 0xF3A8FC) = v24; --v18; } while ( v18 ); } memcpy((void *)0xF3A6FC, (const void *)0xF3A8FC, 4 * vf3a990); return v10; }
DMD И что, понятнее стало? )) Попробуй еще rec запустить, думается тот же результат получишь. По мне так руками проще из ассемблерного текста алгоритм выковыривать, чем из полученного "листинга".
мне - нет, не стало. Правда, о переводе писал RElf , но это не столь важно и мне асм "ближе"... буду пробовать, но от помощи не отказываюсь! )))