upx 关于脱壳的命令格式如下:upx -d 要脱壳的文件如:UPX -d 132.EXEpEID 里有个通用脱壳机,可以试试而且手工找入口点也是很简单的找pushad对应的Popad,在popad旁的跳转命令就是跳到文件的原入口点了...00505640 W> 60 pushad//入口停在这里 00505641 BE 00004800 mov esi,WB 夜影驱动编程小编今天和大家分享助:UPX脱壳问题 UPX 0.89.6 – 1.02...如何进行Linux下的UPX脱壳 linux很少有需要crack的软件,所以最近总是自娱自乐。自己写的软件自己破着玩但是由于都是知道自己的手段,没有什么意思。...真的希望有高手们写些crackme for linux 。 最近看了看windows的脱壳大致的理解了脱壳的原理。 UPX DLL 脱壳后如何重定位修复如果有腾讯电脑管家直接打开管家。
我将以Linux下的同步Shell作为演示样例,因此我建议大家在阅读本文之前先阅读下面这几篇关于Shellcode的细节文章。...Shellcode: Linuxx86同步Shell汇编 Shellcode:Linux AMD64同步Shell汇编 Shellcode:Linux ARM同步Shell汇编 可能还需要查看关于加密算法的内容...下面的截图中显示的是一台Windows虚拟机发送给Linux虚拟机的部分命令,其中Linux平台运行的Shellcode是没有采用任何加密的。 ?...definek3 esi %definex0 ebx %definex1 edx ; esi= IN data ; ebp= IN key speck_encrypt: pushad...lea ebp, [ebp+@ctx] ; ebp crypto ctx mov ebx, edi ; ebx = msg pushad
(当然我个人理解.可能有更好的理解,请下方评论,我会更改) pushad的时候,肯定所有寄存器入栈....可以看出,一开始就已经pushad (保存所有寄存器环境)了,那么只需要找到popad的位置即可....思路: 因为pushad的时候,所有寄存器传参,当popad的时候,肯定会修改寄存器的值 所以在栈中下硬件访问或者硬件写入断点. 先F8走一步,看栈 ?...没有pushad保存寄存器环境了,已经成功脱壳. 课堂代码资料: 链接:http://pan.baidu.com/s/1skKYA5n 密码:2di6 注意,一定是在32位系统下脱壳.
ESP定律的本质是堆栈平衡,又称堆栈平衡定律,是应用频率最高的脱壳方法之一,脱壳的目的就是找到真正的OEP(源文件的EP代码) 方法: 从pushad到popad是一段解压缩代码(解压UPX壳),这段代码执行后...后的第一个JMP指令可跳转到OEP 实践: 1:查壳 2:OD打开 3:F8 //对于寄存器,指令执行后发生改变的寄存器会用红色显示,此处ESP和EIP的值发生改变,因为执行pushad...指令,将8个通用寄存器(EAX-EDI)的值保存至栈,栈中的值增加了,所以ESP的值发生变化,而EIP的值表示下一个要执行指令的地址,也发生变化 (执行PUSHAD的原因是使栈平衡,这段代码的最后还有...popad处回到栈的初始状态完成解压缩代码,在popad未执行时,它前一个指令执行后ESP的值应该是000DFF54,所以运行后再次遇到ESP为000DFF54时,下一个命令是popad (popad指令把pushad...的值一样 EAX中值不一样的原因是,EAX中保存函数的返回值,保存的是OEP的地址 7:脱壳 总结: 1:执行pushad,下硬件断点F9运行 2:找到popad后的第一个jmp指令F8
用我爱激活成功教程版ollydbg打开CrackmeUPX.exe,可以看到第一条指令是pushad,这显然不是普通程序应该有的第一条指令。pushad保存当前的上下文,即把寄存器的值存到堆栈中。...pushad后,可以看到堆栈中的内容正是之前的各个寄存器的值,其中栈顶保存的是EDI的值。栈顶的地址存储在ESP中。
dd 0 stack db VIRTUAL_STACK dup(0) g1m dq offset fg1m excpustotebstkb dq offset fexcpustk x64pushad...dq offset fx64pushad x64popad dq offset fx64popad popadcy dq offset fpopadcy popadcysd dq offset
因为UPX中可以改动的地方太多,所以人们在这种情况下一般采用动态脱壳 x86的汇编指令pushad可以轻松将所有寄存器一次性压入栈,UPX使用了这样的方式,被形象的称为“保护现场”,所以将这里的下一步执行后...,在esp下硬件读取断点,再次调用就是esp返回的时候,我们直接就可以回到原来的程序执行流 执行过程: 先F8到pushad的下一步,然后在寄存器那边右键ESP,”HW break [ESP]”下硬件断点
一、查找oep 二、dump、修复IAT 一、查找oep way1: 首先在程序入口发现pushad指令,接下来可以直接查找指令popad 在jmp指令处下断,运行。...jmp之后来到oep ---- way2: 当然可以在单步pushad后,转到esp的内存窗口,设置硬件断点,运行,找到jmp处。
例如: _declspec(naked) void OnCall() { __asm { pushad } //do something __asm { popad...上面代码中,pushad的作用是把8个通用寄存器入栈,相当于: push EAX push ECX push EDX push EBX push ESP push EBP push ESI push EDI...popad作用是把栈顶的8个元素出栈,再把它们传到相应的通用寄存器,出栈顺序与pushad指令的入栈顺序正好相反,相当于: pop EDI pop ESI pop EBP pop ESP pop EBX...pop EDX pop ECX pop EAX 使用pushad和popad指令,通用寄存器的数据就能方便的保存下来,也可以方便的还原回去。
北斗2.3 004124B5 9C pushfd 004124B6 60 pushad 004124B7...0040F4FD FFD0 call eax 北斗1.1 0040F4ED 9C pushfd 0040F4EE 60 pushad...FFD0 call eax nothing 0040F4ED 83EC 50 sub esp,0x50 0040F4F0 60 pushad... 0040F4FB FFD0 call eax Crypto-Lock 0040F4ED 60 pushad
让我们来构建ROP chain 首先,让我们出栈一个值到EBP中,后面调用PUSHAD: ? 通过取反得到值0x201,然后将值放入到EBX寄存器,作为参数dwSize的值 ?...为了等下调用调用PUSHAD,我们将一些值放入到EDI和ESI寄存器中 ? 最后,我们放入函数VirtualProtect()的地址来进行调用,EAX寄存器的值就是0x1060e25c ?...接下来就很简单了,将我们设置的VirtualProtect()的寄存器压入堆栈,直接用了PUSHAD和JMP ESP,PUSHAD压入堆栈,JMP ESP转到执行。 ?...PUSHAD将按以下顺序将寄存器值放在堆栈上:EAX、ECX、EDX、EBX、ESP, EBP, ESI,EDI。 Python: ?
dllimport) ServiceDescriptorTableEntry_t KeServiceDescriptorTable; 这里我们再利用汇编来执行我们的汇编代码之后再jmp到原覆盖地址+5的地方,先用pushad...跟pushfd保存寄存器 void _declspec(naked) NewNtOpenFile() { __asm { pushad pushfd...PsGetCurrentProcess() + 0x174)); } void _declspec(naked) NewNtOpenFile() { __asm { pushad
C" _declspec(naked) void HookProc() //裸函数,编译器不帮我们平衡堆栈 { //先把现场保留了 _asm { pushad...DWORD EDX; DWORD EBP; DWORD ESP; DWORD ESI; DWORD EDI; }regeist; regeist reg = { 0 }; 然后第22~28行的值由于pushad...MyTest pAddr =Test; extern "C" _declspec(naked) void HookProc() //裸函数,编译器不帮我们平衡堆栈 { //先把现场保留了 _asm { pushad
------ .CODE ;除0错异常处理函数 Div_handler0 proc C uses ebx esi edi pExcept,pFrame,pContext,pDispatch PUSHAD...endp ;读写冲突内存异常处理函数 Wri_handler1 proc C uses ebx esi edi pExcept,pFrame,pContext,pDispatch PUSHAD...endp ;断点中断异常处理函数 Int3_handler2 proc C uses ebx esi edi pExcept,pFrame,pContext,pDispatch PUSHAD...---------------------------------------- Div_handler0 proc C pExcept,pFrame,pContext,pDispatch PUSHAD...@ContiSearch Int3_handler2 endp SELF_UNWIND proc C pExcept,pFrame,pContext,pDispatch PUSHAD
特别是我们执行完 pushad pushfd 之后. 我们先看一下原始堆栈 ? 画图看一下 ? 查看堆栈图可以看到. 我们的返回地址下面.就是调用者CS....就必须 使用 [esp + 8 + 4] = 参数1 +8 = 参数2 + c = 参数3 +10 = 调用者ESP +14 = 调用者SS 而我们如果pushad pushfd之后.那么显而易见....pushad 是所有通用寄存器入栈. 也就是8个 pushfd 是EFlag入栈. 所以总共 是入栈9个参数. 9个参数之后才是返回地址. 其它依次类推....所以我们想要寻得参数的值 才必须要写为如下 0x24 = (pushad + pushfd) = 9个入栈....所以要使用寄存器 必须 pushad pushfd 用来保存.
1、现场的保存和恢复 之前是逐条push和pop,后来在网上看到更简洁的方法:pushad(机器码是:0x60),popad(机器码是0x61),一次性保存和恢复所有寄存器。
PUSHA指令执行之前的值 POPA 16位通用寄存器全出栈指令 POPA 以PUSHA相反的顺序从堆栈中弹出内容,从而恢复PUSHA之前的寄存器状态 SP的值不是由堆栈弹出的,而是通过增加16来恢复 PUSHAD...32位通用寄存器全进栈指令 PUSHAD 将所有8个32位通用寄存器的内容压入堆栈 压入顺序是EAX ECX EDX EBX ESP EBP ESI EDI,然后对战指针寄存器SP的值减32,所以SP...进栈的内容是PUSHAD指令执行之前的值 POPAD 32位通用寄存器全出栈指令 POPAD 以PUSHAD相反的顺序从堆栈中弹出内容,从而恢复PUSHAD之前的寄存器状态 ESP的值不是由堆栈弹出的,
PEID后: 这里很明显是一个UPX加壳后的程序,采用的是UPX壳代码 连接器版本6.0 也就是vc6.0的 开始脱壳 1 找到OEP 首先采用od加载exe 这里跟之前我们想的加壳是一样的,就是先pushad...,然后再处理自己想处理的,最后popad,再跳转回到真正的OEP里面 pushad • //壳代码 • popad • jmp xxxx 但是这里没有popad,所以需要找一下popad...,在pushad执行完之后,esp指向的是栈顶的位置,popad的话会让esp移动,所以可以直接给esp打一个断点 这里来一个esp断点,也可以通过别的,比如在command中访问到esp的地址,然后选择
asm { mov eax,eax mov eax,eax } while (true) { __asm { pushad...dword ptr ss:[esp+4],edi jmp testvmp.vmp.9633F4 mov word ptr ss:[esp],cx mov dword ptr ss:[esp],eax pushad...dword ptr ss:[esp+1C],eax pushfd push esi 保存寄存器ESI pushfd pop dword ptr ss:[esp+20] push A9CEAE65 pushad...inc si push 540000 这个值与之前PUSH来的KEY共同计算指令handle下一跳地址 jmp testvmp.vmp.963343 test cl,F7 rcr si,cl pushad
加载指令 , lds , les , lfs , lgs , lss , mov 数据传送指令 push 入栈指令 , pop 出栈指令 , pushf , popf , pushd , popd , pushad