- [Digital Virus Labs #11] - [Page 25] - Методы подсчета CheckSum в PE-файлах (c) by ULTRAS/MATRiX В некоторых PE файлах надо подсчитывать контрольную сумму файла, а то они не будет работать. Я решил расмотреть несколько методов подсчета контрольной суммы в PE`шных файлах. start: ~~~~~~ Смещение контрольной суммы в PEшниках, по моему, PE+58h. Итак начнем... Ниже описан самый популярный метод среди вирусмакеров "Подсчет контрольной суммы с помощью CheckSumMappedFile". ; где находиться Checksum add ebx, 58h ; EBX=PE checksum in map cmp dword ptr [ebx], 0 ; checksummed файл? je suxx ; если нет - нахрен ; так загрузим imagehlp.dll ; вопрос зачем загружать imagehlp.dll потому что в 95 ее нету... call imagehlp db 'IMAGEHLP.DLL',00h imagehlp: call dword ptr [ebp+_LoadLibraryA] ; загружаем or eax, eax jz suxx push ebx ; сохраняемый указатель на старый CRC call checksumapfile db 'CheckSumMappedFile',00h checksumapfile: push eax call dword ptr [ebp+_GetProcAddress] pop ebx ; восстановим указатель на старый CRC JC suxx push ebx ; старый указатель CRC lea ebx, [ebp+damn_dword] push ebx ; место сохранить старый CRC push dword ptr [ebp+filesize] ; размер файла push dword ptr [ebp+mapbase] ; mapbase call eax ; call CheckSumMappedFile damn_dword dd ? Метод2. Этот метод более популярен у программистов, которые пишут разные тулзы для PEшников... Выдрано из программы "Modify PE". ; calc_checksum procedure 14.05.99 ; v1.0 ; -> eax = lpMapAddress ; ebx = FileLength in Bytes ; <- eax = Checksum ; ; JOB: Вычисление контрольной суммы ; USED: eax,ebx,ecx,edx ; NOTE: Checksumfield in PE-Header must be set ; to zero before calling calc_checksum calc_checksum: push esi xor edx, edx mov esi, eax mov ecx, ebx shr ecx, 1 ;Конвертируем буйты в ворды .next_word: movzx eax, word [esi] add edx, eax mov eax, edx and edx, 0FFFFh shr eax, 10h add edx, eax inc esi inc esi loop .next_word mov eax, edx shr eax, 10h add ax, dx add eax, ebx ;добавим размер файла pop esi ret Метод3. Еще один очень метод подсчета контрольной суммы с помощью MapFileAndCheckSum. ... DWORD H=0; // тут будет контрольная сумма, хранящаяся в заголовке DLL DWORD F=0; // а тут настоящая MapFileAndCheckSum("полное имя файла",&H,&F); ... Если возникнут вопросы, пишите мне : ultras@matrixvx.org ultras_@hotmail.com ULTRAS [MATRiX]