夜雨聆风学习资料网

ARTICLE · 1268617

免杀反调试的开胃小菜?让逆向ai工具疯狂烧token掉血?

免杀反调试的开胃小菜?让逆向ai工具疯狂烧token掉血?

    帮一位在安全公司朋友分析的一个单子,顺便写一下笔记记录一下,首先咱们基于transformer架构模型进行推理了大概,最后手工确定一下就知道对方的在干嘛了,加密部分咱们用xor替换一下。这个样本的思路很多时候就一句话,凭啥要按别人的套路走?拒绝死板正向开发哈哈哈。

    很多时候咱们分析一下别人写的代码和程序,咱们可以学到很多东西的!毕竟咱们写了这么多汇编,底层开发和正向业务开发,有没有想过很多时候其实都是固定死板的套路?既然咱们已经学过底层的开发,汇编,寄存器和内存堆栈都摸得一清二楚了,咱们凭啥非得按部就班地按照别人安排好的既定套路去走,咱们为啥就不能反着来,或者各种魔改硬核变形着来对吧?就像咱们今天随手写的这段测试代码一样,在x64和x86双架构下直接玩花活,把原本清清楚楚的函数地址用异或xor算法给硬生生加密成一堆谁也看不懂的随机乱码,在x64下为了防止硬编码失效咱们通过动态获取api,在x86下可以关闭aslr直接内联汇编手工压栈,让函数地址只在即将执行的最后一刻才在内存里动态解密还原,这样别人在对咱们进行逆向,动态调试和行为跟踪的时候绝对会瞬间懵圈费劲得多,除非他直接上ai来强行反编译,但现在的ai分析这种魔改代码也得疯狂烧token成本直接拉满不是吗哈哈哈!!!但是这其实只是极度基础的免杀和反调试小玩具,真正好玩的硬核黑科技还在后面,像更高级的PE结构重组,手工加壳与脱壳,动态输入表动态修复,甚至大名鼎鼎的vmp虚拟机保护原理,等去年的授课笔记和实战源码咱们后续会陆续全部发出来,到时候咱们再结合具体的底层工程项目细聊,感兴趣的记得关注哦一定要跟紧别掉队哦!

#include<windows.h>#include<stdio.h>#include<stdint.h>#define ORIG_ADDR 0x00411181U#define XOR_KEY   0xA8A8A8A8Uvoidtest(void){    printf("123456\n");}intmain(void){    const char* szText = "Hello x86 or x64";    const char* szCaption = "Msg";#ifdef _WIN64    MessageBoxA(0, 0, 0, 0);    //void (*pTestAddr)(void) = test;    uint64_t encrypted = (uint64_t)test ^ XOR_KEY;    uint64_t decrypted = encrypted ^ XOR_KEY;    void (*pTestAddr)(void) = (void (*)(void))decrypted;    printf("test addr: %p\n", (void*)decrypted);    uintptr_t addr = 0x00007FFFCDF6FC90;    if (addr)    {        typedefint(WINAPI* PFN_MessageBoxA)(HWND, LPCSTR, LPCSTR, UINT);        PFN_MessageBoxA pMessageBoxA = (PFN_MessageBoxA)addr;        pMessageBoxA(NULL, szText, szCaption, 0);    }    //test();    pTestAddr();#else    // ASLR off property -> linker -> advanced -> Randomized Base Address    // decrypted addr = 0x00411181, encrypted addr = 2783228964    uint32_t encrypted = ORIG_ADDR ^ XOR_KEY;    uint32_t decrypted = encrypted ^ XOR_KEY;    printf("test addr: %p\n", (void*)test);    void (*pTestAddr)(void) = (void (*)(void))decrypted;    __asm    {        push 0        push szCaption        push szText        push 0        call MessageBoxA        //call test        mov eax, pTestAddr        call eax    }#endif    return 0;}

相关学习资料