Вообщем народ у кого есть поделитесь или помогите. Нужен макрос для масм32 чтобы делал так: .code $PUSHSTRING kernel32.dll Вставляет следующие push 'l' push 'ld.2' push '3lle' push 'nrek' push esp Вот мои наброски но застрял выдает Код (Text): $PUSHSTRING macro sStr:REQ crep = @SizeStr(sStr)/4 %echo Count: @CatStr(%crep) count = 0 rept crep %echo Index: @CatStr(%count) ,data: @SubStr(sStr,1+(%count*4),4) push @SubStr(sStr,1+(%count*4),4) count = count + 1 endm push esp endm C:\Documents and Settings\root\Desktop\Debug\Asm\my_shellcode.asm(50) : error A2006: undefined symbol : kern MacroLoop(2): iteration 1: Macro Called From $PUSHSTR(8): Macro Called From C:\Documents and Settings\root\Desktop\Debug\Asm\my_shellcode.asm(50): Main Line Code C:\Documents and Settings\root\Desktop\Debug\Asm\my_shellcode.asm(50) : error A2006: undefined symbol : el32 MacroLoop(2): iteration 2: Macro Called From $PUSHSTR(8): Macro Called From C:\Documents and Settings\root\Desktop\Debug\Asm\my_shellcode.asm(50): Main Line Code C:\Documents and Settings\root\Desktop\Debug\Asm\my_shellcode.asm(50) : error A2006: undefined symbol : dll MacroLoop(2): iteration 3: Macro Called From $PUSHSTR(8): Macro Called From C:\Documents and Settings\root\Desktop\Debug\Asm\my_shellcode.asm(50): Main Line Code
19841204, вот работающий пример: Код (Text): PUSHSTRING macro sStr:REQ acrep = @SizeStr(sStr) crep = acrep/4 count = crep - 1 push 0 rept crep db 68h ; push db STRINGA (@SubStr(sStr,(acrep-3),1)) db STRINGA (@SubStr(sStr,(acrep-2),1)) db STRINGA (@SubStr(sStr,(acrep-1),1)) db STRINGA (@SubStr(sStr,(acrep),1)) count = count - 1 acrep=acrep-4 endm push esp endm найдите два различия . макрос не будет работать, если длина строки не кратна 4, допиливайте сами.
Обычно нужно передавать указатели на строки а не сами строки Так что: Код (Text): push_line MACRO String:VARARG call @F db String @@: ENDM
s_d_f Это же очевидно - автор собирает пермутирующий код. В этом коде конструкции типа: Код (Text): call @F db String @@: не используются. Микод не содержит данных, они генерируются динамически.
Ну и пусть пермутирующий. А чего здесь принципиально неприемлимого? Разница между этим push 'l' push 'ld.2' push '3lle' push 'nrek' push esp и этим call @F db 'kernel32.dll',0 @@: не большая. Если говорить о динамически генерируемых данных строку после call @F ничто мешает чем-нибудь перезаписать, или в случае необходимости целиком в стэк скопировать.
s_d_f Разница огромна. Во первых после морфинга за инструкцией Call @f не будет строки(граф перестраивается, инструкции изменяются). Во вторых данные будут рассмотрены как код и строка отморфлена. В третих строки в виде хардкода являются голой сигнатурой.
Все спасибо марос помог вот выкладиваю окончательный вариант, кратность учитывается. Код (Text): $PUST_STR macro sStr:REQ crep = @SizeStr(sStr) %if @SizeStr(sStr) mod 4 len = @SizeStr(sStr)/4 + 1 crep = crep + (4 - @SizeStr(sStr) mod 4) else len = @SizeStr(sStr)/4 push 0 endif ;%echo Len: @CatStr(%len) rept len db 68h ;%echo push off = 3 rept 4 ;%echo Offset @CatStr(%off),crep: @CatStr(%crep),index: @CatStr(%(crep-off)) %if (crep-off) gt @SizeStr(sStr) ;%echo db 0 db 0 else ;%echo db @SubStr(sStr,%(crep-off),1) db STRINGA (@SubStr(sStr,%(crep-off),1)) endif off = off - 1 endm crep = crep - 4 endm push esp endm Usage: $PUST_STR kernel32.dll $PUST_STR ws2_32.dll
Да кстате советую посмотреть статью зомби у него строки красивей заносятся. http://vx.netlux.org/lib/vzo18.html