目录 一、MessageBox.exe修改程序标题内容——修改函数传入值 二、TraceMe.exe暴力破解程序登陆界面——搜索函数、寻找附近调用取值的地方 三、reverseMe.exe暴力破解/打补丁实现注册——分析文件结构 逆向注册文件 四、reverseMe.exe去除NAG窗口——修改跳转条件跳过对话框,使得MessageBox失效:父句柄设为空白,修改文件PE结构入口AddressOfEntryPoint 3.修改文件PE结构入口AddressOfEntryPoint 六、pixtopianbook破解功能限制——定位至引用弹出NAG窗口的地址、搜索字符串改变值 2.搜索字符串改变UNREGISTERED VERSION字符串 2.查找地址常量 https://blog.csdn.net/wlswls1711/article/details/97145997 一点铺垫:基础知识1.汇编语言EBP:主要是用于栈和栈帧。 ESP:指向当前进程的栈空间地址。 EIP:总是指向下一条要被执行的指令。 2.NAG窗口nag本意是烦人的意思,nag窗口是软件设计者用来时不时提醒用户购买正版的警告窗口。一般nag在程序启动或退出的时候弹出来,或者在程序运行的某个时刻突然蹦出来吓你一跳。 3.SEHSEH(Structured Exception Handling),即结构化异常处理。 SEH是Windows操作系统提供的功能,跟开发工具无关。 Windows程序设计中最重要的理念就是消息传递,事件驱动。 当GUI应用程序触发一个消息时,系统将把该消息放入消息队列,然后去查找并调用窗体的消息处理函数(CALLBACK),传递的参数当然就是这个消息。 我们同样可以把异常也当作是一种消息,应用程序发生异常时就触发了该消息并告知系统。 系统接收后同样会找它的“回调函数”,也就是我们的异常处理例程。 当然,如果我们在程序中没有做异常处理的话,系统也不会置之不理,它将弹出我们常见的应用程序错误框,然后结束该程序。 所以,当我们改变思维方式,以CALLBACK 的思想来看待SEH,SEH 将不再神秘。 4.断点类型软件断点只能断点程序领空,不能断点动态链接库,如果需要断点动态链接库,就需要用到硬件断点。 一、MessageBox.exe修改程序标题内容——修改函数传入值int WINAPI MessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType); 1.找到MessageBox的传入值 2.修改传入的lpText值 二、TraceMe.exe暴力破解程序登陆界面——搜索函数、寻找附近调用取值的地方(1)使用OD加载程序,搜索分别搜索GetDlgItemTextA、GetDlgItemTextW、GetWindowTextA、GetWindowTextW,搜索到的都下断点。 (2)运行程序,在程序弹出对话框时,输入用户名和系列号,然后按F8单步,在消息窗口观察哪条语句有我们刚刚输入的用户名和系列号。如下图: (3)找到后,就在这条语句的附件会有校验和跳转(那个test就是效验,je就是跳转),我们可以修改效验结果,或者直接NOP掉跳转。(我这里直接NOP掉了跳转) 三、reverseMe.exe暴力破解/打补丁实现注册——分析文件结构 逆向注册文件首先分析代码结构: 修改跳转条件暴力破解:直接将弹出还未注册的窗口判断语句(je,jle,jnz等)更改为nop(不希望它执行)或jmp(希望它执行),即可实现。 注册打补丁:确认程序的逻辑结构。 下了断点的是程序的大致算法模块。 四、reverseMe.exe去除NAG窗口——修改跳转条件跳过对话框,使得MessageBox失效:父句柄设为空白,修改文件PE结构入口AddressOfEntryPoint定位NAG窗口 1.修改跳转条件跳过对话框(2)把程序跑一遍之后我们发现程序有两个NAG,一个是在程序界面启动前出现,另一个是在程序关闭后出现的。如图所示(红框里的),运行这两个call后都会弹出NAG窗口,所以我们判断NAG窗口就在这里面。如第三讲,可以把这两个call给NOP掉或者在call前面使je跳转实现,还有在call前面添加一个jmp跳转跳过这NAG窗口的call。 2.使得MessageBox失效:父句柄设为空白我们看到NAG窗口它的父窗口是0(也就是没有父窗口),那么我们就可以创造一个不存在的父窗口给NAG窗口。比如为NAG窗口添加一个句柄为1的父窗口,本来句柄1的父窗口就不存在(也就是相当于关闭了),那么NAG窗口也就不存在了,那么我们就达到了去除NAG窗口目的。 3.修改文件PE结构入口AddressOfEntryPoint(1)把程序载入OD,可以看到AddressOfEntryPoint(入口地址)为00401000,但是我们程序的真正内容是在:00401024.前面的是我们要去掉的去除NAG窗口,那么我们如果把程序入口改为:00401024 就完美的去掉了第一个NAG窗口了。 (2)说干就干,点击快捷栏的“m”键,在弹出窗口中双击PE 文件头,我们就来到内存中文件头的位置了。在这个窗口中,第一栏为地址,第二栏为地址上的二进制数据,第三栏为方便人类阅读的代码(因为内存中的二进制数据是高地址放后面,底地址放前面,阅读很不方便),第四栏为注释。 (3)找到真正的PE头的偏移地址(000000C0),如图: (4)根据偏移地址找到真正的PE头(004000C0,PE头会以ASCII的"PE"开头,也就是50 45),然后就找到程序的入口地址(AddressOfEntryPoint) (5)根据(4)中得到的程序入口地址在内存中的地址(004000E8),那么我们就可以修改入口地址为00401024啦。在数据窗口按Ctrl+G输入004000E8,修改之: (6)保存修改程序,重新载入OD发现入口地址成功改为00401024了: 五、reverseMe.Oops.exe——PE文件头!不知道为什么小甲鱼不能在编译器里运行但我却可以,这里跳过,以后有机会再来看
六、pixtopianbook破解功能限制——定位至引用弹出NAG窗口的地址、搜索字符串改变值1.定位NAG窗口(1)在OD运行弹出的软件界面试图添加第5个人,出现错误提示box,如下图 (2)此时在OD中按下暂停(暂停后OD中的地址跳至动态链接库,即系统领空处),然后按ALT+F9返回到用户,在用户界面点击确定后,OD中就返回到程序接管,地址跳转到下图的位置: (3)图中的MessageBoxA就应该是刚才的错误提示框了,F8到retn,返回到函数(函数调用之后碰到ret返回),如下图: 注意:ret返回后,在上方又有一个call,说明在此处是间接地调用messagebox。 2.搜索字符串改变UNREGISTERED VERSION字符串接下来将几处”unregistered version”字符查找并修改: 方法1:查找所有参考文本字串→查找文本“unregistered version”→跟随到代码处,找到在内存中的地址→在数据窗口中修改保存。 方法2:直接点击Memory→Ctrl+B查找→修改后记住字符串在内存中的地址,到OD的数据窗口保存。【建议用这种方法】 注意:修改时记得【保持大小】,不然会出错。 七、VisualSite Designer——定位、硬件断点1.次数耗尽之前——定位修改跳转条件一路F8,遇到弹窗就在此处F2下断,然后重新载入,F9运行到断点处,消除断点,继续执行。 F8,出现弹窗,计数减一完成,点击进入程序发现程序执行下一条语句 所以该函数的作用是显示欢迎界面,计数器减一并返回eax==1, 此时我们修改该指令 保存修改,运行,发现已经没有次数限制 2.次数耗尽之后——标志找不同我们用OD载入观察所有的条件跳转语句,并标志出跳转结果,等到次数耗尽之后观察跳转结果与是否发生改变,找到关键跳转点nop。 八、pcsurgeon.exe——搜索字符串找到调用1.搜索字符串改变<UNREGISTER我们要从红笔圈出的地方入手。将软件载入OllyDBG,在代码界面右键——查找——所有参考文本字串,在第一行右键——查找文本,查找一部分比如“<unregistered”, 找到后双击进入代码的位置,可以看到代码的上方有两个jnz跳转,未注册过的源代码是不会跳转的,将这个jnz改为jmp,右键——复制到可执行文件——右键——保存文件为pcsurgeon1.exe,这样NAG窗口就去掉了 2.查找地址常量 https://blog.csdn.net/wlswls1711/article/details/97145997来到代码处。鼠标向上滑几行,可以看到这样的代码:
重新运行程序,来到第一个断点处,有这样的代码:
在上面我们知道ds:[0060eb8c]=00610c4a,所以: 这个软件这样改是没有问题,但比较大的软件这样改,就可能会影响程序,因为要重定位的东西很多,所以也可以这样改: 九、MrBills.exe——不断进入找到判断注册的地方1.使用搜尋字串找關鍵字。
2.尝试跳过。
3.
4.继续分析。 直接将00406FC5 | mov al,bl 改为 mov al,1 即可变为永久注册! 十、pc2am2p.exe VB语言编写的程序的特点
十一、查看调用——追根溯源
十二、Delphi程序编写的特点 PUSH XXX RETN 达到 CALL XXX的效果
面向事件的编程语言,很多CALL指令
-号返回CALL处
十三/十四、搜索关键函数 1.查找-》所有模块间的调用 2.Alt+N 搜索 |
|