分享

小甲鱼解密系列调试篇

 成已成物 2022-05-25 发布于湖南

 

目录

一点铺垫:基础知识

1.汇编语言

2.NAG窗口

3.SEH

4.断点类型

一、MessageBox.exe修改程序标题内容——修改函数传入值

二、TraceMe.exe暴力破解程序登陆界面——搜索函数、寻找附近调用取值的地方

三、reverseMe.exe暴力破解/打补丁实现注册——分析文件结构 逆向注册文件

修改跳转条件暴力破解:

注册打补丁:

四、reverseMe.exe去除NAG窗口——修改跳转条件跳过对话框,使得MessageBox失效:父句柄设为空白,修改文件PE结构入口AddressOfEntryPoint

1.修改跳转条件跳过对话框

2.使得MessageBox失效:父句柄设为空白

3.修改文件PE结构入口AddressOfEntryPoint

五、reverseMe.Oops.exe——PE文件头!

六、pixtopianbook破解功能限制——定位至引用弹出NAG窗口的地址、搜索字符串改变值

1.定位NAG窗口

2.搜索字符串改变UNREGISTERED VERSION字符串

七、pcsurgeon.exe搜索字符串找到调用

1.搜索字符串改变<>

2.查找地址常量 https://blog.csdn.net/wlswls1711/article/details/97145997


一点铺垫:基础知识

1.汇编语言

EBP:主要是用于栈和栈帧。

ESP:指向当前进程的栈空间地址。

EIP:总是指向下一条要被执行的指令。

2.NAG窗口

       nag本意是烦人的意思,nag窗口是软件设计者用来时不时提醒用户购买正版的警告窗口。一般nag在程序启动或退出的时候弹出来,或者在程序运行的某个时刻突然蹦出来吓你一跳。

3.SEH

SEH(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文件头!

不知道为什么小甲鱼不能在编译器里运行但我却可以,这里跳过,以后有机会再来看

清理下OD的UDD文件夹,不行的话试试用视频中演示的OD。

你是开了OD后从OD打开程序,我是右键程序直接用OD打开程序的 我这样没你那个提示哦 |

 

六、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

来到代码处。鼠标向上滑几行,可以看到这样的代码:

  1. mov eax,dword ptr [60ebe8]
  2. cmp byte ptr [eax],0
  3. jnz 005cc935

显然,将地址60ebe8的值送到eax里,然后将eax的值作为地址,将这个地址中的值和0比较(其实是两数相减),结果不为零就跳转,但是ds:[0060eb8c]=00610c4a
右键点击mov eax,dword ptr [60ebe8]这一行——查找参考——地址常量,将所有的都设置断点。

在这里插入图片描述

重新运行程序,来到第一个断点处,有这样的代码:

  1. mov edx,dword ptr [60ebe8]
  2. mov byte ptr [edx],al

在上面我们知道ds:[0060eb8c]=00610c4a,所以:
这两段代码执行后,ds:[00610c4a]的值就是al的值,不幸的是,我们从OD右边的寄存器中看到al=0,所以
ds:[00610c4a]=00,所以cmp byte ptr [eax],0的结果就是0,所以jnz 005cc935就不能跳转,所以。
我们直接将mov byte ptr [edx],al 改为mov byte ptr [edx],1,复制到可执行文件,保存文件就破解成功了,但是这样改会出现这样的问题:

这个软件这样改是没有问题,但比较大的软件这样改,就可能会影响程序,因为要重定位的东西很多,所以也可以这样改:
将 cmp byte ptr [eax],0改为 mov byte ptr [eax],1
将 jnz short 005c2c15 改为  jmp short 005c2c15

九、MrBills.exe——不断进入找到判断注册的地方

1.使用搜尋字串找關鍵字。

You have entered an invalid email address or license number.Please try again.

2.尝试跳过。

  • 斷點在004299B9 | 75 36 | jne mrbills.4299F1 |跳轉未實現

  • jne跳轉未實現為ZF=1,我們將其修改為ZF=0

  • F9執行程式

  • 彈出視窗顯示Thank you for registering! (感謝你註冊!)

  • 按下確定

  • 發現程式並沒有真正被註冊

  • 在此可以確認單存跳過只是修改顯示的彈出訊息內容3.

3.

  • 斷點在0040714C | 55 | push ebp |

  • F8一步一步過,並持續觀察eax的變化

    1. 0040714C | 55 | push ebp |
    2. 0040714D | 8BEC | mov ebp,esp |
    3. 0040714F | FF75 0C | push dword ptr ss:[ebp+C] |
    4. 00407152 | FF75 08 | push dword ptr ss:[ebp+8] |
    5. 00407155 | E8 77FEFFFF | call mrbills.406FD1 |
    6. 0040715A | 84C0 | test al,al |
    7. 0040715C | 59 | pop ecx |
    8. 0040715D | 59 | pop ecx |
    9. 0040715E | A2 A0765000 | mov byte ptr ds:[5076A0],al |
    10. 00407163 | 75 1B | jne mrbills.407180 |
    11. 00407165 | FF75 0C | push dword ptr ss:[ebp+C] |
    12. 00407168 | FF75 08 | push dword ptr ss:[ebp+8] |
    13. 0040716B | E8 ADFEFFFF | call mrbills.40701D |
    14. 00407170 | 84C0 | test al,al |
    15. 00407172 | 59 | pop ecx |
    16. 00407173 | 59 | pop ecx |
    17. 00407174 | A2 A0765000 | mov byte ptr ds:[5076A0],al |
    18. 00407179 | A2 A2765000 | mov byte ptr ds:[5076A2],al |
    19. 0040717E | 74 0D | je mrbills.40718D |
  • 004071550040716Bcall回傳eax的值,故這兩個需要在F7步入觀察

  • 004071550040716B設定中斷點

  • 移除其他中斷點

4.继续分析。

直接将00406FC5 | mov al,bl 改为 mov al,1 即可变为永久注册!

十、pc2am2p.exe VB语言编写的程序的特点

 

 

十一、查看调用——追根溯源

 

十二、Delphi程序编写的特点

PUSH XXX

RETN

达到 CALL XXX的效果

 

面向事件的编程语言,很多CALL指令

 

-号返回CALL处

 

十三/十四、搜索关键函数

1.查找-》所有模块间的调用

2.Alt+N 搜索

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多