虽然是转载教程,但足以表现对论坛的热爱,希望管理适当给个邀请码,非计算机专业的我会加倍努力学习!
给不给邀请码不要紧,大家感觉某些东东有点点用处就好。
今天总结的内容是关于脱壳
先来了解5 种常见语言特征
Borland C++
0040163C B> /EB 10 jmp short Borland_.0040164E
0040163E |66:623A bound di,dword ptr ds:[edx]
00401641 |43 inc ebx
00401642 |2B2B sub ebp,dword ptr ds:[ebx]
00401644 |48 dec eax
00401645 |4F dec edi
00401646 |4F dec edi
00401647 |4B dec ebx
00401648 |90 nop
00401649 -|E9 98E04E00 jmp SHELL32.008EF6E6
0040164E \A1 8BE04E00 mov eax,dword ptr ds:[4EE08B]
00401653 C1E0 02 shl eax,2
00401656 A3 8FE04E00 mov dword ptr ds:[4EE08F],eax
0040165B 52 push edx
0040165C 6A 00 push 0
0040165E E8 DFBC0E00 call <jmp.&KERNEL32.GetModuleHandleA>
**********************************************************************************
Delphi
00458650 D> 55 push ebp
00458651 8BEC mov ebp,esp
00458653 83C4 F0 add esp,-10
00458656 B8 70844500 mov eax,Delphi.00458470
0045865B E8 00D6FAFF call Delphi.00405C60
00458660 A1 58A14500 mov eax,dword ptr ds:[45A158]
00458665 8B00 mov eax,dword ptr ds:[eax]
00458667 E8 E0E1FFFF call Delphi.0045684C
0045866C A1 58A14500 mov eax,dword ptr ds:[45A158]
00458671 8B00 mov eax,dword ptr ds:[eax]
00458673 BA B0864500 mov edx,Delphi.004586B0
00458678 E8 DFDDFFFF call Delphi.0045645C
0045867D 8B0D 48A24500 mov ecx,dword ptr ds:[45A248] ; Delphi.0045BC00
00458683 A1 58A14500 mov eax,dword ptr ds:[45A158]
00458688 8B00 mov eax,dword ptr ds:[eax]
0045868A 8B15 EC7D4500 mov edx,dword ptr ds:[457DEC] ; Delphi.00457E38
00458690 E8 CFE1FFFF call Delphi.00456864
00458695 A1 58A14500 mov eax,dword ptr ds:[45A158]
0045869A 8B00 mov eax,dword ptr ds:[eax]
0045869C E8 43E2FFFF call Delphi.004568E4
**********************************************************************************
Visual C++
0046C07B U> 55 push ebp
0046C07C 8BEC mov ebp,esp
0046C07E 6A FF push -1
0046C080 68 18064C00 push UltraSna.004C0618
0046C085 68 F8364700 push UltraSna.004736F8
0046C08A 64:A1 00000000 mov eax,dword ptr fs:[0]
0046C090 50 push eax
0046C091 64:8925 00000000 mov dword ptr fs:[0],esp
0046C098 83EC 58 sub esp,58
0046C09B 53 push ebx
0046C09C 56 push esi
0046C09D 57 push edi
0046C09E 8965 E8 mov dword ptr ss:[ebp-18],esp
0046C0A1 FF15 74824A00 call dword ptr ds:[<&KERNEL32.GetVersion>] ;
kernel32.GetVersion
0046C0A7 33D2 xor edx,edx
0046C0A9 8AD4 mov dl,ah
0046C0AB 8915 403F4F00 mov dword ptr ds:[4F3F40],edx
0046C0B1 8BC8 mov ecx,eax
0046C0B3 81E1 FF000000 and ecx,0FF
0046C0B9 890D 3C3F4F00 mov dword ptr ds:[4F3F3C],ecx
**********************************************************************************
汇编
00401000 汇> 6A 00 push 0
00401002 E8 C50A0000 call <jmp.&KERNEL32.GetModuleHandleA>
00401007 A3 0C354000 mov dword ptr ds:[40350C],eax
0040100C E8 B50A0000 call <jmp.&KERNEL32.GetCommandLineA>
00401011 A3 10354000 mov dword ptr ds:[403510],eax
00401016 6A 0A push 0A
00401018 FF35 10354000 push dword ptr ds:[403510]
0040101E 6A 00 push 0
00401020 FF35 0C354000 push dword ptr ds:[40350C]
00401026 E8 06000000 call 汇编.00401031
0040102B 50 push eax
0040102C E8 8F0A0000 call <jmp.&KERNEL32.ExitProcess>
00401031 55 push ebp
00401032 8BEC mov ebp,esp
00401034 83C4 B0 add esp,-50
00401037 C745 D0 30000000 mov dword ptr ss:[ebp-30],30
0040103E C745 D4 0B000000 mov dword ptr ss:[ebp-2C],0B
00401045 C745 D8 37114000 mov dword ptr ss:[ebp-28],汇编.00401137
**********************************************************************************
VB
0040116C V>/$ 68 147C4000 push VB.00407C14
00401171 |. E8 F0FFFFFF call <jmp.&MSVBVM60.#100>
00401176 |. 0000 add byte ptr ds:[eax],al
00401178 |. 0000 add byte ptr ds:[eax],al
0040117A |. 0000 add byte ptr ds:[eax],al
0040117C |. 3000 xor byte ptr ds:[eax],al
**********************************************************************************
大家除了可以通过我以前说过的,看是否是大跨段来判断是否到达OEP 之外
还可以利用上面5 种常见的语言特征来判断是否达到了OEP!
脱壳后程序出现无法运行的情况的话
你就要想到是否是你的修复有误、自校验、附加数据。。。
处理的方法我也讲过了,希望大家好好的吸收!
脱壳除了多吸取别人的经验之外必要要自己多练习
http://bbs.pediy.com/
大家可以把这5 个程序拿来加壳自己脱,这样才有进步
我个人就看了不少的资料
关于方法除了我介绍的那7 种方法之外,似乎已经没有捷径可以走了
当然最基础的方法是单步法,在很多时候我们拿到一个壳不知道怎么下手好时
我们都应该用单步走的方法跟踪调试下,这样或许就可以找到眉目!
我的一个感受是脱壳到深处就是破解了
因为现今很多壳都是可以不用脱直接就可以破解的
像UPX、ASPack 都可以用直接打SMC 补丁的办法破解
甚至像ASProtect Armadillo 之类的猛壳都可以直接做内存补丁!
当然这要求我们有很深的汇编、编程功底了。。所以说大家还需努力
再强调一次:每一种壳都有脱他的思路,大家现在也只有记下这些思路,等到后面再慢慢的去吸收!
再重申一次:汇编不行的人永远只能是菜鸟!
大家看了这两句有什么感想呢?有没有觉得改做点什么?
另外说明一下破解又名逆向工程,本来就是计算机技术的一个不可或却的分支!大家要把他和编程区分清
楚
当然我也在这里建议大家:学好一门编程才是实质!
因为破解和编程是两个不可能分开是技术!
今天总结的内容是关于破解
动态调试器--OD、SoftICE、TRW2000
静态调试器--W32、C32
还有很多辅助工具像对付VB 的c32asm、GetVBRes、VBExplorer 、SmartCheck
对付Delphi 和BC++的有DEDE
当然大家在以后搞破解过程当中还会接触到很多很多的工具
像对付.NET 的Reflector
所以说学习是一个很辛苦的过程,学习破解尤为需要耐性!
**********************************************************************************
破解的思路大致是
1、找错误提示。。。。分析
2、最常用的方法是下相应的断点
常见断点设置
字符串
bp GetDlgItemTextA(W) ****
bp GetDlgItemInt
bp GetWindowTextA(W) ****
bp GetWindowWord
bmsg XXXX wm_gettext
对话框
bp MessageBeep
bp MessageBoxA(W) ****
bp MessageBoxExA(W)
bp DialogBoxParamA(W)
bp GreateWindowExA(W)
bp ShowWindow
bp UpdateWindow
bmsg XXXX wm_command
对于VB 的程序用bp MessageBoxA 是无法断下来的,bp rtcMsgBox
注册表相关
bp RegCreateKeyA(W)
bp RegDeleteKeyA(W)
bp RegQueryValueA(W)
bp RegCloseKey
bp RegOpenKeyA(W) ****
时间相关
bp GetLocalTime
bp GetFileTime
bp GetSystemtime
INI 初始化文件相关
bp GetPrivateProfileStringA ****//xor eax,eax--->or eax,eax
bp GetPrivateProfileInt
bp WritePrivateProfileString
bp WritePrivateProfileInt
文件访问相关
bp ReadFile
bp WriteFile
bp CreateFileA ****
bp SetFilePointer
bp GetSystemDirectory
其实比如一个程序我们只是需要找到注册验证的相对应的代码进行分析就可以了
因为我们注册的时候要点一个按钮的
所以这就要求我们能够找到相对应的按钮事件
关于这个我也讲过的
像对付Delphi、BC++的程序可以用DEDE 去找注册的按钮事件,从而使OD 能够断下来
那个冒险岛外挂我用的也是找按钮事件的方法使其在OD 中断下来的
当然方法并不是千篇一律,像那个QQ 群发的工具即使我们使用DEDE 找到了注册验证按钮事件,但是,
作者把
注册验证放到其他地方去啦。。。呵呵
所以大家要学会融会贯通!眼睛要亮一点~~~
当然有一点必须承认的就是:破解多了自然有一种灵感,就像我们学语文,英语的语感一样
大家还可以尝试下不脱壳直接破解
方法是运行到OEP 之后查找字符串然后对程序进行分析
00401D00 /0F84 DF000000 je UltraDic.00401DE5
最后送大家一句话:多多查阅、多多练习、多多纪录、多多总结!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)