R0 CREW

Интересные куски кода (короткие) + много общения

ru
#1

⁠Тема с чистыми листингами кода тут.

Эта тема исключительно для обсуждения кода из выше указанной темы.

Предлагаю делиться интересными кусками кода. Очень желательно короткими.

// Прототип
void function(void* pointer);

// Вызов функции
function(
      	     (       // Используем оператор запятая, для установки данных по указателю
                     *(int *)((char *)(pointer) + sizeof(int)) = (int)(1),
                     *(int *)((char *)(pointer)) = (int)(2),
		
                     // Передаем указатель функции
                     pointer
      	     )
);
#2

Ох ё!..

2 Darwin а как такое читается то в принципе?

#3
format PE GUI 4.0
use32
include 'win32ax.inc'

.code

program:
     ;call DetachDebugger
     invoke MessageBoxA,0,'Okay. Try to debug me now!','',0
     invoke ExitProcess,0
	 ; push 747565          
	 ; call ExitProcess      

proc DetachDebugger
     xor eax,eax
     mov edx,[fs:eax+0x30] ; TEB.Peb
     mov ecx,[edx+0x0c]    ; PEB.Ldr
     jecxz .win9x
     mov eax,[edx+0xa4]    ; PEB.OSMajorVersion
     shl eax,2
     add eax,[edx+0xa8]    ; PEB.OSMinorVersion
     call @f
@@:  pop edx
     add edx,.nt_syscall_table-@b
     movzx eax,word[edx+(eax-16)*2]
     xor ecx,ecx
     push ecx
     push ecx
     push 17
     push -2
     call @f
@@:  add dword [esp],@f-@b
     lea edx,[esp+4]
     int 0x2e
@@:  add esp,20
     ret
.nt_syscall_table:
     dw 0x00a5,\
	0,\
	0,\
	0,\
	0x00c7,\
	0x00e5,\
	0x00ee,\
	0,\
	0x0133,\
	0x014f,\
	0,\
	0,\
	0,\
	0,\
	0,\
	0,\
	0
.win9x:
     ret
endp

proc callback,handle,reason,reserved
     cmp [reason],DLL_PROCESS_ATTACH
     jnz @f
     call DetachDebugger
@@:  ret
endp

.data

tls_index dd 0

tls_callbacks:
     dd callback
     dd 0

data 9		      ; TLS Directory
     dd 0	      ; StartAddressOfRawData
     dd 0	      ; EndAddressOfRawData
     dd tls_index     ; AddressOfIndex
     dd tls_callbacks ; AddressOfCallBacks
     dd 0	      ; SizeOfZeroFill
     dd 0	      ; Characteristics
end data

.end program

Писал скорее всего не я (так как даже не понял с первого взгляда что это).
Антиотладочный трюк. Синтаксис fasm.
А вообще, если кому нужно, я могу выложить пару сотен подобных сниппетов. У меня много, бОльшая часть на ассемблере (fasm). Только не могу вспомнить куда я их скинул.

#4

Да кучу таких Сишных хаков уже описаны Крисом, да и за такой код могут руки поотрывать

#5

Я сам не сразу понял, пока не посмотрел на прототип функции ))

Чтобы было понятно, вот упрощенная конструкция:

// здесь "a" будет присвоено "d"
a = (b, c, d)

// конструкция a = (b, c, d) раскрывается так
(((a = b) = c) = d)

Не все Криса читают (по крайней мере полностью). Я, например, его сишных хаков не видел.

Всё зависит от места применения.

#6

код рассчитан на понимающего человека, а не на новичка, так что без обид)
З.Ы: такие вот подобные вкусности видел в книге Страуструпа (специздание),там поясняется что и как такие вот конструкции делают.

#7

Dark Koder любой маломальски повидавший реальные проекты программист с\с++ не станет лишний раз гадить в код коллегам “тюнингованными фитчами”, которые трудно читаемы и не оправданы, без обид. Или вы можете обосновать применимость данной конструкции в контексте примера из первого поста?

#8

Без обид, но сразу становится понятно, что ты никогда не занимался фрилансом. По крайней мере в этой сфере деятельности - чем не понятнее и индусее код, тем выше шансы, что работодатель вам как минимум заплатит))
UDP. Ну и за поддержку нехило выложится (-:

#9

Никаких обид на необоснованную критику не держу

Извините, но это действительно смешно) Вот когда поработаете с группой разработчиков, тогда и говорите про уместность таких хаков. Если вам приходилось писать говнокод только для того чтобы вам заплатили за проект, то я вам могу только посочувствовать и это не показатель. Программист умеющий писать легкий и простой код, вот это показатель.

#10

Эм… ну почему же говнокод? В команде системных разработчиков я никогда не работал, да и не писал десктопных программ на коммерческой основе.
А вот веб разработкой занимался. Причём в команде. Писали проект, потом его обфусцировали, ничего постыдного в этом я не вижу и тем более смешного, разумнее делать проект и хранить исходный код только у его авторов, иначе “авторов” станет больше (-:
В подобных случаях, я бы офусцировал и исходный код десктопного приложения, который отдаю заказчику, но к счастью или сожалению, распутать можно любую обфускацию, а использование вот таких вот хаков, как раз таки и портит жизнь не чистым на руку людям.

Offtop

Случай из жизни. Лето 2012.
Писал онлайн магазин чайной продукции, три или четыре раза проходил дедлайн, потому что заказчик вечно менял тех. задание, потом на меня ещё вёрстку повесили. Я подпряг друга, который всё сверстал за ночь. В итоге, на контрольном делайне, заказчик пообещал, что если его руководству всё выйдет по нраву, то я займусь дальнейшей доработкой этого сайта и разработкой ещё какого-то. Мы договорились, что платит он мне 40% сейчас, а когда начальство даст добро - всё остальное. Ну я, естественно лох, согласился.
В итоге деньги отдал знакомому, который верстал шаблон, а сам остался без ничего. Заказчик пропал. Потом сайт дорабатывался БЕЗ меня.
Вот такие сейчас пошли менеджеры…

#11

Обоснование: Необходимо автоматически создавать структуры с произвольным набором элементов. Это код из обфускатора.

Как я уже сказал, всему своё место. Некоторые проекты могут требовать вообще мазохистских хаков, например, реализовать поддержку классов на чистом Си.

#12

Вот если что статьи от Криса про трюки с С, всякие триграфы и пр. извращения включены
http://forum.insidepro.com/viewtopic.php?t=764

Чёт не пойму я вас, отдаёте исходник заказчику, зачем его обфусцировать? Да и вообще какой смысл это делать с исходником на С\С++?

#13

А про классы это не мазахизм, такие техники помоему еще в 90х применяли в GTK, а может и шас применяют, причем как говорят прогеры того времене достаточно удачно. Хотите изврат откройте MFC, хоть там и С++

Но по поводу автоматического создания структур я не вкурил всёравно в чём выгода, если у вас есть живой код, то буду благодарен если зальёте

#14

Живой код есть, но более детальная информация является коммерческой тайной, так что сорри.

Обфусцируется не сам исходник C\C++, а то что будет компилиться, можно считать это объектником (более подробная информация, снова относится к ком. тайне).

Offtop

К админам: со временем тему желательно подчищать от оффтопа

#15

Darwin что секретного в обфускации обьектников? В природе есть и крипторы и упаковщики обьектников в одном пакете с линкером.

#16

Правила, принятые моим работодателем, запрещают разглашение любой информации связанной с проектами. А так ничего особо секретного нет.

#17

Лучше подскажите как оптимальней на С сделать обмен значениями между двух переменных?
Ну типа то что на асме xchg eax,ebx.

#18

Студия к примеру обычно такой код оптимизирует сама в контексте вызова :

void swap(int *a, int *b)
{
	int c = *a;
	*a = *b;
	*b = c;
}

причём очень не плохо, хотя всё зависит от ситуации. Для полной уверенности пометить как inline

PS тестанул, компильнуло вообще отличненько, например в такой ситуации :

...
printf("%d %d\n", a, b);
swap(&a, &b);
printf("%d %d\n", a, b);
...

компиль понял что ему подсунули и в листинге это выглядело примерно так :

...
push b
push a
push format
call printf
push a
push b
push format
call printf

Так что в некоторых ситуациях оптимизатор срабатывает лучше чем самая едрёная асм вставка, что и так давно доказано.

#19

http://www.azillionmonkeys.com/qed/case3.html

Там где нужна такая оптимизации надо на асме все писать, не в начале 90-х же живем…

#20
Offtop

Модераторам:
Переименуйте тему во что-нибудь другое, так как изначальный смыл темы утерян.