есть такая прога: var m:array[byte] of char; procedure Hash(P:pointer;Size:cardinal); var p1:^byte; begin p1:=p; For Size:=Size Downto 1 do begin p1^:=p1^ xor 77 inc(p1) end; end; function my(a,b:cardinal):cardinal; var t:cardinal; begin t:=a+b; result:=t; end; begin hash(@m,Sizeof(m));(*здесь все норм*) Hash(@my,3);{хочу зашифровать 3 байта процедуры,но здесь будет ошибка} end; теперь вопрос как можна зашифровать процедуру??? а как мона узнать ее размер(тоесть скоко она занимает байт в программе)?
Код (Text): Procedure Func_To_Crypt_Start; begin end; Procedure Function_To_Crypt; begin ShowMessage('123'); end; Procedure Func_To_Crypt_End; begin end; Procedure Crypt(p:Pointer; size:DWORD); var i : Integer; begin for i := DWORD(p) to DWORD(p) + Size do begin PBYTE(i)^ := PBYTE(i)^ xor $25; end; end; procedure TForm1.Button1Click(Sender: TObject); begin Crypt(@Function_To_Crypt, DWORD(@Func_To_Crypt_End) - DWORD(@Func_To_Crypt_Start)); end; Чтото в этом роде... Не забывай только добавить права на запись по адресу "@Function_To_Crypt"
или как можна настроить стек, чтоб когда я туда помещаю свои дание они помещались по адресу моей процедури???
XshStasX Вообще это Вам не асм, чтобы "шифровать процедуры". Вы бы ещё процедуры на JAVA шифровали. В общем случае никак. Неизвестно, что компилятор с ней навытворяет. Разумеется ошибка. По умолчанию в секцию кода нет доступа на запись.
XshStasX уу, вам сначала нужно азы изучить а потом уже что то кодить. Секция кода в делфи не доступна на запись. Используйте VirtualProtect или руками разрешайте запись через PETools например. Узнать размер просто Код (Text): var p1:^byte; begin p1:=p; For Size:=Size Downto 1 do begin p1^:=p1^ xor 77 inc(p1) end; end; function my(a,b:cardinal):cardinal; var t:cardinal; begin t:=a+b; result:=t; end; procedure my_end; begin end; begin Hash(@my,DWORD(@my_end)-DWORD(@my)); end;
PE_Kill Откуда стопроцентная уверенность, что компилятор процедуру не покромсает и не раскидает кусками по коду? В общем случае сам вызов может находиться между метками my и my_end.
l_inc странный вопрос. Подебажте пару лет делфи проги и сам поймете. Это вам не оптимизация Си, кде код может быть похож на нехилый конверт. Ну отъявленые параноики могут отключить оптимизацию для этих 2х процедур.
а надо ее шифровать? Если она будет на том же месте расшифровываться, то ценность шифровки пропадет. Не проще накидать пару сотен мелких процов/функов (все равно делфя не элиминирует) и нужную вызывать по вычисляемой ссылке или автомат с расчетами следующей точки на основе пароля и затраченных тактов на предыдущую.
да надо...процедура потом зашифруется в нех редакторе....а мне надо узнать каким образом ее моан разшифровать/шифровать
ну ладненько всем спс за ответи...я вроде так разобрался в чем дело))...дальше сам буду думать как и что по єтому поводу...так что тему можна закрить....
XshStasX Когда брякнется по паролю, она будет уже расшифрована. Адрес точки станет точно известен и вы низачто не сможете както функу свою в дальнейшем морфировать, тк у вас жесткий лимит по месту. Потом можно вычислить ваш пароль или пропатчить и сдампить на диск или найти ващ декриптор или.. Спрашивается, зачем мучиться? Если все равно и надо хоть чтото для виду, то просто поксорьте строки.