лучше чем на wasm не ответят =) https://yandex.ru/yandsearch?&text=seh+site:wasm.ru там целый цикл статей
Доброго времени, подскажите, чем сейчас можно побороть vmprotect, я имею в виду чем можно очистить exe от обработки протектором.
К сожаленью не нашел. Не дадите ссылку? ADD: И кстати, речь идет о скрипте под актуальную версию vmprotect?
чем извлечь ASProtect 2.1x SKE -> Alexey Solodovnikov мб есть какой то мануал на русском? на титсах все на энглише
Привет всем. Искал, где написать-так конкретно и не нашел.Решил здесь спросить. Вопрос по драйверу (USB 1.1, для МК stm32 , изохронный канал OUT,для собственного проекта).Так вот,создан поток для обработки очереди на вывод. Метод DIRECT. При попытке блокировки с MmProbeAndLockPages выдает STATUS_ACCESS_VIOLATION,без нее работает нормально. Как заблокировать юзермодный буфер ? Код потока обработки: Code: #pragma LOCKEDCODE //вывод пакета упакованных буферов в формате [ULONG size][ULONG packetsize] //userEvent-присутствует ли событие user-приложения для оповещения окончанием вывода. NTSTATUS StartBuffersDSS(PDEVICE_OBJECT fdo, PIRP Irp,BOOLEAN userEvent) { PDEVICE_EXTENSION pdx=(PDEVICE_EXTENSION)fdo->DeviceExtension; PIO_STACK_LOCATION stack; PIRP subirp=NULL,oldirp=NULL; ULONG* MarkBuffer=NULL; ULONG marklen=0; PVOID DSSBuffer=NULL; ULONG length=0; NTSTATUS status=STATUS_SUCCESS; PKEVENT PuEvent=NULL; LONG ISOIrpsCnt=pdx->ISOIrpsCnt>0?InterlockedDecrement(&pdx->ISOIrpsCnt):0; stack=IoGetCurrentIrpStackLocation(Irp); //---------LOCK PAGES------->>> __try { if(Irp->MdlAddress)MmProbeAndLockPages(Irp->MdlAddress,Irp->RequestorMode,IoReadAccess); } __except ( EXCEPTION_EXECUTE_HANDLER ) { ULONG code=GetExceptionCode(); #ifdef DBGERRORS DbgPrint("StartBuffersDSS: !!! MmProbeAndLockPages EXCEPTION=0x%X",code); #endif status=code; pdx->ProcessedIsoOutIrp=NULL; //if(Irp->MdlAddress)MmUnlockPages(Irp->MdlAddress); if(Irp)CompleteRequest3(Irp,status,0) ;//CANCEL if(PuEvent)UserNotification(PuEvent); return status; } //---------LOCK PAGES-------<<< __try { MarkBuffer=(ULONG*)Irp->AssociatedIrp.SystemBuffer;//буфер,описывающий набор буферов(разметка) marklen=stack->Parameters.DeviceIoControl.InputBufferLength; DSSBuffer=MmGetMdlVirtualAddress(Irp->MdlAddress);//буфер вывода length=MmGetMdlByteCount(Irp->MdlAddress);//длина данных //USER EVENT? if(userEvent) { PuEvent=*(PKEVENT*)Irp->AssociatedIrp.SystemBuffer; #ifdef DBGERRORS if(!PuEvent)DbgPrint("!!! StartBuffersDSS: PuEvent==NULL "); #endif MarkBuffer++; marklen-=sizeof(PKEVENT); #ifdef DBG_DSS DbgPrint("StartBuffersDSS: PuEvent=0x%X , marklen=%u",(ULONG)PuEvent,marklen); #endif } } __except ( EXCEPTION_EXECUTE_HANDLER ) { ULONG code=GetExceptionCode(); #ifdef DBGERRORS DbgPrint("StartBuffersDSS: !!! EXCEPTION=0x%X",code); #endif status=code; goto er_complete_notify_ret_status; } if (length==0||marklen<2*sizeof(ULONG)) { #ifdef DBG_DSS DbgPrint("StartBuffersDSS: STATUS_BUFFER_TOO_SMALL : marking length=%u, DSS length=%u", stack->Parameters.DeviceIoControl.InputBufferLength,length); #endif status=STATUS_BUFFER_TOO_SMALL; goto er_complete_notify_ret_status; } //DEBUG /*if(PuEvent)UserNotification(PuEvent); pdx->ProcessedIsoOutIrp=NULL; return CompleteRequest3(Irp,STATUS_SUCCESS,0) ;*/ ULONG checklen=0;//проверка длины for(ULONG i=0;i<marklen/(2*sizeof(ULONG));i++) { checklen+=MarkBuffer[i*2];//размер блока #ifdef DBG_DSS DbgPrint("StartBuffersDSS: check buffer [%u] : block length=%u, packet(!&0xFFF)=%u , DSS length=%u ",i, MarkBuffer[i*2],MarkBuffer[i*2+1],length ); #endif } if (checklen>length)//не прошел проверку { #ifdef DBG_DSS DbgPrint("StartBuffersDSS: STATUS_INVALID_BUFFER_SIZE , checklen=%u , DSS length=%u ",checklen,length); #endif status=STATUS_INVALID_BUFFER_SIZE; goto er_complete_notify_ret_status; } //________________________ ULONG streamCntrLooping=pdx->ISOStreamLoops;//повторяем в цикле при отсутствии данных некоторое количество раз //освобождение пакета происходит при следующем поступлении или отмене пакета.иначе цикл вывода(поток) PVOID DSS_va=DSSBuffer; ULONG outputs=marklen/(2*sizeof(ULONG)); #ifdef DBG_DSS //DbgPrint("StartBuffersDSS STREAM LOOPS left=%u , (outputs total=%u)",STREAM_LOOPS-streamCntrLooping,outputs); #endif for(ULONG i=0;i<outputs;i++) { ULONG blocklen=MarkBuffer[i*2]; USHORT packsize=(USHORT)MarkBuffer[i*2+1]&0xFFF;//max 4095 if (packsize==0||packsize>START_ISOC_PACKETSIZE) { #ifdef DBG_DSS DbgPrint("StartBuffersDSS : buffer [%u] ERROR ,packet size=%u",i,packsize); #endif status=STATUS_INVALID_PARAMETER; goto er_complete_notify_ret_status; } #ifdef DBG_DSS KIRQL level=KeGetCurrentIrql(); DbgPrint("StartBuffersDSS : buffer [%u] -- address=0x%X , block length=%u ,packet size=%u ,IRQL=%u",i,(ULONG)DSS_va,blocklen,packsize,level); #endif //--------------IRP--------------- CCHAR nOfRequiredStackLocs = pdx->fdo->StackSize; USHORT irpSize = IoSizeOfIrp(nOfRequiredStackLocs); PIRP subirp = (PIRP) ExAllocatePool( NonPagedPool, irpSize ); if (!subirp) { #ifdef DBGERRORS DbgPrint("StartBuffersDSS -- ERROR !subirp"); #endif status=STATUS_INSUFFICIENT_RESOURCES; goto er_complete_notify_ret_status; } IoInitializeIrp(subirp, irpSize, nOfRequiredStackLocs); //-------------------------------- pdx->UsbInterface->Pipes[EP_ISOC_INDEX].MaximumPacketSize=pdx->IsocOutPacketSize=packsize; subirp->AssociatedIrp.SystemBuffer=DSS_va; //access to stack PIO_STACK_LOCATION substack=NULL; __try { substack=IoGetCurrentIrpStackLocation(subirp); substack->Parameters.DeviceIoControl.InputBufferLength=blocklen; } __except ( EXCEPTION_EXECUTE_HANDLER ) { ULONG code=GetExceptionCode(); #ifdef DBGERRORS DbgPrint("StartBuffersDSS: !!! substack->Parameters EXCEPTION=0x%X",code); #endif ExFreePool(subirp);subirp=NULL; status=code; goto er_complete_notify_ret_status; } #ifdef DBG_DSS //DbgPrint("* * * StartBuffersDSS : Irp=0x%X, pdx->processedIrp=0x%X",(ULONG)Irp,(ULONG)pdx->ProcessedIsoOutIrp); #endif if(Irp->Cancel) { #ifdef DBG_DSS DbgPrint("StartBuffersDSS -- CANCEL ---------------------------------------------->>"); #endif KeWaitForSingleObject(&pdx->IsoReadyEvent,Executive,KernelMode,FALSE,NULL); KeSetEvent(&pdx->IsoReadyEvent,IO_NO_INCREMENT,FALSE); #ifdef DBG_DSS DbgPrint("StartBuffersDSS -- FREE,COMPLETE,RETURN ....."); #endif ExFreePool(subirp);subirp=NULL; status=STATUS_CANCELLED; goto er_complete_notify_ret_status; } PMDL mdl = IoAllocateMdl((PVOID) DSS_va, blocklen, FALSE, FALSE, NULL); if (!mdl) { #ifdef DBG_DSS DbgPrint("StartBuffersDSS -- ERROR: !mdl"); #endif KeWaitForSingleObject(&pdx->IsoReadyEvent,Executive,KernelMode,FALSE,NULL); KeSetEvent(&pdx->IsoReadyEvent,IO_NO_INCREMENT,FALSE); IoFreeMdl(mdl);mdl=NULL; ExFreePool(subirp);subirp=NULL; status=STATUS_INTERNAL_ERROR; goto er_complete_notify_ret_status; } IoBuildPartialMdl(Irp->MdlAddress, mdl, (PVOID) DSS_va, blocklen); //MmBuildMdlForNonPagedPool(mdl);//переделываем для резидентной памяти для внутреннего использования subirp->MdlAddress = mdl; //------------передача------ //вывод без завершения. dss_last_out: //dbgStream=TRUE; dbgStreamViewEnd=TRUE; #ifdef DBG_DSS //DbgPrint("> > > StartBuffersDSS OUT : mdl=0x%X,subirp=0x%X , FREE FRAME=%u > > >",(ULONG)mdl,(ULONG)subirp,pdx->FirstFreeIsoOutFrame); DbgPrint("> > > StartBuffersDSS OUT : datalen=%u , packet=%u , FREE FRAME=%u > > >",blocklen,packsize,pdx->FirstFreeIsoOutFrame); #endif if(i==outputs-1 && streamCntrLooping==0)//последний вывод { status=StreamStartOut(pdx->fdo,subirp,FALSE,Irp,FALSE,PuEvent); PuEvent=NULL;//сразу обнулить,чтобы повторно не обращаться к несуществующему указателю } else { status=StreamStartOut(pdx->fdo,subirp,FALSE,Irp,FALSE); } dbgStreamViewEnd=FALSE; //dbgStream=FALSE; if(status==STATUS_CANCELLED) { #ifdef DBG_DSS DbgPrint("StartBuffersDSS --STATUS CANCELED ---------------------------------------------->>"); #endif KeWaitForSingleObject(&pdx->IsoReadyEvent,Executive,KernelMode,FALSE,NULL); KeSetEvent(&pdx->IsoReadyEvent,IO_NO_INCREMENT,FALSE); #ifdef DBG_DSS DbgPrint("StartBuffersDSS -- FREE,COMPLETE,RETURN ....."); #endif IoFreeMdl(mdl);mdl=NULL; ExFreePool(subirp);subirp=NULL; status=STATUS_CANCELLED;//CANCEL goto er_complete_notify_ret_status; } if(i==outputs-1 && streamCntrLooping>0) { streamCntrLooping--; ISOIrpsCnt=pdx->ISOIrpsCnt; if(ISOIrpsCnt==0&&streamCntrLooping>=0)goto dss_last_out; } //-------------------------- //незачем сохранять до окончанию,mdl создается для каждого субпакета IoFreeMdl(mdl);mdl=NULL; ExFreePool(subirp);subirp=NULL; DSS_va=(PVOID)((ULONG)DSS_va+blocklen);//offset=+prev.size } if(Irp!=NULL)CompleteRequest3(Irp,STATUS_SUCCESS,0); pdx->ProcessedIsoOutIrp=NULL; MmUnlockPages(Irp->MdlAddress); #ifdef DBG_DSS //DbgPrint("StartBuffersDSS --END LOOP OF STREAM. COMPLETE IRP (0x%X)---------->>",(ULONG)Irp); #endif return STATUS_SUCCESS; //ERROR er_complete_notify_ret_status: pdx->ProcessedIsoOutIrp=NULL; MmUnlockPages(Irp->MdlAddress); if(Irp)CompleteRequest3(Irp,status,0) ;//CANCEL if(PuEvent)UserNotification(PuEvent); return status; } Создание потока: InitializeObjectAttributes(&oattr, NULL, OBJ_KERNEL_HANDLE, NULL, NULL); status= PsCreateSystemThread(&pdx->QIsoOutThrd, (ACCESS_MASK) GENERIC_ALL|STANDARD_RIGHTS_ALL,//access mask &oattr,//attributes (HANDLE) 0L, &idQISOOUTThread, (PKSTART_ROUTINE)&QIsoOutThread , fdo); if (status!=STATUS_SUCCESS) { #ifdef DBGERRORS DbgPrint(" ERROR PsCreateSystemThread(&pdx->QIsoOutThrd)=0x%X",status); #endif return status; } Эта проблема с блокировкой уже достала,решения нигде не нашел.Что не так с доступом из другого потока? если не сложно ,на [email protected]
Привет! Ребята, могли бы помочь с раскодированием такого зверя: Spoiler http://rgho.st/private/7GLfnM94R/ca0ab8746cbb071dbd744200fc9d3386 Файлы закодированы судя по всему PHP Lock It Один (php) вызывает другой (php5), чтобы получить целый файл. Мне, к сожалению, в силу своих знаний не удалось общедоступными средствами это сделать UPDATE: Разобрали на нулледе, вопрос снят.
Не вызывает, а считывает, декодирует, и выполняет декодированное. Там ещё встроено декодирование с использованием хеша от файла, это заметно затрудняет манипуляции с кодом.
Что может быть лучше официальных мануалов? https://www.hex-rays.com/products/ida/debugger/index.shtml Так же, в интернете полно мануалов, инструкций и гайдов. И естественно самое главное - это практика.
Есть программа /закрытая winlincense/ которая работает с zip архивами .... zip пароль для работы с архивом зашит в программе ... как его вытащить от туда? идеи ?
Я взламываю Андроид-приложение, в котором есть самомодифицирующаяся двоичная библиотека. Я с таким еще не сталкивался и полагал, что под Андроид не бывает запаковщиков двоичного (не Ява) кода. Вопрос, конечно, сводится к тому, как распаковать библиотеку. К счастью, она полностью распаковывается при запуске - это я выяснил. Однако, вопрос в том, как на Адроиде сохранить дамп памяти, содержащей библиотеку. Библиотека в загруженном виде содержит 3 сегмента (код, данные и данные только для чтения). В принципе, их можно сохранить на диск через /proc/self/maps и /proc/self/mem Но как их собрать назад в so-файл, который бы "понимала" Ида, или который бы можно было запустить на Андроиде?
В линухе не силен, но думаю там аналогично с виндой, одного дампа либы в работающем виде не достаточно, для создания полноценного so. Нужно будет как минимум дампить с EP + восстанавливать импорт. По поводу запаковщиков двоичного кода, вероятно там какой-то банальный алгоритм сжатия/шифрования (а-ля zlib+xor), реализованные средствами java. Думаю вам нужно найти человека, реверсящего линуху или конкретно андроид, а пока - это битва экстрасенсов)
Ты абсолютно прав, коллега, распаковка частично завязана на Яву. После загрузки библиотеки Ява вызывает функцию распаковки через JNI. Однако, при дизассемблировании эта функция (распаковки) отсутствует. Могу предположить, что частичная распаковка происходит в секции .init_array или функции JNI_OnLoad, что эта частичная распаковка расшифровывает ту основную функцию распаковки, которую запуская Ява. Однако, обе функции (из секции инициализации и инициализация Явы) выглядят просто пустым заглушками. Поэтому есть еще другой вариант - что Ява как-то модифицирует библиотеку уже после установки, и что в APK содержится одна библиотека, а по факту запускается другая... интересно, система безопасности Андроида разрешает приложению себя модифицировать? Надо это проверить. Битву экстрасенсов прийдется выигрывать лично мне - так как позарез надо крякнуть их. Буду по чуть-чуть выкладывать инфу, если найдутся желающие подсказать, то велкам. По реверсингу Линукса (в отличие от Винды) инфы не густо - и логично, ведь это опенсорс, его ломать-то не нужно, это Андроид вынуждает нас применять силу.
Здравствуйте братья! Не когда не посещал этот раздел. А тут вот решил Асс изучать, не столько для кодинга сколько для дизасемблирования. Интересует годная литература, с упором на NASM желательно. Дабы топ не портить можно в лс, буду признателен.