文章目录

  • 标题的提示文字
  • 6个功能的提示文字
  • 功能2:添加记录
  • 方法一:修改跳转
  • 方法二:修改返回值
    • 第一种修改方式
    • 第三种修改方式
    • 第四种修改方式

Wintel Machine Code Anti-Reversing Exercise Description of the
Exercise:

Apply the anti-reversing techniques Eliminating Symbolic Information
and Obfuscating the Program, both introduced in sections 6 and 7 of
the report, to the C/C++ source code of the Password Vault application
with the goal of making it more difficult to disable the trial
limitation. Rebuild the executable binary for the Password Vault
application from the modified sources using the GNU compiler
collection for Windows. Show that the Wintel Machine Code Reversing
and Patching Exercise can no longer be carried out as demonstrated.

Wintel机器代码反反转练习

活动描述: 将报告第6节和第7节中介绍的消除符号信息和模糊程序的反反转技术应用到密码库应用程序的C/
C++源代码中,目的是使禁用试用限制更加困难。使用Windows GNU编译器集合从修改过的源代码重新生成Password
Vault应用程序的可执行二进制文件。显示Wintel机器代码反转和修补练习不能再进行演示。

这次的密码库应用程序是实验四-java反编译那一节的程序用C/ C++写的,先打开PasswordVaultObfuscated.exe应用程序运行,添加5条账户密码记录之后,程序提示达到上限不能再添加记录了:

我们的目标就是突破5条账户密码记录的限制。
先用IDA打开,查看字符串窗口:

发现除了标题以及部分提示的字符串,关键的字符串都已经被AES256算法加密了:

标题的提示文字

找到输出标题的提示文字的代码,有两处调用了这个提示函数:

之前运行过exe你就会知道,第一次调用是启动的时候最开始的提示,第二次调用是每次选择显示、创建、编辑、删除等功能都会先调用输出标题的提示文字。
找到第二次调用的位置在函数sub_4078B6()中:

6个功能的提示文字

下一个函数sub_401C04()就是输出6个功能的提示文字的函数:

在OD中给找到00401C04函数下断点,运行程序在显示完标题提示之后就会停在断点处:

这里就是显示6个功能的函数开始的地方,其中sub_401F42就是获取都是AES256解密后的字符串,sub_550C68就是printf函数,在00401D36 call Password.00527664下断点,运行程序就会断在输出第二个功能的提示文字之后:

00401C04函数就是负责输出6个功能的函数选项的提示文字,他们都包含在sub_4078B6()函数里:

我们再往上找到调用sub_4078B6()的sub_407504函数:

就可以发现功能实现的逻辑了,通过sub_4078B6()的返回1-6来跳转到6个不同的功能,其中控制添加账户密码记录的就是第二个功能sub_407CE6()。

功能2:添加记录

在OD中进入407CE6函数,往下我们可以找到一个判断跳转的地方,在00407D41下一个断点,输入数字2之后运行程序就会停在00407D41:

这时候我们已经输入了5条账户密码记录,然后al的值是01,ZF标志位是0,跳转不成立,这个跳转就是用来跳过
00407D5F E9 36080000 jmp Password.0040859A; 跳转到返回retn
让程序返回退出的,继续运行之后就会跳转到返回:

而跳转不成立则会 JMP到返回的位置
所以我们在这把ZF标志位改为1,就可以让跳转成立:

运行,成功突破限制可以继续添加账户密码记录:

所以这个判断就是账户密码记录条数是否小于5的关键位置,如果小于于5就可以继续添加账户密码记录,如果不小于5就输出[Error]返回。

我们再重新打开一个没有账户密码记录的exe,下断点在

00407D3F . 84C0 test al,al

运行停在断点00407D3F处:

这时候al的值为0,ZF的值为1,跳转成立,可以继续运行添加账户密码记录。

方法一:修改跳转

我们只需要保证跳转一直成立,这样就不会提前返回了。所以我们可以把je(等于0则跳转)修改成jmp(一直跳转),也就是把对应的机器码74改成EB,修改之前的代码如下图:

修改之后的代码:

复制到可执行文件,保存文件为 PasswordVaultObfuscated_crack_jmp.exe:

运行PasswordVaultObfuscated_crack_jmp.exe,成功突破限制:

方法二:修改返回值

因为test al,al在al为0时,al&al=0,ZF标志位置1;
je在ZF为1时跳转。
所以我们只需要让al始终为0即可实现一直添加账户密码记录,我们找到了返回eax的值位置:

然后我们将
00407A5B |. 0FB6C0 movzx eax,al;
修改成如下4种对应的机器码和对应的汇编:

编号 机器码 汇编 是否合适
1 33C0 xor eax,eax 将eax置0,且运算速度比2快,且包含了movzx eax,al将eax除al以外的位置0的作用
2 B8 00000000 mov eax,0x0 将eax置0,但是长度太长,修改比较麻烦
3 32C0 xor al,al 将al置0,且运算速度比2快
4 B0 00 mov al,0x0 将al置0

第一种修改方式

第一种修改的既可以满足我们将al置0的目的,同时包含了源代码movzx eax,al将eax除al以外的位置0的作用,而且对CPU而言它的运算速度比mov eax,0x0快。
所以我们将源代码修改为33 C0 90,多的这一位一定要用90(nop)来代替,如果是00会被识别为代码影响后面的代码:

修改之后的代码:

复制修改到可执行文件,保存文件为PasswordVaultObfuscated_crack.exe,运行程序,成功突破限制:

第三种修改方式

但实际上,在这里我们按照其他的修改方式也可以实现我们的目的,可能是因为在这个程序中,eax除了al以外的位是不是为0对程序没有太大的影响 ,例如按照第三种修改32C0 xor al,al把源代码修改为32 C0 90:

复制修改到可执行文件,保存文件为PasswordVaultObfuscated_crack3.exe,运行程序,也可以成功突破限制:

第四种修改方式

例如第四种也是可以的B0 00 mov al,0x0,把源代码修改为B0 00 90:

复制修改到可执行文件,保存文件为PasswordVaultObfuscated_crack4.exe,运行程序,也可以成功突破限制:

Wintel机器代码反反转练习(C/C++逆向)相关推荐

  1. 都市快打apk格斗小助手,.net反编译,unity3d游戏逆向。

    都市快打apk格斗小助手,.net反编译,unity3d游戏逆向. 教你使用 Reflexil 反编译.NET – 王旭博客 .NET反编译软件Reflector插件reflexil的使用 - ASP ...

  2. java反编译工具_安卓逆向之反编译工具的使用

    SMALI/BAKSMALI是一个强大的apk文件编辑工具,用于Dalvik虚拟机(Google公司自己设计用于Android平台的虚拟机)来反编译和回编译classes.dex.其语法是一种宽松式的 ...

  3. 超全的 爬虫+反爬虫+加密数据破解+JS逆向 干货教程,建议收藏!

    在当下这个,由互联网行业所引领的大数据时代,如果想要在越来越内卷的职场中,取得优势升职加薪,其重中之重就是要掌握数据分析技能. 对于企业的决策者来说,商业环境瞬息万变,要做出正确且果断的决策,必须提前 ...

  4. 防止软件被破解反调试防破解防逆向C++

    做逆向有段时间了,分享一些逆向的对抗方法,对抗是不可能做到天衣无缝的,作用一般是让自己的程序不那么容易破解,从而劝退一部分人,如果一点防护措施都不加的话,可能人家看过几节逆向课的人都能轻易破解. Wi ...

  5. 【java链表反转:递归实现逆向翻转(leetcode)】

    (leetcode206) 文章目录 (leetcode206) 前言 一.题目中文 二.代码实现 1.完整代码 2.代码详解 总结 前言 对于链表翻转使用递归方法分为顺序翻转和逆向翻转,这里主要介绍 ...

  6. ApkTool 反编译Android apk (加固逆向)

    GitHub 源码地址(其实刚开始不必关注源码的实现,我们只需知道如何完成apk的反编译) https://github.com/iBotPeaches/Apktool 我们主要需要一个jar包和 . ...

  7. 逆向工程实验——lab8(C/C++反逆向、Java字节码反逆向)

    文章目录 1.Wintel Machine Code Anti-Reversing Exercise 标题的提示文字 6个功能的提示文字 功能2:添加记录 方法一:修改跳转 方法二:修改返回值 第一种 ...

  8. java反编译工具_Android APP 取证之逆向工具篇

    一.前言 此系列文章将针对 Android APP 取证领域展开讨论.在国内,由于最近几年国产手机厂商之间的竞争和努力,如今 Android 平台的使用数量和广度,已经远超苹果的 iOS 了.如今 A ...

  9. 2020年 IOS 逆向 反编译 注入修改游戏或APP的调用参数新手系列教程——使用theos tweak 注入hook修改游戏执行代码上传动态头像

    2020年 IOS 逆向 反编译 注入修改游戏或APP的调用参数新手系列教程--使用theos tweak 注入hook修改游戏执行代码上传动态头像 开篇 需求&最终效果 环境要求与即将使用的 ...

  10. -反编译 APKTool 逆向助手

    最佳实践--Android逆向助手 1.点击"反编译apk,完成后res下的所有资源就都可以正常使用了,相当于apktool的功能------目前已失效,但是直接用rar解压是可以的! 2. ...

最新文章

  1. 全国志愿信息服务器,全国志愿者服务信息系统官网登录,2020全国志愿者服务信息系统官网登录注册入口预约 v1.0-手游汇...
  2. svn删除用户名及密码
  3. 文件服务器:共享文件夹的移动和权限设置备份2012-04-28
  4. 用GO把你想说的话写到比特币链上
  5. mybatis批量插入数据
  6. 大连理工大学c语言第三次上机作业答案,大连理工大学软件学院C语言上机第五六章课后题...
  7. python200行代码_如何用200行Python代码“换脸”
  8. Moment.js 一款JS时间封装库
  9. 使用python中正则表达式匹配linux ifconifg命令中的具体信息
  10. 轻松使用EasyRecovery恢复丢失照片
  11. rostcm6情感分析案例分析_周小鹏分析情感案例——你愿意嫁给一个离过婚带孩子男人吗?...
  12. 分享8年开发经验,浅谈程序员职业规划
  13. java 动态性之反射机制 详解 案例,java架构师技术图谱
  14. VsCode模仿简单百度网页(html)
  15. Python+Superset:商业智能数据分析
  16. iOS和Android和H5交互WebViewJavascriptBridge
  17. html 正方形字符,HTML常用标签以及特殊符号
  18. 大一上学期C语言不熟知识点学习总结
  19. 机器学习---线性回归推导以及python实现
  20. JAVA - 垃圾回收

热门文章

  1. Android 8.1user版本默认开启开发者模式
  2. 微信 html5 动图格式,微信真人动态表情包 怎么给自己录制GIF动态图片 你也可以录制搞笑微信gif图片;...
  3. QQ拼音输入法实属流氓软件
  4. mysql跨库查询数据
  5. 金融计算机加权平均,加权平均
  6. 解决移动浏览器不能正确转化时间
  7. WPS 设置多级标题
  8. 前端分页加载功能实现?
  9. 潦草字体在线识别_想要知道某些字是什么字体?帮助你以最快的方式识别
  10. PPT打印处理 深色背景/白色字体转换 + 多分页占满