浅学软件逆向笔记(1)

软件逆向工程是指从程序系统出发,通过运用解密、反汇编、系统分析、程序理解等多种计算机网络安全技术,对软件的结构、流程、算法、代码等进行逆向的拆解分析,从而推出软件产品的源代码、设计原理、结构、算法、处理过程、运行方法及相关文档等的过程。

目录

一.两个案例

案例1 :

 案例二:

二.加壳软件的爆破与逆向

三.更改软件标题

四.手动脱壳与脚本脱壳

1.手动脱壳

2.脚本脱壳

五.软件找oep与call的介绍

六.跳转指令jmp与nop指令

七.弹窗破解2种方法

方法1

 方法2

八.深入注册码3种方式

1.爆破

2.找注册码


一.两个案例

案例1 :

一个需要登录才能使用的软件

将这个软件拉到OD当中

Ollydbg 通常称作OD,是反汇编工作的常用工具OD附带了200脱壳脚本和各种插件,功能非常强大

然后运行一下(OD页面上栏的三角形符号),登录界面出来以后

右键——>中文搜索引擎——>智能模式

找到“登陆失败”,然后点击,查看是什么原因导致登陆失败

 发现有一个跳转,导致登陆失败

我们怎样让它运行到“0F84”这个地方,不发生跳转,直接运行到登陆成功的代码

点击“0F84”,右键——>二进制——>用NOP填充

然后在登录界面随便输入账号和密码,就可以登录成功

 

 案例二:

 一个需要注册码注册的软件。随便输入,报错Name/Code mis-match Try again

 将这个软件拉到OD当中,再运行,输入66666和666666

右键——>中文搜索引擎——>智能模式

找到刚才的错误提示信息,点击查看,也是有一个跳转

 怎么分析刚刚输入的66666的注册吗呢?

在跳转前面有一个关键“call”,在这里下一个断点(双击)。再运行一下,点击Validata My Code。s

堆栈窗口,是在把我们随便输入的注册码与真实注册码做对比

在这个窗口找找有没有注册码,如果没有就往下走一步

先把66666传进去,在call里做一系列的对比运算,算出来了66666的注册码

 

二.加壳软件的爆破与逆向

用查壳工具PEiD,查询是否加壳,然后用相应都去壳工具去壳。

 

这里已经脱壳完成

爆破方式1

拖进OD,运行一下,智能搜索,找到“注册码与用户不匹配”,点击查看

 

 在已注册前,实现了跳转,跟之前一样,直接用NOP填充(这是一种爆破方式)

爆破方式2

追踪注册码,跟前面的例子一样

拖进OD,运行一下,智能搜索找到“注册码与用户不匹配”,点击查看

离跳转最近的那个(E8 460E0000)关键call,不可能被实现,它会被跳转

所以往上面找另一个关键call,在(E8 A9FDFFFF)关键call下一个断点,然后运行注册

 经过做出一系列对比,在堆栈窗口出现了注册码

 

 三.更改软件标题

把这个标题改成自己想要的标题

把程序拖进OD,右键——>查找——>二进制字串

输入程序标题“真正零基础破解课程”,然后选中

 按空格,然后删除原有ASCII码,输入自己想要的名字,字数不够空格来凑

想要永久保存修改的内容,就再次选中修改的部分,右键——>复制到可执行文件

再右键——保存文件

四.手动脱壳与脚本脱壳

脱壳就找oep入口

        OEP,程序的入口点,软件加壳就是隐藏了OEP(或者用了假的OEP),只要我们能找到

        程序真正的OEP,就可以立刻脱壳。

        PUSHAD(压栈)代表程序的入口点。

        POPAD(出栈)代表程序的出口点,与PUSHAD相对应,一般找到这个,OEP就在附近

1.手动脱壳

 把程序拖到OD,主要看寄存器,按F8(或者按“下一步”按钮)

发现只有ESP是红色字体

点击,然后 右键——>HW break[ESP],再运行一下

 再按F8,发现在6A00  39C4 75FA来回跳,不进行到下一步去

点击83EC80,右键——>断点——>运行到选定位置,再按F8,就已经脱壳成功了

(不同OEP都是有一定特征的)

 保存,右键——用0llyDump脱壳调试进程(点击脱壳)

2.脚本脱壳

将程序拖入OD

选项——>调试设置——>异常(全部勾选),这样就可以使用脚本了

右键——>运行脚本 (可以自己去下载相应脚本)

按F8 ,在6A00 39C4 75FA来回跳,不往下执行

 点击83EC80,右键——>断点——>进行到选定位置,再按F8,脱壳成功

五.软件找oep与call的介绍

软件找oep 

 把程序拖进OD,运行,ctrl+j

就到了oep

 call的介绍

 call就是程序调用,当程序执行到call,会做一系列的对比,对比完就做提示

六.跳转指令jmp与nop指令

nop指令的作用:

        就是通过nop指令填充(nop指令一个字节),使指令按字对齐,从而减少取指令的内存访

        问次数。(一般用来内存地址偶数对齐,比如有一条指令,占3字节,这时候使用nop指

        令,cpu就可以从第四个字节处读取指令了。)

        比如:123456,把23给nop掉,那执行的就是1456

jmp无条件转移指令:

        功能:jmp指令将无条件地控制程序转移到目的地址去执行。

 

让程序2秒后不会关闭

智能搜索找到“再见”,点击查看,将jnz改成jmp,jmp是强制跳转,直接跳过“再见”

 不能用NOP,用NOP自动认为不是你的软件就直接关闭了

 七.弹窗破解2种方法

 去掉“提示根本没注册”这个弹窗

方法1

智能搜索,ctrl+f 搜索不到“注册”

点击运行,再按一下上栏按钮C

来到这个反汇编界面

 点开程序,点击使用说明,再点击暂停按钮(在运行按钮旁边),再点击上栏的K按钮

MessageBoxA是一个弹窗的函数

点击MessageBoxA,右键——>显式调用,在MessageBoxA下一步设置断点

 一直按F8,直到找到call(是窗口api函数)

继续F8,找一个大跳转,跳过了窗口api函数

 

先看看jmp来自00401918,这个是可以跳下去的,但是它没跳,可能下面或上面的影响,直接跳过了窗口的那个跳转。

 在00401918下面找到一个大跳转

 

 用NOP填充(爆破成功)

 方法2

点击BP

 

BP MessageBoxA窗口断点

 

运行,点击使用说明,马上就断点了

F8,一步一步往下走

八.深入注册码3种方式

 

1.爆破

拖入OD,运行,点击注册,然后点击暂停按钮,再点击按钮K

找到MessageBoxA,右键——>显式调用,在MessageBoxA下一步下断点

 然后F8,找到第一个call(是弹窗),然后找到跳过弹窗的点

看来自于哪个点

先转到je 00401346,然后下断点,点击寄存器EIP,回到转前的点

EIP指向了当前CPU运行到的指令地址。双击EIP的值,可以在CPU窗口中回到EIP指向的地址

 点击转到来自 jmp 004015CB,在它的下一步就是一个大跳转

 

 

转到004014CD,下一个断点,运行程序点注册

 

跳转未实现

想让跳转实现一下,就把标志位改成1,跳转就实现了,

然后再运行一下,什么都没有,说明je 00401346这个断点不对,取消掉

 取消掉之后,再运行点注册,跳转实现 ,让跳转不实现就把标志位改成0

 

 再运行一次,注册成功

2.找注册码

方法1

随便输入用户名和注册码,点击注册

找call,下断点,再运行软件(会显示错误)

再运行一次,点注册,注册码就出来了

方法2

按F7(或者点击单步运行按钮的左边的按钮),进入到call里

ss:[esp+0x4]的数据传到edx里,ss:[esp+0x8]的数据传到ecx里

test edx,ecx 把输入的与它自己真的注册码对比,将第二条改成mov ect,dword ptr ss:[esp+0x4]

运行,注册成功

方法3

输入用户名,和刚刚得到的注册码,但是报错了

因为这个程序写了一个反破解,它先把注册码压进去,再把用户名压进去,意思就是说用户名就是注册码,注册码就是用户名,两者对调一下

但是对调之后,还是报错,因为之前注册的时候,注册码用的77777777

 所以注册码是77777777,注册成功

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在静态方法中使用JdbcTemplate需要注意以下几点: 1. 静态方法中无法直接使用Spring容器中的Bean,因为静态方法是类级别的,而Bean是实例级别的。因此需要手动获取JdbcTemplate实例,可以通过ApplicationContext获取JdbcTemplate实例,或者通过静态变量保存JdbcTemplate实例。 2. 在使用JdbcTemplate时,需要先创建一个JdbcTemplate实例,并设置数据源。数据源可以通过Spring容器注入,或者手动创建。在静态方法中,可以通过静态变量保存JdbcTemplate实例,避免重复创建。 3. 在使用JdbcTemplate操作数据库时,需要注意线程安全问题。JdbcTemplate是线程安全的,但是需要保证JdbcTemplate实例的线程安全,即在多线程环境中需要保证同一JdbcTemplate实例不会被并发访问。 下面是一个示例代码: ``` public class JdbcUtils { private static JdbcTemplate jdbcTemplate; public static void setDataSource(DataSource dataSource) { jdbcTemplate = new JdbcTemplate(dataSource); } public static void executeSql(String sql) { jdbcTemplate.execute(sql); } } ``` 在上面的代码中,我们通过静态变量保存了JdbcTemplate实例,并提供了一个静态方法setDataSource用于设置数据源。在使用JdbcTemplate时,我们可以直接调用静态方法executeSql执行SQL语句。需要注意的是,这里的executeSql方法是线程安全的,因为JdbcTemplate实例是共享的,并且JdbcTemplate本身是线程安全的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值