API函数:
英文全称Application Programming Interface,翻译为“应用程序编程接口”。 是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
使用工具:
Ollydebug:一跨调试工具。
Stud_PE:一款查看PE头文件的工具
exeinfope:一款查编写语言的工具
TraceMe软件:一个小程序。
思路:
1、先运行程序,观察程序
2、大致判断程序的流程
3、进行调试,寻找函数调用地方
我们打开程序
程序图标
这个程序有一个主窗口,两个窗口
1、用户名,用来填写信息
2、序列号,用户填写信息
我们输入信息,点击check
提示字符数量不对
重新输入
提示序列号错误,再来一次
大致的流程我们知道
到目前为止,我们进行了小程序的运行。
大致的运行流程也知道了。
我们复制一份副本
使用exeinfope 工具
将程序副本放入
可以看到,这个程序大概率是C语言编写
我们再来使用Stud_PE工具进行查看
拖入文件副本
我们不看PE结构
我们看函数部分
我们看user32的dll库
如果有编程经验的小伙伴,可以猜测使用了哪几个函数。
下面我们通过OD工具打开文件副本
看到熟悉的文件入口点。55-8B-EC
有小伙伴会好奇,为什么OD每次打开程序都是这个位置呢?
在OD工具中的选项,选择调试选项,事件。
选择第一次暂停于:winMain(诺位置已知)
按照老规矩,我们F8跑一遍。
在一个函数来看,一般都是push/push/push/,然后call
这里我们下一个断点。F2
我们重新加载程序,进入
在这里我们看到熟悉的API函数
当运行到这里的时候,程序运行出来了
我们尝试输入信息
然而程序没有动,说明这个call完成了判断
一进来就弹出窗口,有意思
仔细看旁边的内存地址,是755DE730,是一个大的地址
说明是DLL的程序领空了
在这里看到有个test指令,上次我们学习到test指令的作用是进行标志位。
我们下一个断点
我们盲猜是进行判断(因为标志位的作用,很大是做判断使用)
未执行指令的值
执行test eax , eax之后的值
影响到Z标志位
我们赶紧查询手册,看下Z标志位和JE指令
结果为0,则转移
跳转未实现
我们将其Z标志改为1,让程序跳转
可以看到已经跑完这个条件判断。
流程往下走
在这里会有绕来绕去的逻辑
需要耐心
耐心
使用CTRL+F9可以回到DLL库调用的位置。
在第二个断点中
我们发现,至少需要20分钟分析完整个程序。
在爆破的过程中,我们需要进行下断点。
我们使用NOP来进行填充,把JE进行覆盖。
将修改后的文件进行保存
小程序爆破完成。