一、机械码,又称机器码.
ultraedit打开,编辑exe文件时你会看到
许许多多的由0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F组成的数码,这些数码
就是机器码.
修改程序时必须通过修改机器码来修改exe文件.
二、需要熟练掌握的全部汇编知识(只有这么多)
不大容易理解,可先强行背住,混个脸儿熟,以后慢慢的就理解了
cmp a,b 比较a与b
mov a,b 把b的值送给a
ret 返回主程序
nop 无作用,英文“no operation”的简写,意思是“do nothing”(机器码90)***机器码的含义参看上面
(解释:ultraedit打开编辑exe文件时你看到90,等同于汇编语句nop)
call 调用子程序
je 或jz 若相等则跳(机器码74 或0F84)
jne或jnz 若不相等则跳(机器码75或0F85)
jmp 无条件跳(机器码EB)
jb 若小于则跳
ja 若大于则跳
jg 若大于则跳
jge 若大于等于则跳
jl 若小于则跳
jle 若小于等于则跳
pop 出栈
push 压栈
三、常见修改(机器码)
74=>75 74=>90 74=>EB
75=>74 75=>90 75=>EB
jnz->nop
75->90(相应的机器码修改)
jnz -> jmp
75 -> EB(相应的机器码修改)
jnz -> jz
75->74 (正常) 0F 85 -> 0F 84(特殊情况下,有时,相应的机器码修改)
四、两种不同情况的不同修改方法
1.修改为jmp
je(jne,jz,jnz) =>jmp相应的机器码EB (出错信息向上到的第一个跳转)jmp的作用是绝对跳,无条件跳,从而跳过下面的出错信息
xxxxxxxxxxxx 出错信息,例如:注册码不对,sorry,未注册版不能...,"Function Not Avaible in Demo" 或 "Command Not Avaible" 或 "Can't save in Shareware/Demo"等 (我们希望把它跳过,不让它出现)
xxxxxxxxxxxx 正确路线所在
2.修改为nop
je(jne,jz,jnz) =>nop相应的机器码90 (正确信息向上到的第一个跳转) nop的作用是抹掉这个跳转,使这个跳转无效,失去作用,从而使程序顺利来到紧跟其后的正确信息处
xxxxxxxxxxxx 正确信息,例如:注册成功,谢谢您的支持等(我们希望它不被跳过,让它出现,程序一定要顺利来到这里)
xxxxxxxxxxxx 出错信息(我们希望不要跳到这里,不让它出现)
五、爆破无敌口诀 背会此口诀,天下无敌,以后慢慢琢磨,仔细体会,收益多多。如此好的口诀,不要错过
一条(跳)就死,九筒(90)就胡  (对应上面的2.修改为nop
一条(跳)就胡,一饼(EB)伺候  (对应上面的1.修改为jmp
妻死(74)便妻无(75
爸死(84)便爸无(85
上一讲我们学习了UPX的脱壳方法,今天我们来学习Aspack脱壳, Aspack也是一种压缩壳,强度很低。我们以win98中的记事本为例,它的OEP是4010CC。
第一步,先侦壳,侦壳工具为peid0.92,侦测结果如下:
 
是ASPack 2.12 -> Alexey Solodovnikov加的壳,我们请出调试利器:Ollydbg1.09,载入程序,出现提示:
选择否
0040D001 >  60              PUSHAD        数据压栈
0040D002    E8 03000000    CALL NOTEPAD.0040D00A  在这里要按键盘F7键进入 ,否则程序就运行了
0040D007  - E9 EB045D45    JMP 459DD4F7
0040D03C    FF95 4D0F0000  CALL DWORD PTR SS:[EBP+F4D]
按键盘F7键来到这里:
0040D00A    5D              POP EBP       
0040D00B    45              INC EBP
0040D00C    55              PUSH EBP
0040D00D    C3              RETN  ………………………………..在这里返回40D008
0040D00E    E8 01000000    CALL NOTEPAD.0040D014
0040D013    EB 5D          JMP SHORT NOTEPAD.0040D072
0040D008  /EB 04          JMP SHORT NOTEPAD.0040D00E ……….直接跳向0040D00E
0040D00A  |5D              POP EBP
0040D00B  |45              INC EBP
0040D00C  |55              PUSH EBP
0040D00D  |C3              RETN
0040D00E  \E8 01000000    CALL NOTEPAD.0040D014 来到这里,在这里要按键盘F7键进入 ,否则程序就运行了
0040D013    EB 5D          JMP SHORT NOTEPAD.0040D072
0040D015    BB EDFFFFFF    MOV EBX,-13
按键盘F7键来到这里:
0040D014    5D              POP EBP       
0040D015    BB EDFFFFFF    MOV EBX,-13
0040D01A    03DD            ADD EBX,EBP
0040D01C    81EB 00D00000  SUB EBX,0D000
0040D022    83BD 22040000 0>CMP DWORD PTR SS:[EBP+422],0notepad++
0040D029    899D 22040000  MOV DWORD PTR SS:[EBP+422],EBX
0040D02F    0F85 65030000  JNZ NOTEPAD.0040D39A …………在这里跳转未实现,我们要让它跳转,按回车键,再按键盘F4键,使得跳转实现。
0040D035    8D85 2E040000  LEA EAX,DWORD PTR SS:[EBP+42E]
0040D03B    50              PUSH EAX
0040D03C    FF95 4D0F0000  CALL DWORD PTR SS:[EBP+F4D]
跳转实现,来到:
0040D39A    B8 CC100000    MOV EAX,10CC
0040D39F    50              PUSH EAX      …………………….此时的寄存器eax的值是10cc
0040D3A0    0385 22040000  ADD EAX,DWORD PTR SS:[EBP+422] ……….. 此时SS:[EBP+422] 的值是400000 是基址
0040D3A6    59              POP ECX
0040D3A7    0BC9            OR ECX,ECX
0040D3A9    8985 A8030000  MOV DWORD PTR SS:[EBP+3A8],EAX…………此时的寄存器eax的值是4010cc
0040D3AF    61              POPAD …………..栈弹出
0040D3B0    75 08          JNZ SHORT NOTEPAD.0040D3BA
0040D3B2  |B8 01000000    MOV EAX,1
0040D3B7  |C2 0C00        RETN 0C
0040D3BA  \68 CC104000    PUSH NOTEPAD.004010CC OEP…………..压栈
0040D3BF    C3              RETN  跳向程序入口点
来到:
004010CC    55              PUSH EBP  在这里就可以dump
004010CD    8BEC            MOV EBP,ESP
004010CF    83EC 44        SUB ESP,44
004010D2    56              PUSH ESI
004010D3    FF15 E4634000  CALL DWORD PTR DS:[4063E4]
最后的修复输入表,与一讲将是相同的步骤:
需要掌握的概念:
★PE文件:Microsoft设计了一种新的文件格式Portable Executable File Format(PE格式),该格式应用于所有基于Win32的系统:Windows NTWindows 2000Win32sWindows 95/98
基址(ImageBase :是指装入到内存中的EXEDLL程序的开始地址,它是Win32中的一个重要概念。 Windows NT中,缺省的值是10000h;对于DLLs,缺省值为400000h。在Windows 95中,10000h不能用来装入32位的执行文件,因为该地址处于所有进程共享的线性地址区域,因此MicrosoftWin32可执行文件的缺省基地址改变为400000h
★RVA:相对虚拟地址(Relative Virual Address),是某个项相对于文件映象地址的偏移。例如:装载程序将一个PE文件装入到虚拟地址空间中,从10000h开始的内存中,如果PE中某个表在映像中的起始地址是10464h,那么该表的RVA就是464h。虚拟地址(RVA)=偏移地址+基址(ImageBase )
★Entry Point:入口点,就是程序在完成了对原程序的还原后,开始跳转到刚还原的程序执行,此时的地址就是入口点的值。
那么4010cc相对虚拟地址,400000就是基址,10cc就是偏移。
msn:crack9527@hotmail

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。