ReverseMe01.exe使用hiew32.exe进行修改

发布时间 2023-06-20 13:59:30作者: Auion
本次实验所针对的exe文件是ReverseMe01.exe,直接运行该文件时会弹出如下弹窗:

随后在其输入框中随意输入序列号或者直接不输入序列号则会直接弹出另一个弹窗显示“Okay,for now,mission failed”,即如下所示:

而本次实验则需要对该文件进行如下五种修改操作:
1、移去“Okay,for now,mission failed”对话框
想要移除“Okay,for now,mission failed”这个对话框则需要在汇编代码中找到其对应的汇编代码。
通过IDA对该文件进行分析可知该对话框汇编代码的起始地址为“0x40123B”,随后在Hiew中打开ReverseMe01.exe文件,进入到Code模式下,此时可以使用“F5”实现地址的跳转操作。

在该实验文件中此处所需移除的对话框所对应的汇编代码即如下所示:

此时直接运行ReverseMe01.exe文件,无论是否填写序列号,只要点击“Not Reversed”按钮则会直接弹出显示“Okay,for now,mission failed”的对话框,即如下所示:

跳转至需要修改的汇编代码的地址后,可以使用“F3”进入编辑模式,随后点击“F2”对相应地址上的汇编代码进行修改操作。

完成对汇编代码的修改后,需要先点击“ESC”返回,在确定修改无误后点击“F9”进行保存操作,修改后的代码情况如下所示:

完成上述对该对话框的修改操作后,再次运行该程序则可以实现将“Okay,for now,mission failed”对话框的移除,即此时输入序列号或是不输入序列号,只要点击按钮均不会弹出弹窗。

2、显示一个MessageBox对话框,对话框上显示用户输入的字符
借助IDA可以查看用于编辑框字符的函数为GetWindowTextA函数,随后可以查看到该函数所在地址为“0x401213”,查看其前几行汇编代码可知,其中地址“0x401211”的汇编“jmp eax”表示直接跳转,不执行“GetWindowTextA函数”,从而导致在完成第一步修改操作后不弹出显示用户输入字符的对话框,即如下图所示:

为了使得GetWindowTextA函数被执行,则需要将该汇编修改为“nop”,修改后的汇编代码如下图所示:

完成上述修改操作并完成保存操作后,再运行工该文件时,在输入框中所输入的序列号将会在点击“Not Reversed”按钮后说弹出的对话框中显示出来,即如下图所示:

3、再显示一个对话框,用于告知用户输入的序列号是正确的还是错误的(“Good Number”或“Bad Number”) 
为了实现对比所输入的序列号与所设置的序列号是否一致,则首先需要确定该文件所设置的用户序列号的字符串情况,可以在十六进制模式下查看到此时文件所设置的序列号为“SupremeDickHead”,即如下图所示:

由上图可知初始序列号的字符数为15,此时为了实现判断所输入的序列号是否正确则需要在恰当的地址处修改汇编代码,通过IDA的分析可知,需要修改的汇编代码的地址是0x401270~0x401286,即如下所示:

随后在地址0x401270处使用“F3”进入编辑模式,在点击“F2”对汇编代码进行修改,修改结果如下所示:

所修改汇编代码的含义
1. “cmp ecx, 00000000F”:把ecx寄存器中的值与0F(十进制的15)进行比较,即判断所输入的序列号的字符数是否为15个。
2. “jnz short .0004012CD”:如果比较结果不为零,则跳转到地址004012CD处运行指令(弹出序列号错误的对话框),否则继续执行下一条指令。
3. “mov edx, 00403000”:把00403000这个地址值赋给edx寄存器,该地址存储了字符串“SupremeDickHead”。
4. “mov bl, [eax]”:将eax寄存器中地址所示的内存位置的第一个字节(也就是eax寄存器所指向的字符)移动到bl寄存器中。
5. “mov bh, [edx]”:将edx寄存器中地址所示的内存位置的第一个字节(也就是“SupremeDickHead”字符串的第一个字符)移动到bh寄存器中。
6. “cmp bl, bh”:对bl和bh中的字节进行比较,以检查它们是否匹配。
7. “jnz .0004012CD”:如果比较结果不为零,则跳转到地址004012CD处运行指令(弹出序列号错误的对话框),否则继续执行下一条指令。
8. “inc eax”:将eax寄存器加1,指向下一个字符。
9. “inc edx”:将edx寄存器加1,指向“SupremeDickHead”字符串的下一个字符。
10. “dec ecx”:将ecx寄存器减1,表示还需要比较的字符数量。
11. “je .0004012B8”:如果ecx的值为零(也就是所有字符比较完成),则跳转到地址004012B8处运行指令(表示所输入的序列正确),否则继续执行下一条指令。
12. “jmps .00040127A”:跳转回第4条指令,以便进行下一个字符的比较。
完成上述修改操作后,直接运行该程序并随意输入一个与正确序列号不同的序列号(此处以“SupremeDick”为例),此时运行情况如下所示:

随后点击确定则会关闭显示显示序列号的对话框,再重新弹出一个显示所输入序列号是否正确的对话框,此时由于所输入的序列号与所设置的序列号不一致,所以显示“Bad Number”,即如下所示:

运行该程序后输入正确的序列号“SupremeDickHead”后点击按键“Not Reversed”会弹出弹窗“ReverseMe #1”显示所输入的序列号,即如下所示:

在弹窗“ReverseMe #1”中点击“确定”按键后该弹窗将会消失并重新弹出一个新“ReverseMe #1”对话框,显示判断结果,此时的判断结果为正确,即如下图所示:

4、将按钮标题由“Not Reversed”改为“* Reversed *” 
要实现将初始弹窗的按键修改为了“* Reversed *”则需要在十六进制数模式下找到按键所对应的十六进制数,初始时,按键字符“Not Reversed”所对应的十六进制数情况如下所示:

经过修改操作后,此时按键对应的十六进制数情况如下所示:

完成上述修改操作并保存后,重新运行文件则会发现初始弹窗的按键已经修改为了“* Reversed *”,即如下图所示:

5使序列号为“每位同学姓名拼音”
要将该文件的序列号修改为自身的姓名全拼,则需要确定自身姓名全拼“NingJianHao”的字符串,随后则需要找到原序列号所在地址,查看其情况,即如下图所示:

随后则需要将新序列号字符转换成ASCII码所对应的十六进制数,即“4E 69 6E 67 4A 69 61 6E 48 61 6F”,修改后的序列号情况如下所示:

最后,由于序列号的改变导致序列号的字符数发生改变,因此,为了实现对此事序列号输入是否正确则需要对判断汇编代码进行修改,未修改前汇编代码情况如下图所示:

修改完成后汇编代码如下所示(只是将字符数从15设置成了11):

完成上述修改并实现保存操作后运行该文件,再在输入框输入新序列号“NingJianHao”(自身姓名全拼),点击“* Reversed *”机会弹出显示序列号的弹窗“ReverseMe #1”,即如下图所示:

点击弹窗“ReverseMe #1”的“确定”按键后则显示序列号的弹窗“ReverseMe #1”将消失,与此同时将会出现一个新的“ReverseMe #1”显示判断序列号输入是否正确的弹窗,即如下图所示: