易语言信息框+基础破解+写call
本帖最后由 千里冰封 于 2016-12-14 21:21 编辑第一步:易语言写程序
双击“按钮”添加如下代码
然后点击菜单【编译】--->保存 (注:我保存的文件名为:33.exe)
打开程序,运行一下
程序运行正常,只有输入“qianlibingfeng” 才会弹出信息框“注册成功”, 否则提示“注册失败”。
第二步,OD逆向----(输入错误依然提示“注册成功”)
技术源于 Shark恒
打开OD,点击菜单【文件】-->【打开】---打开33.exe (注:OD载入编写的程序)
打开之后,程序自动停到了这里,然后按F9(或者点击箭头所指的“▶”这个符号 或者 点菜单 【调试】--【运行】),让程序运行。
我们在编写的程序里,随便输入几个字符,提示“注册失败”
此时,我们按F12(或者点击“││”),让程序暂停
然后我们点击箭头所指的K,或者按Alt+K,或者点击菜单【查看】--【调用堆栈(zhàn)】我们发现,里面有提示“注册失败”的信息。
MessageBoxA差翻译可知MessageBox是信息框的意思。
调用来自=krnln.10068337 这是程序领空。标志:krnln
调用来自=user32.77D9EAC9这是系统领空。标志:user32
在箭头所指的那一行,右击,选择【显示调用】
此时程序来到了,箭头所指的位置,我们按F2(或者右击选择【断点】--【切换】),下断点。
下好断点之后,让程序运行起来(按F9),当我们再次输入字符,点“按钮”后,程序会暂停在我们下断的位置。
此时,我们按一次F8(单步步过)---- (多谢Shy大神的指正)注:按F8可以让程序去执行一行代码,但是不进入call的内部。
我们发现,我们断下位置的call,作用就是调用 信息框
我们点击确定,此时程序又处于暂停状态了 (注:只有暂停状态,才能一步一步按F8进行跟踪调试)
接下来我们可以一次次的按F8,直到返回上一层call调用。
或者点击菜单【调试】--【执行到返回】,这里我们选择此步骤
运行这个菜单后,程序到了这一步,我们按F8,执行这行代码。
【在这里提示一下:call 就是调用的意思,call是可以嵌套的。比如,call 子程序1 ,而子程序1里面又进行了call 子程序2 。当子程序2运行结束后,就要返回到子程序1 ,继续执行里面的代码,子程序1执行完毕后,就返回到 call 子程序1 下面的代码,继续执行。】
仔细看来到的位置,1002CDDE 多么熟悉的身影,就是刚才堆栈区的提示的,【返回到****】的位置
但是这里并不是关键call ,因为没有关键跳。更重要的是,没有代码区的,注释栏里面,没有找到“注册成功”,“注册失败”这样的提示文字。
这里不是关键位置,那么我们继续返回,上一层的call 调用(按F8一步步直到返回,或者点击菜单【调试】--【执行到返回】然后再按一次F8,返回到上一层。提示:执行到retn这行代码的时候,堆栈区,都会提示返回到的位置)
看图不多说,继续按F8,回到上一层call。返回之后我们找到堆栈区提示的2个地址
这次理解堆栈区那句【返回到***来自***】的意思了吗?{:5_117:}
这次我们找到了提示“注册成功”“注册失败”的代码了。那么接下来,我们做3件事
第一件事,爆破
我们发现提示“注册成功”的代码在提示“注册失败”之前,按着电脑的逻辑,应该是先执行前面的代码,后执行后面的代码。那么,为什么没有执行前面的代码,直接提示了“注册失败”呢?答案只有一个,“注册成功”被跳过去了,么有执行,那我就要找到这个跳转,让它不去跳。
我们在提示“注册失败”这里下一个断点(选中这一行代码,按F2)
让程序运行(F9)起来,然后再次输入错误字符,程序就会断到,我这次下断点的地方。
程序果然,在我们下断点的位置,暂停下来了。说明我们找的位置是对的,如果找错了,那么就不会在我们下断点的位置暂停下来。(此时我们第一次下断点的位置,已经可以取消了。)
取消断点如图:
言归正传,我们继续找,是那一句代码跳过了“注册成功”
看图,我们发现,原来是这个 je 33.004094C1 代码 在作祟,导致了跳过“注册成功”(注:je 是条件跳转--意思是结果为0则跳转,jmp是无条件跳转。条件跳转有很多,这里不一一举例,遇到再说,大家可以去网上搜。)(注释:OD中红色箭头线,代表跳转成立。)
现在我们找到了罪魁祸首,那就好办了,直接把这行代码给nop掉,就行了。
在这行代码上,右击---【二进制】---【用Nop填充】
好了,保存吧,保存流程如下:①选中修改的代码(可以多选,不要少选),右击--【复制到可执行文件】--【选择】
在弹出的心对话框中直接 右击,选择【保存文件】
ok 了,现在运行一下,这个新保存的程序,是不是,随便输入什么字符都能提示“注册成功”了{:5_116:}
现在我们要做第二件事,找到真正的字符串“qianlibingfeng”
刚才我们找到的je跳过了“注册成功”我们把它叫做关键跳
而关键跳上面一般就是关键call(95%的关键call是不会被跳过去的)所以箭头所指的call才是关键call
这个关键call做了什么事情呢,它真的是关键call吗,如果是关键call,那就必然会被执行,我们可以在这个call的位置下断(F2)
(F9)让程序运行起来,然后输入错误字符,点击“按钮”
我们发现,果然断在了关键call这里。那我们按F8,一步步跟踪看看
好了,废话不多说,其实我们早就找到了正常的字符串,多跟踪,多观察,更加确定了我们找到的字符串的正确性,也培养,认真的习惯。
接下来做最后一件事,写call。
0040942E 55 push ebp
我们看这一行代码,机器语言55 对应汇编语言 push ebp,这一般就是call [***],这个 [***] 的程序的入口.它的作用,也是非常有用的。以后再讲。现在我们还是老规矩,返回到这个子程序的上一层call调用。
怎么返回到上一层,小伙伴们,开动脑筋,我在上一层等你们呦{:5_121:}
我们来到上一层,找到了上一层的call
1002CE5B FF55 FC call dword ptr ss: ; 33.0040942E
我们在这个call上下个断点,然后运行程序,再次输入错误字符,点击“按钮”
程序果然断在了这里。
我们发出,call调用的是0040942E这个地址的程序,那我们在用易语言写call之前,可以用call测试工具,测试一下。
测试工具大家可以去百度搜,或者下载我提供的。
我们发现,测试成功了,不用点源程序的“按钮”,依然可以起到和点击“按钮”一样的作用。
当然写call不仅仅是为了这样哟。我这里只是抛砖引玉。{:5_122:}
好了,我们开始用易语言写call
新建一个程序,添加一个按钮控件,然后双击这个按钮,开始写代码
因为我们要用到汇编,所以开始写之前,需要添加一个汇编模块,这里我用 的清风汇编模块,还需要获取程序进程,我 用了FZ海的模块
易语言代码编写如图。解释如图。不明白的可以问我。
写好之后,调试运行一下。
先打开原程序,然后点易语言菜单【运行】--【运行】
ok,一切正常。编译即可。不在赘述。
结尾在加一条提示:在OD中,retn代表返回,同时代表,这是一个无参call。retn 4 表示有1个参数,retn 8代表有2个参数 。retn 10代表有几个参数呢?小伙伴呢,想一想? 提示:retn后面的数是16进制。
答案:**** Hidden Message *****
补充内容 (2017-2-5 14:30):
关于retn n 代表几个参数的问题,其实retn n的本质只是在进行堆栈平衡并返回到调用语句的下一行代码,add esp,n 也是一种堆栈平衡的方法。逆向之路要走的更远,可以看看罗云杉写的Windows 32位汇编语言程序设计。 真不错,讲的很细致。我相信肯定会帮助很多人~ 精华走一波。建议对最后易语言汇编部分再稍稍讲解一下,有点一笔带过了。(模块中用到的函数){:5_121:} 另建议写源码,不建议写模块,增强一下自身的E水平,,你这样调用大量模块的话会使程序运行速度变慢和体积增大,,坐等源码级写法 Shark恒 发表于 2016-12-13 23:40
真不错,讲的很细致。我相信肯定会帮助很多人~ 精华走一波。建议对最后易语言汇编部分再稍稍讲解一下,有点 ...
谢谢恒大的支持,易语言我也是初步,努力学习一下,后期用源代码写出来,尽量不用模块{:5_116:} Shy 发表于 2016-12-14 00:17
另建议写源码,不建议写模块,增强一下自身的E水平,,你这样调用大量模块的话会使程序运行速度变慢和体积增大 ...
谢谢Shy大的支持,努力向不用模块的目标前进{:5_123:} 千里冰封 发表于 2016-12-14 10:58
谢谢Shy大的支持,努力向不用模块的目标前进
吾爱汇编论坛的学习氛围还是不错的吧{:5_121:} mark一下,再详看 讲的不错谢谢分享 千里冰封 发表于 2016-12-14 10:58
谢谢Shy大的支持,努力向不用模块的目标前进
不过还是问一下 retn 4表示有1个参数是为什么?4在16进制和10进制中也是4啊?那么原则上来说是有4个参的,怎么到你这有只有1个了? 讲的很详细啊