实验平台逆向知识
汇编基础知识
平常好像也不会在意EAX~RDX的用处,记一下总没有错
符号标志位以及标志位判断
脱壳篇
见下一篇
按钮事件
前三个都是右键查找->二进制字串,VC++查找->命令
BC++&Delphi
1 | 74 0E 8B D3 8B 83 ?? ?? ?? ?? FF 93 ?? ?? ?? ?? |
VB
1 | 81 6C 24 |
易语言
PEID分辨的时候会显示为VC6程序,所以进去先搜索FF 25看是不是易语言写的
1 | FF 55 FC 5F 5E |
VC++
1 | sub eax, 0a |
初级破解
跳过登录
查找相关字符串,将跳到False的条件NOP,右键Nop的地方,复制到可执行文件->选择,在新窗口右键,保存到文件,重新打开发现直接success
获取注册码
查找相关字符串
找到关键Call(用来判断是否正确),下断点,F7步进,之后慢慢找到注册码
跳转破解
利用密码不对往上面找,看到上面一行的向右,点一下根据连线找到跳转语句,打断点
运行发现就是这的原因,空格改变汇编语句
更改为jmp(原来是je的条件跳转),结束。
修改关键CALL的返回值
是一个注册软件
搜索感谢注册等字样,找到语句,并且找到包围它的跳转(跳false的条件)
是根据CoolVide.xxxx函数的返回值判断的,在Call语句下断点运行,随便输一下,断住
F7步入,将第一行修改
第二行改为retn
右键,复制到可执行文件->所有修改,全部复制,保存
重新打开,发现注册按钮变灰(注册成功)
万能断点
也是注册软件,我们利用它来追下注册码
用Ollydbg运行,随便输入注册,软件退出后右键
选择user32
右键查找二进制字串,输入万能断点
1 | F3 A5 8B C8 83 E1 03 F3 A4 E8 |
查找后对应语句下断点,OD重新运行,由于万能断点,中途会暂停多次,一直到我们随便输入再点击确认按钮
然后开始步过,直到堆区出现注册码。(好傻。。。)
删除弹窗
OD运行,让他出现弹窗,点击暂停,从工具栏中的K进入堆栈视图
找到MessageBoxExa,右键选择显示调用
F2打断点,重新运行到断点处
步过一次,出现弹窗
点击“是”,右键查看Call的调用树,搜索call 4641B8
找到上层函数,发现jnz关键语句,空格改为jmp
老套路保存。之后无弹窗。
通过查找字符串,寻找注册码
右键中文搜索引擎->智能搜索到不正确里面,找到关键跳转
Nop填充,保存,破解完成
在字符串中发现密码文件(好傻。。。)
BC++脱壳后的修复(寻找IAT Import Address Table)
同样是注册软件,单步步过,用rsp定律脱
右键HW break,继续运行
步过到OEP,dump
用LoadPE软件,找到进程,选择纠正镜像大小,再完全脱壳
但是这里会得到一个不能打开的软件,因为IAT,引入函数位置不对
打开Import REC软件,找到进程,OEP输入入口(14E0)
OD重新运行到入口,在第一个CALL步入,往上找到段首(retn后面),右键在数据窗口中跟随内存地址
内存窗口中右键选择长型->地址
由内存映像中基址为00400000,可知偏移为16E114
打开REC软件,再打开原始软件,OEP填入入口,RVA填入偏移量,获取导入表
右键使用删除指针把无效的删除
点击修正转储
选择脱壳软件保存,重新运行一下
脱壳且正常运行
利用dede软件查找deiphi
还是注册,右键发送到dede,一直yes,到过程页面
之后跟之前类似了,把验证错误的分支NOP再重打包
ALT F9关键CALL追注册码
无壳,发送到OD运行到注册失败
回到OD点击暂停,菜单栏调试->执行到用户代码
然后回到软件点击确定,发现OD跳转并且暂停了
往上找,发现了包围唤起弹窗的两个跳转,打断点,但是都不停止,继续往上找,能找到一个比较大的跳转
在关键CALL打断点,步入,步过找注册码