banner
lca

lca

真正的不自由,是在自己的心中设下牢笼。

《从零开始学IDA逆向》学习笔记-8(静态逆向分析入门)

image

一般来说,逆向分析并不是对那些庞大的程序进行完整的逆向,只是分析特定位置的一个或几个函数。

1、程序加载详解#

打开菜单上的 VIEW-OPEN SUBVIEW-SEGMENTS,可以看到已经自动加载的程序区块。

image

image

在区段的名称(NAME)一列后面,是区段起始(START)终点(END)的地址。
RWX 这一列显示初始状态下这个区段是否有读READ(R)、写WRITE(W)以及执行EXECUTION(X)权限。
后面的DL两列分别对应于DEBUGGER(调试器)LOADER(加载器)
第一列 (D) 为空,只有程序在调试模式时才会填充已经加载的区段,L 这一列显示了加载器创建的区段,其他列的内容不是那么重要。

2、查看关键字符串#

尝试打开 exe 程序

image

在 help-register 处可输入 name 和 serial。

image

随意输入字符,提示 No luck there,mate!

image

查看字符串,快捷键 shift + F12。

image

可以看到和程序一样的提示。

image

双击上图中的字符,跳转到如下位置

image

在 0x00402169 地址上保存了这条字符串,在该地址上按D键可以查看具体的字节。

image

image

再一次按 A 键可以恢复显示字符串,按 X 键更好的显示右边的引用。

image

3、查找关键函数#

上图中,有两个不同的函数引用了这条字符串。一个是sub_401362,另一个是sub_40137E

之所以是两个不同的函数,因为 IDA 显示引用都是 functions + XXXX 这种方式,如果他们属于同一个函数,那么只有 XXXX 这个值会改变,而前面的部分不变,但是 sub_后的地址是不一样的。

image

sub_401362

image

sub_40137E

目前已经找到所有显示注册不成功信息的位置。

回到sub_401362函数,如图所示,这里调用了 messagebox API 函数来显示 NO LUCK THERE MATE 这样的消息。这个 API 函数接收 NO LUCK 字符串作为窗口标题,NO LUCK THERE MATE 字符串作为显示的文本。

sub_40137E也一样,意味着在两个地方都会触发注册不成功的消息。有可能是处理不同的信息。如果要显示注册成功的消息,这两处都要绕开。

接下来按 X 键查看程序对sub_401362函数的引用如下图所示,只有一处引用。

image

转到这个引用之前,重命名一下sub_401362 函数,比如说 CARTEL_ERROR。在函数地址上按N键,然后填写这个新的名字。

image

来到引用了 CARTEL_ERROR 函数处

image

在调用 CARTEL_ERROR 函数之前又一个 jz 跳转,为了区分成功 / 失败的代码块,可以给这些代码块加上颜色),点击代码块右上角颜色选择器,如下图所示。

image

续在 0x40124c 处按回车键,进入被调用的函数 0x40134d。

image

image

0x40134D 函数

image

0x40134D 函数改成 CARTEL_BUENO 名称。

将引用他们的代码块变成绿色。

image

4、标记指令位置#

继续来到 0x401243 代码处的 jz 命令,打开菜单 JUMP-MARK POSITION(快捷键 alt + m),将其命名位 DECISION_FINAL,之后就能轻松回到这个位置。

image

image

打开菜单 Jump-Jump to marked position。

image

就可以轻松跳转到对应的位置。

image

5、修改指令#

按照之前的分析,如果把 0x401243 处的 JZ 改成 JNZ,那么输入一个非法密码的时候,程序也会执行注册成功这条路径。

注:keypatch

由于 7.6 版本没有 keypatch 这个插件,尝试安装也没能安装上,所以换了个 ida 7.7 的绿色汉化版。

当前指令处右键,选择keypatch-patch(快捷键:ctrl + alt + k)。

image

打开如下窗口:

image

修改内容如下:

image

修改后,点击 patch,返回如下内容,后面的注释告诉你修改了内容。

image

再一次右键点击patching-apply patch to...,保存修改后的内容

image

保存为 exe 文件。

image

运行 crackme.exe 程序,随意输入内容,一共弹出两个窗口,一个成功提示,一个失败提示。

image

image

综上,需要修改两处的内容,才能绕过注册。

image

如上图所示,这里显示了另一处注册失败的消息,同时红色代码块上方有一个 cmp 指令,比较用户输入的用户名的字符是否小于 0x41,也就是字符 A。如果小于 0x41,则提示注册失败。

之前运行 crackme.exe 注册时,输入的时 111(0=30,1=31),显然小于 0x41,所以当程序检测到包含数字的时候,就显示注册失败。这里就不能把 jb 改成 jnb 了,不然输入字符又会报错了。

image

上图中的虚线,显示了程序将跳转到这里就报错,所以如果将跳转指令改成 nop,程序就不会跳转了,而是继续执行下一条指令,而不执行这里的报错。

切回图形化显示。

image

image

修改后整体界面混乱。

image

上图可以看到修改后的 nop 字节,报错信息也被孤立了。

重新保存修改后的文件。

测试完成后,支持任意字符输入了。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。