软件破解笔记
nop破解法
打开软件弹出登录窗口输入正确账号密码进入系统,输入错误账号密码提示“用户密码错误还有3次机会”输入错三次后会自动退出软件。记住关键字“密码错误”用于找到字符串。
把需要破解软件导入od,在反汇编窗口右键—中文引擎搜索—智能搜索,搜索完成之后点击右键选择find(ctrl+f)搜索字符串,输入”密码错误“进行查找。找到对应的提示密码错误的信息,双击查看反汇编代码。
右箭头”<“代表有一个跳转来到这里,输入错误的账号密码程序会跳转到账号密码错误的提示信息代码行无法进入软件。在跳转红线第一行jnz这一行右键—断点—切换(F2)设置断点,F9运行程序,这时程序会暂停在下断点的这一行,软件窗口不在显示剩余几次机会。
在跳转线第一行jnz这一行修改代码,右键—二进制—用nop填充,把jnz改成了nop,F8单步下来,程序没有跳转,往下执行又有一个跳转,这次跳转叫jmp,跳过了密码错误的代码部分,进入软件。
保存修改的软件,左键选中我们修改过的部分,在右键—复制到可执行文件—选择。 会新弹出一个窗口,右键选择保存文件。
搜索:在搜索时不推荐把所有字符输入进行查找,输入错误,标点符号不准确,或者字符串不在同一行都会搜索不到。当程序内字符串比较多时,搜索时间会比较长
断点:断点就是将程序暂停在下断点的这一行,设置断点成功地址栏会变为红色,当跳转线为红色时跳转成立,灰色时跳转失败。
NOP填充:nop就是空指令,当计算机执行到nop指令时,什么都不执行直接走过去。
保存时注意可以多选择没修改的代码也不要少选。保存也可以使用所有修改,所有修改在修改位置比较多的时候使用。
jmp破解法
je跳转可以通过修改寄存器中的标志位来测试破解是否成功。寄存器中修改之后都不能保存修改,只有修改汇编窗口中的代码才能保存修改的代码,因此修改寄存器只能作为测试使用。
标志位有八个为C,P,A,Z,S,T,D,O 。Z标志位如果是1的话je跳转就会实现,如果是0的话je跳转就会失效。
通过编辑代码来实现跳转,选中je跳转这一行代码,按空格编辑这一行代码,把je改成jmp。修改完jmp还需要再X前面加个0,这表示16进制数。或者把x删除。
je跳转是通过寄存器中的Z标志位是1还是0判断是否跳转
je是条件跳转,判断密码是否正确来选择是否跳转
jmp是无条件跳转,不判断是否正确来选择是否跳转无条件直接跳转
壳内寻找注册码
打开需要破解软件记住输入的用户名随便输入注册码提示重新打开程序验证,重新打开没有任何变动程序提取了输入的用户名和假码进行判定结果为假。
导入OD,F9运行程序,ctrl+j打开跟随表达式输入40100,来到40100处右键-中文搜索-智能搜索,ctrl+f搜索未购买用户,双击进入汇编窗口向上查找跳转,找跳转同时找到注册表项(software\engydt)在这里下断点。
重新运行程序,点击工具栏插件-API断点设置工具-常用断点-常用断点-取初始化断点-确定。F9运行程序,已经在程序初始化的时候断下来了。
点击工具栏B 查看当前下的断点,查看在注册表项下的断点是否已经解码,为解码F9运行程序解码。可以看到注册表项断点状态为已禁止,右键已禁止-激活。在把初始化断点设置为禁止。
F9运行程序,当程序去注册表提取用户名和假码时候,他断了下来,点击F8一步一步查看寄存器窗口,可以看到输入提取的假码,继续一步一步查看,看到可疑的字符串不是自己输入的,都复制下来粘贴到记事本。
有可能会在寄存器窗口看到输入假码和真码对比,没有看见就把找到的可疑的字符串粘贴到输入注册码栏中一个一个试
重新启动程序验证注册码这属于重启验证方式
不是所有程序都能到40100处解码,百分之90程序在
输入40100出现对话框可能会出现已解码的对话框,右键-分析-删除分析
程序在重启验证时访问了注册表项提取了输入的用户名和假码,判断是错误所以注册失败
API断点是让程序初始化的时候就停下来,也就是在提取用户名与假码之前断下来
工具栏B显示当前下的所有断点
已解码(mov edx engyd) 未解码( add byte XXXXX)
因为是带壳破解会把设置的断点禁用
EAX决定胜负
使用PEOID查壳,发现这个程序没有壳。
打开软件,需要输入注册名,注册码,输入记得住的注册名和有规律的假码。点击注册,提示注册失败。
导入OD,查找字符串,输入关键字“注册”。查找到注册成功的信息,双击查看代码。在注册成功上面找到关键跳,在关键跳上1到3行找到关键call,在关键call下断。
F9运行程序,再次输入注册名和注册码,程序断在关键call,可以看见寄存器窗口有输入的假码,F8向下到test,能看见寄存器窗口EAX的al是00,ECX的al是01,所以下面je跳过了成功。就是因为call计算出的结果给了EAX中的al,才注册失败。
删除断点。点击关键call,F7进入call内部,在第一行按空格汇编第一行代码,输入mav eax,1 第二行改成retn 第三行使用nop填充
保存修改call中的代码
Borland Delphi不是壳,是一种编译语言
关键跳je是,他要是不跳可能是失败或者成功,如果他要是跳了可能是失败或者成功。这个跳转取决于这个软件是注册版还是为注册版,是一个关键的跳转
关键call,通常关键跳上面 1到3个call,就会出现关键call。关键call的作用是计算或者对比。他直接影响了关键跳,关键跳je跳不跳转是听关键cool的指令
关键call是影响跳与不跳的关键
test al,al 是比较上面call的返回值。test是比较命令,al,al是比较的值,所以这个命令是对比寄存器中eax和ecx最后的两位数来决定是否成功
寄存器中EAX就是00000000,AX就是EAX中的后四个0,后四个0又可以分为ah,al
F7进入这行代码里面
mav eax,1 意思是把1给eax。刚刚输入假码,call计算出来注册码错误,eax返回0和ecx中1对比失败,所以注册失败。直接把关键call里面代码直接改成把call返回给eax的值为1就会注册成功。
retn 意思是让程序退出这个call
脱壳
OD自带ASP定律脱壳
使用PEID查壳,发现是APSPack
导入OD,看见反汇编窗口第一行是Pushad,基本上就是ASP的壳,F8运行看寄存器只有ESP是否是红色其他的都是白色,右键-在数据窗口中跟随,在HEX数据下面从第一行第一个选中选中下面全部字符,右键-断点-硬件访问-Dword,F9运行到断点位置,按F8单步运行直到反汇编窗口变成OEP数据,右键-分析-从模块中删除分析
在工具栏调试-硬件断点-删除1断点,在反汇编窗口右键-用ollydump脱壳-脱壳-保存。在用olldump脱壳一遍,在按脱壳之前把重建输入表不选择在脱壳。保存两个
在使用PEID查壳可以看见是C++语言编译,说明脱壳成功,不脱壳是看不到编译语言
硬件访问三个选择其他的都可以,只是访问字符多少 Byte访问一个,Word访问两个,Dword访问四个
在工具栏调试-硬件断点里面可以查看选中多少字符和位置
有的程序是重建输入表才能打开,有的程序是不重建输入表才能打开。所以要保存两个
VMP壳内爆破
使用PEID查壳,EP段显示vmp,说明是vmp的强壳
导入OD,运行程序,查找表达式401000到解码段,打开程序输入假的注册码,跳出窗口显示注册失败,获得相关字符串作为破解的突破口。
中文引擎搜索,搜索注册失败关键字。按B或N查找下一行关键字。双击到达,寻找关键跳。
找到je关键跳,下断点, 运行程序输入假码程序断在点击注册。
不能让他跳过注册成功代码段,使用Nop填充je关键跳。返回程序显示注册成功,破解完成
在关闭打开程序查看是否为重启验证,再次打开显示已经注册成功,说明不是,不用在od保存
vmp壳:vmp壳主要是在关键代码段加密,让反汇编代码乱七八糟
VMP壳内寻找注册码
打开程序输入假码,让重新打开验证,属于重启验证。
PEID查壳是vmp壳
导入DO,下API断点,使用ReadFile断点。程序断在读取文件代码段,然后 查找表达式输入401000,搜索找到“你的软件还没注册”双击到代码段,找到跳过错误的注册代码,双击在关键跳下断点。
删除API断点,运行程序,程序断在关键跳。注意右下方堆栈窗口,对应的注册码已经出来,复制下来填写到程序。重新打开验证,注册成功
在程序文件夹中有一个INI配置文件,这个程序是读取这个文件作为验证,里面储存刚刚输入的用户名和注册码,每次打开软件都会读取INI文件里面的信息。注册成功后再修改里面的注册码,再次打开程序会显示注册失败
OpenFile 是打开文件断点,把程序断在打开文件那一行代码
ReadFile 是读取文件断点,把程序断在读取文件内容的那一行代码
把代码断在打开文件还需要单步找读取的内容点,所以直接下读取文件断点
找到真注册码填写的时候用户名要和之前输入假码的用户名一样
API断点MessageBoxA
PEID查壳,判断是没有壳的程序
打开程序,输入假码注册,弹出错误提示信息框
导入OD,在工具栏点击BP,下MessageBoxA断点。F9运行程序,打开程序输入假码点击注册,断点断在错误提示信息框出现之前。F8单步,看到MessageBoxA函数,在单步向下错误提示信息框就会弹出。点击确定,回到OD,继续单步向下找关键跳。
出一个call,向上向下并没有找到关键跳可以跳过这个错误提示CALL,继续向下运行在出一个call。在向上向下找关键call,没有找到向下运行在出一个call。看到call有跳转的箭头,证明有个跳转来到这里,说明有关键跳。
查看跳转来源是jmp无条件跳转,但是并没有成功跳过错误的call。看到jmp下面有另一个跳转来源,是他跳过了jmp,所以运行了错误call。选中代码行,下方会出现跳转来源地址,右键,选择转到XXXXX。看到源头是个je跳转条件跳转,上面一行是cmp对比。
在je下断点,删除MeassageBoxA断点,运行程序证明一下。程序输入假码确定,je跳转线变成红色,代表跳转实现,跳过了jmp到错误信息。
回到je跳转,使用nop填充。保存
破解成功
MessageBoxA断点表示让软件弹出窗口之前端下来
双击右侧EIP可以回到当前执行的代码行,EIP是指针
VB之tcMsgBox
打开程序,输入假码显示注册错误弹窗
PEID查壳显示什么也没找到
导入OD,对比OEP像是VB程序,反汇编窗口向上看见有MSVB60说明是VB程序。F9运行程序,输入假码,在工具栏点击VB,下MsgBox断点,程序点击注册,程序断在弹出错误弹窗信息之前。F8单步向下,到弹窗代码,程序点击确定,ALT+F9向上向下找关键跳,没有就向下继续出call。找到关键跳,转到源头,发现是je跳转,双击下断点,运行程序,输入假码点击确定,发现程序断在这里,回到ODnop填充
摆脱NAG
打开程序,点击关闭提示本软件注册才能无限制使用
导入OD,F9,关闭程序弹出NAG,不要关闭,返回OD,按F12,菜单栏点击K,找到USER32.MessageBoxAExa,右键-显示调用。F2下断,后重新载入程序,程序断在NAG弹出之前,F8向下NAG弹出,关闭NAG继续F8,向下回到程序领空,在向上,找到NAG的信息框代码,向上向下找跳过NAG代码框的跳转,没有继续向下出call,找到关键跳下断,运行程序断在BAG弹出之前,修改Z标志位为1,F9,程序直接关闭,说明没有弹出NAG,完成
NAG,弹出的注册提示信息框
F12,OD的暂停
NAG信息框代码在注释写着,style title text howner MessageBOxA
向上找到断首,向下找到断尾,没有就出call
怎么修改代码完成破解
解刨VB外挂
打开程序,输入假码点确定,提示输入注册码不正确
导入OD,右键-中文引擎搜索-搜索Unicode编码-搜索“注册”,双击到反汇编窗口,往上找到段首,下断,运行程序,程序里输入假码点确定,程序被断下,回到OD,F8单步向下寻找疑似注册码。
段首在上一个断尾retn下面
在查找字符串内找到可疑地址,叫做mima003,右键复制文本字符串,到电脑地址栏输入地址,内容就是注册码
BC++假自效验
导入DiE,发现是ESP壳,BC++语言编写
导入OD,第一行pushad ,F8单步向下,寄存器窗口ESP显示红色,确定是ESP壳。
寄存器窗口右键- HW break (ESP),F8向下到BC++的OED代码段。反汇编窗口右键-用ollyDump调试进程-复制修正后大小,开始脱壳修复。
打开LordPE,找到运行程序,右键-修正镜像大小-在右键-完整脱壳-保存
导入OD手动查找IAT,寄存器窗口右键- HW break (ESP),F8向下到BC++的OED代码段。菜单栏点击调试-硬件断点-删除所以断点。找到离OEP最近的call,回车进去call,到call里向上翻,找到段首,右键-数据窗口中跟随-内存地址。找到数据窗口中和段首一样的注释,看数据窗口中地址减去400000,算出计算后地址
打开ImportREC,找到运行程序,在OEP栏粘贴在OD复制的地址,在RVA栏输入计算后的地址,大小栏填写1000。点击获取输入表,点击显示无效函数,删除无效函数,修复转存文件,完成
OED,编写语言。只有直到相对编写语言才知道入口
BC++脱壳完修正函数打不开程序,这种情况会被认为是自效验,但不是。是因为BC++程序脱壳后要手动查找IAT
数据窗口中如果不显示内存地址,点击右键-长型-地址
大小栏填写1000,向下查找1000行代码段
DeDe的用法
把上一节脱壳的BC++程序导入DeDe。导入完成后点击过程,找到有3个Button的单元,找到后双击查看,点击第一个里面显示有个网站地址,确定是在注册窗口中的一个按钮,还剩下生成机器码按钮和注册按钮,不知道哪个是注册按钮,就把地址复制下来到OD下断。
点击进去第二个按钮,点击第一行右键复制。导入OD,查找表达式,粘贴复制的地址,F2下断。点击第三个按钮复制地址,重复刚刚操作下断。
F9运行,点击生成机器码,程序断下来,把这个断点取消。继续运行,点击注册,程序断下来,在断下位置向下找疑似注册码
Button,按钮事件。找到有3个Button的单元是因为程序点击注册的窗口中有三个按钮
单步跟踪达到破解
打开程序,会有下载广告弹出,下载这个广告程序才能运行程序。目的是取消他
导入OD,F8单步,程序运行,重新载入,F7进入call,F8继续单步。遇到向上的跳转就在下面一行按F4,遇到程序运行call下断重新运行。在到下断点的call看看上下有没有关键跳,跳过这个弹出窗口的call。
找到关键跳,发现是jnz跳转,汇编代码,改成jmp。保存
单步跟踪
PEID查壳是ESP
导入OD,F8向下单步,如果打开程序就重新载入,记住刚刚打开程序的那一行代码,F7进去,重复这样,如果有向上循环跳转,右键-断点-运行选到位置。看到popad就是快到OEP段了,向下直到反汇编代码窗口和刚刚完全不一样
如果ESP定律找不到OEP,手动找到OEP
运行选到位置,快捷键F4
F12暂停法寻找注册码
打开程序,输入错误注册码,弹出注册错误信息框
导入OD,F9运行,到程序输入假码,弹出错误信息框不要关闭,回到OD,按F12暂停,在按ALT+F9,回到程序关闭错误信息提示框。
回到OD,向上找到错误提示框call。在找关键跳,跳过错误提示框call的跳转。到跳转源头下断,运行程序,再点击注册程序被断下。证明就是关键跳,通过修改Z标志位让跳转失效,双击Z标志位,再点击注册,提示注册成功。但是在重新打开软件发现还是未注册,说明这个软件是重启验证。
重新载入OD,F9运行,程序断在关键跳,向上两行找关键call,F7进入call,F8单步向下找疑似注册码。
如果这个跳转不是Z标志位控制,就双击别的标志位看跳转是否失效或者成功
制作内存补丁
打开程序,发现程序页面关键词“未注册”
导入OD,右键-搜索UNICODE-CTRL+F搜索“注册”关键词,按N向下下一个,发现有一个“已注册”,双击进入。
向上寻找关键跳,看看能不能找到跳过“已注册”的跳转
找到关键跳,发现他跳过已注册,双击下断。使用NOP填充,运行程序,程序页面显示“已注册”
回到OD,左键选中NOP填充的代码行,右键-撤销选择处修改
打开注册机编写器,菜单栏点击其他-制作内存补丁,选择需要打补丁的软件,输入标题和启动提示。点击添加
修改地址:OD下断的关键跳最左侧的地址
搜索范围:不用填写
修改长度:数第二栏一共几个数字,每两个数字算一个长度
原始指令:OD下断的关键跳第二栏的字符串
修改指令:关键跳使用NOP填充,在填写第二栏NOP填充后上下的字符串,从第一个输入一直到最后
点击生成,把补丁放在和原程序同一个目录,运行内存补丁就可以使用破解版
搜索关键词的时候,看看有几个关键词,同时查看周边的字符串
注册机编写器,补丁制作工具
Push窗体绕过登录框
打开程序,查看登录窗口,输入假码点击登录,根据点击登录后的反应时来判断,这是一款网络验证软件。
导入OD,OD没有任何提示弹出,表示程序无壳,无壳就可以使用Push窗体法。输入跟随表达式,401000。右键-查找-二进制字符串,输入FF 25。到易语言体
在导入把程序导入一次OD,开两个OD窗口,重复刚刚步骤到易语言体。右键-查找-命令,输入:push 10001 点击查找,在查找到10001下两行push 0x520XXXX,就是一个窗体,复制窗体:push 0x520XXXX。去另一个OD窗口,把复制的粘贴到离易语言体最近的push中,保存。
在回到找窗体的OD,右键-查找-下个,找到下一个不一样的窗体复制粘贴保存。重复步骤找到全部不同的窗体。
查找二进制字符串,Ctrl+B
FF 25,查找窗体,只能在易语言编写的程序中才能使用Push窗体法
查找命令,Ctrl+F
离易语言体最近的push,是程序在打开的时候读取的第一个窗体,把找到的窗体代码复制到第一个,程序打开的时候出现的就是这个窗体,这样就能跳过需要登录的窗口,有几率到主程序窗口
查找下一个,Ctrl+L
push窗口法可能会找到暗桩,可能会有不好的暗桩,打开可能电脑蓝屏,死机等攻击性的暗桩
退出暗桩的解决方法
上一课找到很多窗口,有的可以打开,有的打不开有提示,唯独10001是打不开不提示。打开任务管理器观察他,双击打开程序,在管理器中会出现一下然后消失。 说明他是打开后就退出了
导入OD,F9运行,发现程序状态会变为“已终止”,正常退出。重新载入,API断点-常用断点设置-程序退出。F9运行,暗桩调用退出的时候被断,在堆栈窗口中,点击离call到XXXX下面最近的返回到XXXX,右键-反汇编窗口中跟随,找到关键call,这个call就是退出函数的call,在call的上面有一个jle条件跳转,是可以跳过这个call,把jle汇编为jmp,保存,成功进入主菜单
这个暗桩只是程序退出暗桩,不是具有攻击性的暗桩
网络验证的本地突破
打开程序输入假码,程序有延迟1到2秒的延迟,说明是网络验证。本地验证没有延迟
使用Die查壳,发现程序是Delph语言编写。没有壳
导入DeDe,点击过程,一个一个找单元名,找到开始注册按钮,点击进去开始激活按钮事件,复制地址。
导入OD,打开输入跟随表达式,复制地址。来到地址下断,F9运行,输入假码假用户名,点击开始激活程序被断,F8向下,遇到循环指令F4到达,到按F8程序运行不动的call。重新载入程序,F9运行,打开程序输入假码点击注册,程序被断,向下找刚刚F8运行不动的那个call,可能是错误提示call,点击疑似错误弹窗call的上一行代码F4到达,在把call使用Nop填充。在疑似错误提示下,有一个跳转,肯定是跳向了失败,把跳转也使用Nop填充。F9运行程序弹出注册成功提示框。保存
DeDe点击单元名,在随便点击一个事件,右键-显示附加数据,就能显示中文的按钮事件名称
F8向下运行不动的call可能是错误提示弹窗
VB的通用技巧
PEID查壳是无壳
导入OD,从入口判断是VB程序,右键-运行脚本-打开,找到VB断点脚本打开。等脚本自己运行完毕,F9运行,程序被断下,但是软件还没完全打开,因为这是一个重启验证的软件,F8跟着去看一下是不是判断注册信息。往下寻找cmp ax,0xFFFF命令,在这行下断,点击B把其他断点删掉。在这行命令下有个jnz跳转,把jnz使用nop填充,运行程序,提示注册成功。
打开程序,点击关于,还是显示未注册,回到OD,复制cmp ax,0xFFFF,右键-查找-所有命令,粘贴,点击B把查找到的都下断,F9运行,点击关于,程序被断下,说明关于里是否判断为注册版调用的是这个命名,把这行命令下的jnz也使用NOP填充,把其他断点取消,F9运行程序,点击关于显示已注册。
保存所有修改
cmp ax,0xFFFF,这其中的FFFF是百分之85VB程序用于判断的数值,直接影响下面的关键跳,当以后调试VB程序的时候看到有这个东西与FFFF做比较就要注意
所有模块的调用
PEID查壳,无壳
打开程序,自动退出程序
导入OD,右键-查找-所有模块的调用,点击上方目标文件,PageDown往下翻页。找到vbaEnd,点击-右键-在每个调用到vbaEnd上设置断点。F9,程序被断,当程序退出时,调用了这个函数。然后看到函数上有个je可以跳过这个函数,肯定是关键跳。把关键call上面的关键跳下断,取消关键call的断点。
重新载入程序,F9,断在关键跳。通过修改Z标志位,让跳转实现。点击B查看所有断点,点进去一个一个看,看见有跳过这个call的跳转都下断。
重新载入,F9。程序断在跳转,修改Z标志位让跳转实现,全部修改完成,程序打开。但是弹出来自动关机提示框,这是程序的保护机制。shutdown -a 关闭自动关机。
在找到下断点的跳转,全部汇编为jmp。保存,在打开程序会跳出自动关机,可以找到在目录下生成了一个文件,是自动关机的文件,复制文件名
把新保存的导入OD,右键- 中文引擎搜索-搜索UNICODE,Ctrl+F,粘贴搜索。双击进入,到段首下断,F9。程序断下,看寄存器窗口显示要写入的自动关机的代码。F8,直到堆栈窗口也显示这串代码,在堆栈窗口点击,右键-数据窗口中跟随。
数据窗口中看见自动关机代码,选中,按空格。把保持大小勾上,修改UNICODE,删除原来关机代码,输入一堆0,点击确定。在选中,右键-复制到可执行文件,保存。在打开程序自动关机就没有了
还有一种破解关机代码弹窗。新保存的程序导入OD,F9。程序断在关键call,F8,到关机代码窗口弹出,F8向下到断尾出call,在向上找看有没有能跳过这个call。看到一个能跳过call的关键跳,把je跳转改为jmp
点击上方目标文件,自动让下面的名字排列整齐
vbaEnd,这是VB程序的退出函数
在每个调用到vbaEnd上设置断点,所有的vbaEnd都会被设置断点
找跳转找到段首
检测到程序被破解程序会启动保护机制
Ctrl+F9直接到断尾
给软件做整容手术
打开PE Explorer,把需要修改的程序拖拽进去,载入成功后再工具栏,点击“资源查看/编辑器”图标。再点击“RC数据”,点开,在点击第三个,双击进入。点击第一个,看到右边数值出现#XXXX#XXX#,点击,下面会出现这一行的文字信息,修改下方文字信息,点击应用。向下找到程序中对应的文字信息,修改。点击工具栏文件-另存为。
PE Explorer,还可以修改图标,对话框位置,标题名字等自定义修改
资源查看/编辑器”图标,鼠标放在图标上就能显示文字
定制私人专属OD
打开Uedit32,把OD拖进去。记住需要修改地方的文字,Ctrl+F搜索需要修改地方的文字,把搜索ASII勾上。这次修改上方标题。F3下一个寻找后缀名和标题一样字符串。找到后选中第一个,输入需要修改的文字信息。文件-另存为,文件后缀加上.exe
第二期
易语言特征码
时钟:时钟会干扰我们调试,要关闭时钟。易语言的时钟导入OD,Ctrl+G,输入401000。Ctrl+G,输入SetTimer,点击确定。双击汇编,输入retn 10。F9运行时钟就不在显示
SetTimer,这是时钟事件的名称,注意大小写不能错
retn 10,输入retn要看断尾,断尾是多少就要输入多少
窗体:易语言的窗体导入OD,Ctrl+G输入401000。找到窗体的特征码,在第一行下断,F9运行程序,点击按钮,程序被断下,F8向下,到call的时候窗体弹出。
如果出现鼠标点击的行和反汇编窗口显示的不在一行,或者左边显示有问号,右键-分析-分析代码
窗体特征码:
00401004 /. 55 push ebp
00401005 |. 8BEC mov ebp,esp
00401007 |. 68 02000080 push 0x80000002
0040100C |. 6A 00 push 0x0
0040100E |. 68 01000000 push 0x1
00401013 |. 6A 00 push 0x0
00401015 |. 6A 00 push 0x0
00401017 |. 6A 00 push 0x0
00401019 |. 68 01000100 push 0x10001
0040101E |. 68 19000106 push 0x6010019
00401023 |. 68 1A000152 push 0x5201001A
00401028 |. 68 03000000 push 0x3
0040102D |. BB A0104000 mov ebx,窗体.004010A0
00401032 |. E8 5F000000 call 窗体.00401096
00401037 |. 83C4 28 add esp,0x28
0040103A |. 8BE5 mov esp,ebp
0040103C |. 5D pop ebp ; kernel32.7C81776F
0040103D \. C3 retn
弹窗:易语言的弹窗导入OD,Ctrl+G输入401000,找到弹窗的特征码,在段首下断,F9运行,点击按钮,程序被断
弹窗特征码:
00401019 |. 68 01030080 push 0x80000301
0040101E |. 6A 00 push 0x0
00401020 |. 68 00000000 push 0x0
00401025 |. 68 04000080 push 0x80000004
0040102A |. 6A 00 push 0x0
0040102C |. 68 A8E64700 push 弹窗.0047E6A8 ; ASCII "哈哈哈哈"
00401031 |. 68 04000000 push 0x4
退出:易语言的退出导入OD,Ctrl+G输入401000,,找到最后一个jmp退出,点击,按回车跟随,找到退出代码“ExitProcess”这段段首汇编为retn。但是这个方法对有的可能没有用,另一种方法,进入最后一个jmp后,在退出代码段段首下断,F9运行,点击按钮,程序被断,在堆栈窗口中找到看时调用了那个函数,点击堆栈窗口中返回到XXX,右键-在反汇编窗口中跟随。找到跳过退出函数的跳转汇编。
花指令与CM
点击压缩包,压缩文件,提示没有找到压缩文件。改变文件后缀名,改成exe,发现是一个易语言程序。
打开程序,提示拖入注册码验证,随便拖入一个文件,显示正在处理,然后弹出错误的提示
导入PEID查壳,显示没有找到
导入OD,发现是添加了花指令代码,反汇编窗口看不懂代码。
导入PEID,点击插件-通用OEP查找工具,记住OEP位置
打开OD,Ctrl+G,输入PEID查出的OEP,点击确定。点击第一行,右键-断定-硬件执行。F9运行,程序就被断在OEP。菜单栏点调试-硬件断点-删除刚刚下的断点。在反汇编窗口右键-用ollyDump脱壳调试进程-点击脱壳-保存
脱壳程序导入OD, Ctrl+B,输入FF 55 FC 5F 5E ,确定,下断,Ctrl+L,查找下一个,下断。直到查找不到。F9,程序被断,在F9运行,到提示拖入文件窗口,随便拖入文件,程序被断下。F7进入,F8向下,又发现花指令,清楚花指令,菜单栏-插件-Jmk Code-MainDlg-Size输入999。 发现反汇编窗口代码都变成nop,右键-分析-从模块中删除分析,花指令都显示nop。
F8一直向下,到OD不能在F8向下,程序弹出错误提示框,在卡住的那一行下断,F9运行,在拖入一个文件,第一个断点没有取消,在F9运行,到刚刚下的断点位置,F7进入,F8向下,找一个大跳转,跳过错误的提示函数。
找到大跳转 ,把大跳转nop填充,F8向下,又找到一个大跳转,使用nop填充,F9,拖入文件,显示正确提示窗
花指令就是在反汇编窗口中添加很多没用的代码来干扰调试
易语言按钮事件特征码 FF 55 FC 5F 5E ,有花指令的时候找不到
Size输入999,清楚999行花指令
大跳转中跳过了很多的易语言各种事件的特征码
DIY易语言程序
信息框改窗口:信息框改窗体导入OD,Ctrl+B输入FF 25,确定。向上找到三个窗体特征码,两个一样的信息框,一个窗口。复制窗口,右键-二进制-二进制复制。记住复制中call的地址401221。在到信息框特征码,把复制的粘贴覆盖到信息框特征码。在复制断尾mov esp,ebp 到retn,这倒数第三行,二进制复制,在二进制粘贴到刚刚粘贴窗口的后面。再检查复制中call的地址,发现不是刚刚复制的,汇编为401221。F9,点击登录,弹出窗口
信息框改窗口,用于知道软件使用的功能窗体,把点击登录出来的信息框改为使用功能的窗口
FF 25,到达易语言体
复制窗口,从特征码第一个复制,jnz下第一行,到add esp,jmp上面一行
粘贴,段首第一行push ebp 第二行mov ebp,esp 留着,选中特征码第一 行向下多拖一段,粘贴选中多了几行也没有问题,只会粘贴复制的行数。
如果遇到窗口太多,信息框就一个,代码行放不下这么多窗口代码。把段尾后三句代码使用nop填充,在数据窗口中,往下找,找到全是0000处,看地址,汇编第一行nop代码,输入:jmp “数据窗口中00的地址”。在反汇编窗口中来到00处, 选中,粘贴二进制。检查复制窗口地址。复制刚刚nop填充的最后一行地址。在00处粘贴的最后一行,汇编jmp “复制的nop地址” 。保存所有修改

浙公网安备 33010602011771号