Реверсинг. Задай вопрос - получи ответ

Discussion in 'Реверсинг' started by 0x0c0de, 2 Sep 2007.

  1. KIR@PRO

    KIR@PRO from Exception

    Joined:
    26 Dec 2007
    Messages:
    826
    Likes Received:
    291
    Reputations:
    359
    _________________________
    #1081 KIR@PRO, 14 Apr 2016
    Last edited: 28 Oct 2016
  2. MailMarket

    MailMarket New Member

    Joined:
    27 Nov 2015
    Messages:
    3
    Likes Received:
    0
    Reputations:
    6
    Спасибо
     
  3. supervoid

    supervoid New Member

    Joined:
    29 Apr 2016
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    Доброго времени, подскажите, чем сейчас можно побороть vmprotect, я имею в виду чем можно очистить exe от обработки протектором.
     
  4. ozrior

    ozrior New Member

    Joined:
    20 Oct 2011
    Messages:
    27
    Likes Received:
    4
    Reputations:
    0
    ollydbg + script с тутсей
     
  5. supervoid

    supervoid New Member

    Joined:
    29 Apr 2016
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    К сожаленью не нашел. Не дадите ссылку?

    ADD:
    И кстати, речь идет о скрипте под актуальную версию vmprotect?
     
    #1085 supervoid, 3 May 2016
    Last edited by a moderator: 25 Oct 2016
  6. Mitai

    Mitai New Member

    Joined:
    31 Aug 2016
    Messages:
    2
    Likes Received:
    1
    Reputations:
    0
    чем извлечь ASProtect 2.1x SKE -> Alexey Solodovnikov
    мб есть какой то мануал на русском? на титсах все на энглише
     
  7. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    637
    Likes Received:
    246
    Reputations:
    42
  8. Mitai

    Mitai New Member

    Joined:
    31 Aug 2016
    Messages:
    2
    Likes Received:
    1
    Reputations:
    0
    KIR@PRO likes this.
  9. dem1305

    dem1305 New Member

    Joined:
    3 Sep 2016
    Messages:
    1
    Likes Received:
    0
    Reputations:
    0
    Привет всем. Искал, где написать-так конкретно и не нашел.Решил здесь спросить.
    Вопрос по драйверу (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]
     
    #1089 dem1305, 3 Sep 2016
    Last edited by a moderator: 3 Sep 2016
  10. frantip

    frantip New Member

    Joined:
    23 Aug 2016
    Messages:
    1
    Likes Received:
    0
    Reputations:
    0
    Помогите ревёрснуть, game.exe данный exe'шник блочит программы WPE PRO RPE pro
     
  11. cyclofer0n

    cyclofer0n New Member

    Joined:
    13 Sep 2016
    Messages:
    1
    Likes Received:
    0
    Reputations:
    0
    Привет!
    Ребята, могли бы помочь с раскодированием такого зверя:
    Файлы закодированы судя по всему PHP Lock It
    Один (php) вызывает другой (php5), чтобы получить целый файл.
    Мне, к сожалению, в силу своих знаний не удалось общедоступными средствами это сделать

    UPDATE:
    Разобрали на нулледе, вопрос снят.
     
    #1091 cyclofer0n, 13 Sep 2016
    Last edited: 14 Sep 2016
  12. binarymaster

    binarymaster Elder - Старейшина

    Joined:
    11 Dec 2010
    Messages:
    4,717
    Likes Received:
    10,195
    Reputations:
    126
    Не вызывает, а считывает, декодирует, и выполняет декодированное.

    Там ещё встроено декодирование с использованием хеша от файла, это заметно затрудняет манипуляции с кодом.
     
    Triton_Mgn likes this.
  13. shellcoder

    shellcoder New Member

    Joined:
    12 Sep 2016
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    Подскажите пожалуйста наилучший путь, возможно какой-то гайд, как освоить инструмент IDA Pro ?
     
  14. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    637
    Likes Received:
    246
    Reputations:
    42
    Что может быть лучше официальных мануалов? https://www.hex-rays.com/products/ida/debugger/index.shtml
    Так же, в интернете полно мануалов, инструкций и гайдов. И естественно самое главное - это практика.
     
    KIR@PRO and binarymaster like this.
  15. Fang

    Fang New Member

    Joined:
    26 Nov 2016
    Messages:
    1
    Likes Received:
    0
    Reputations:
    0
    Есть программа /закрытая winlincense/ которая работает с zip архивами .... zip пароль для работы с архивом зашит в программе ... как его вытащить от туда? идеи ?
     
  16. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    637
    Likes Received:
    246
    Reputations:
    42
    снять winlicense и потрассировать работу с архивами
     
  17. goodguysoft

    goodguysoft Member

    Joined:
    25 Mar 2016
    Messages:
    49
    Likes Received:
    24
    Reputations:
    2
    Я взламываю Андроид-приложение, в котором есть самомодифицирующаяся двоичная библиотека. Я с таким еще не сталкивался и полагал, что под Андроид не бывает запаковщиков двоичного (не Ява) кода.
    Вопрос, конечно, сводится к тому, как распаковать библиотеку. К счастью, она полностью распаковывается при запуске - это я выяснил. Однако, вопрос в том, как на Адроиде сохранить дамп памяти, содержащей библиотеку. Библиотека в загруженном виде содержит 3 сегмента (код, данные и данные только для чтения). В принципе, их можно сохранить на диск через /proc/self/maps и /proc/self/mem Но как их собрать назад в so-файл, который бы "понимала" Ида, или который бы можно было запустить на Андроиде?
     
  18. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    637
    Likes Received:
    246
    Reputations:
    42
    В линухе не силен, но думаю там аналогично с виндой, одного дампа либы в работающем виде не достаточно, для создания полноценного so. Нужно будет как минимум дампить с EP + восстанавливать импорт. По поводу запаковщиков двоичного кода, вероятно там какой-то банальный алгоритм сжатия/шифрования (а-ля zlib+xor), реализованные средствами java. Думаю вам нужно найти человека, реверсящего линуху или конкретно андроид, а пока - это битва экстрасенсов)
     
    goodguysoft likes this.
  19. goodguysoft

    goodguysoft Member

    Joined:
    25 Mar 2016
    Messages:
    49
    Likes Received:
    24
    Reputations:
    2
    Ты абсолютно прав, коллега, распаковка частично завязана на Яву. После загрузки библиотеки Ява вызывает функцию распаковки через JNI. Однако, при дизассемблировании эта функция (распаковки) отсутствует. Могу предположить, что частичная распаковка происходит в секции .init_array или функции JNI_OnLoad, что эта частичная распаковка расшифровывает ту основную функцию распаковки, которую запуская Ява. Однако, обе функции (из секции инициализации и инициализация Явы) выглядят просто пустым заглушками.

    Поэтому есть еще другой вариант - что Ява как-то модифицирует библиотеку уже после установки, и что в APK содержится одна библиотека, а по факту запускается другая... интересно, система безопасности Андроида разрешает приложению себя модифицировать? Надо это проверить.

    Битву экстрасенсов прийдется выигрывать лично мне - так как позарез надо крякнуть их. Буду по чуть-чуть выкладывать инфу, если найдутся желающие подсказать, то велкам.
    По реверсингу Линукса (в отличие от Винды) инфы не густо - и логично, ведь это опенсорс, его ломать-то не нужно, это Андроид вынуждает нас применять силу.
     
  20. CKAP

    CKAP Well-Known Member

    Joined:
    9 Oct 2015
    Messages:
    652
    Likes Received:
    2,865
    Reputations:
    8
    Здравствуйте братья! Не когда не посещал этот раздел. А тут вот решил Асс изучать, не столько для кодинга сколько для дизасемблирования. Интересует годная литература, с упором на NASM желательно. Дабы топ не портить можно в лс, буду признателен.