破 解 预 备 知 识
一、机械码,又称机器码.
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)
许许多多的由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
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
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)
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 NT、Windows 2000、Win32s及Windows 95/98。
★基址(ImageBase ):是指装入到内存中的EXE或DLL程序的开始地址,它是Win32中的一个重要概念。 在Windows NT中,缺省的值是10000h;对于DLLs,缺省值为400000h。在Windows 95中,10000h不能用来装入32位的执行文件,因为该地址处于所有进程共享的线性地址区域,因此Microsoft将Win32可执行文件的缺省基地址改变为400000h。
★RVA:相对虚拟地址(Relative Virual Address),是某个项相对于文件映象地址的偏移。例如:装载程序将一个PE文件装入到虚拟地址空间中,从10000h开始的内存中,如果PE中某个表在映像中的起始地址是10464h,那么该表的RVA就是464h。虚拟地址(RVA)=偏移地址+基址(ImageBase )
★Entry Point:入口点,就是程序在完成了对原程序的还原后,开始跳转到刚还原的程序执行,此时的地址就是入口点的值。
那么4010cc是相对虚拟地址,400000就是基址,10cc就是偏移。
msn:crack9527@hotmail
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论