前几天笔者在逆向一个易语言写的身份证生成器程序的时候,发现易语言的各种函数都是经过封装过的,包括文本比较,字节集比较等敏感的功能函数全都是经过封装的,并且功能特征码无论哪个版本的易语言还完全相同…
现在网上的一些易语言特征码根本不可靠,只要把代码稍微VM一下,特征码就找不到了,在此,笔者稍微研究了一下易语言库函数调用过程:
测试程序的源码如下:

先看看”信息框”函数是怎么被调用的

可见易语言调用库函数是保留了参数的属性,所以实际传递的参数比代码写的参数要多

跳转到调用库函数的函数的主体

这边是调用库函数,之前设置的EBX就是库函数主体的位置了

终于到库函数的主体部分了…(调用一个函数经历这么多代码,怪不得易语言代码效率这么低)

顺便贴上文本比较的代码部分,可见易语言文本比较也是通过调用库函数实现的

那么只要找到想要Hook的易语言库函数的特征码,就能轻而易举的实现Hook
这里笔者采用DLL注入的方式来实现inlinehook,特征码记录在自定义的配置文件里面
配置定义:

enum EasyLanTypes { zjx, dzsx, zsx, xsx, sjdxsx, wbx, zjj, ljx, noreturn };
typedef struct {BYTE *pBin;UINT lenth;
} BIN;
typedef struct {string MsgText;UINT OffsetToESP;EasyLanTypes ArgType;
} ArgInfo;
typedef struct {BIN SignatureCode;DWORD ESPOffsetToReturnAddress;EasyLanTypes ReturnValueType;string FunName;vector<ArgInfo> ArgSettings;DWORD HookId;DWORD CutByteSize;BIN RunCode;
} ConfigInfo;

处理:

BOOL Attch(const char *ConfigFile) {CreateConsole();//创建一个控制台以便调试HANDLE ProcessHandle = INVALID_HANDLE_VALUE;LoadConfig(ConfigFile);//载入配置文件if (!config.size())return false;int i, j;DWORD AddressOfSignatureCode;DWORD BaseAddress = (DWORD)GetModuleHandle(NULL);IMAGE_DOS_HEADER *pidh = (IMAGE_DOS_HEADER *)BaseAddress;IMAGE_NT_HEADERS *pinh = (IMAGE_NT_HEADERS *)(BaseAddress + pidh->e_lfanew);IMAGE_SECTION_HEADER *pish = IMAGE_FIRST_SECTION(pinh);DWORD old;DWORD AddressForHookCall = HookCall();DWORD OffsetOfJmp;//一般第一个区段就是代码段了,改变代码段的属性VirtualProtect((LPVOID)(BaseAddress + pish->VirtualAddress), pish->Misc.VirtualSize, PAGE_EXECUTE_READWRITE, &old);printf("代码块地址:%x   大小:%x\n", BaseAddress + pish->VirtualAddress, pish->Misc.VirtualSize);printf("Hook回调函数地址:%x\n", AddressForHookCall);//解析配置文件/*格式:[特征码][覆盖指令大小][返回地址与ESP的偏移量][返回值的类型][函数名] argconfig:   [参数值类型][参数与ESP的偏移量][参数名]enum EasyLanTypes { 字节型 = 0, 短整数型 = 1, 整数型 = 2, 小数型 = 3, 双精度小数型 = 4, 文本型 = 5, 字节集 = 6, 逻辑型 = 7, 没有返回值 = 8 };*/for (i = 0; i < config.size(); i++) {DWORD OffsetOfAddressOfSignatureCode = SeachMemory((const BYTE *)(BaseAddress + pish->VirtualAddress), pish->Misc.VirtualSize, config[i].SignatureCode.pBin, config[i].SignatureCode.lenth);if (!OffsetOfAddressOfSignatureCode)continue;AddressOfSignatureCode = BaseAddress + pish->VirtualAddress + OffsetOfAddressOfSignatureCode;printf("%s 特征码:%s\n", config[i].FunName.data(), BinToText(config[i].SignatureCode).data());if (AddressOfSignatureCode == 0)continue;if (config[i].CutByteSize < 5)continue;printf("Hook地址:%x\n", AddressOfSignatureCode);UINT emptybytesize = config[i].CutByteSize - 5;//HookId设置为特征码的位置,Hook处理程序通过函数返回地址来得到HookId,所以特征码一定要找在函数头部的代码config[i].HookId = AddressOfSignatureCode;//构造返回函数的代码,执行完Hook的代码之后执行原函数头部的指令,再正常执行函数原有的代码config[i].RunCode.lenth = config[i].CutByteSize;config[i].RunCode.pBin = new BYTE[config[i].RunCode.lenth + 6];memcpy(config[i].RunCode.pBin, (LPVOID)AddressOfSignatureCode, config[i].RunCode.lenth);BYTE Attchbyte[6] = { 104,0,0,1,0,195 };DWORD JmpAddress = AddressOfSignatureCode + 5;memcpy(&Attchbyte[1], &JmpAddress, 4);memcpy(&config[i].RunCode.pBin[config[i].RunCode.lenth], Attchbyte, 6);//构造跳转指令(CALL)OffsetOfJmp = AddressForHookCall - (AddressOfSignatureCode + 5);BYTE JmpCode[5] = { 232,0,0,0,0 };memcpy(&JmpCode[1], &OffsetOfJmp, 4);//写入函数头部memcpy((LPVOID)AddressOfSignatureCode, JmpCode, 5);//用NOP填充多余指令字节while (emptybytesize) {memset((LPVOID)(AddressOfSignatureCode + 5 + (emptybytesize-- - 1)), 144, 1);}}return true;
}

配置格式:[特征码][覆盖指令大小][返回地址与ESP的偏移量][返回值的类型][函数名] argconfig: [参数值类型][参数与ESP的偏移量][参数名];
参数类型: 字节型 = 0, 短整数型 = 1, 整数型 = 2, 小数型 = 3, 双精度小数型 = 4, 文本型 = 5, 字节集 = 6, 逻辑型 = 7, 没有返回值 = 8 ;
Hook处理程序通过配置文件中参数与现ESP的偏移量来获取参数内容,如果想抓取返回值,则需要修改返回地址处的代码来实现获取函数返回值

本文完整代码附配置文件下载地址

效果:

[Hook技术]利用inlineHook来实现快速破解易语言程序相关推荐

  1. 三天快速制作易语言防破解网络验证注册码系统

      百宝云介绍 百宝云是一款云服务器产品,专为快速打造个人云端服务器的云应用产品.开发者无需关心服务器开发,维护乃至性能扩展,APP管理,百宝云提供完善的全套服务.强大的第三方接口可以和任何开发语言对 ...

  2. 傅里叶变换 c语言程序,(快速傅里叶变换)C语言程序汇编

    ( #include #include /********************************************************************* 快速傅立叶变换C函 ...

  3. 易语言mysql防破解_易语言程序真正防止破J的思路以及解决案例

    该方案相对于上两种,更加nc一点儿,通过"云代码"这三个字,顾名思义,就是将部分逻辑代码放在云端.由服务器代理处理,并将结果返回给客户Duan,客户Duan使用处理结果实现某些功能 ...

  4. 关于易语言程序的破解

    易语言程序用PEID查壳显示的是 Visual C++ 6.0[overlay]   ,其中包含有ecode区段,这基本就是易语言程序是不会错了,应为易语言底层也是用的C++的编译系统所以也是Visu ...

  5. 相关Hook技术及原理

    首先要说下CPU权限...Intel把自家CPU指令分为四个等级,Ring0,Ring1,Ring2,Ring3,Windows操作系统只用了Ring0和Ring3两个权限.简称R0和R3好了 R0权 ...

  6. 易语言x64驱动保护防检测破解注入内存读写(支持win7win10全系统)

    现在很多游戏会检测工具,辅助, 如果我们对工具或者辅助进行保护起来,也像游戏一样阻止各种操作访问检测, 就可以让游戏检测不到避免封号. 或者防止同行盗取自己辅助里的数据信息,破解自己的辅助等行为! b ...

  7. 易语言破解之绕VM思路

    0x1追踪[EBP-4] 介绍 找到按钮事件特征码的位置,可以发现call调用的是[ebp-4]的值的位置,若找到[ebp-4]的值是从哪里来的,就算别人把按钮事件特征码整个给vm掉了,也能追踪到按钮 ...

  8. Android APP热更新中的插件化(Hook技术:反射或动态代理),Demo (2)

    修改AAPT,资源分区,用于Android插件化- https://github.com/BaoBaoJianqiang/AAPT -- Android下的挂钩(hook)和代码注入(inject) ...

  9. 欲知己之所防,先知彼之所攻——论Hook 技术的攻防对抗

    矛盾的同一性与斗争性原理几乎适用于所有攻防对抗. 上期,我们在<当硬件属性不再作为设备指纹的标识,我们该如何保证设备指纹的唯一性>一文中曾介绍了硬件ID 作为设备指纹的基础属性的发展演变- ...

最新文章

  1. 对 makefile 中 .PRECIOUS 的学习
  2. MySQL事件调度器(Event Scheduler)介绍
  3. python与办公结合_python在办公时能给我们带来什么?
  4. c语言中的static变量和static函数
  5. 大话设计模式(八 用“策略模式”是一种好策略)
  6. linux complete函数,Linux驱动中completion接口浅析(wait_for_complete例子,很好)
  7. [你必须知道的.NET] 第二回:对抽象编程:接口和抽象类
  8. Python使用pandas读取Excel文件多个WorkSheet的数据并绘制柱状图和热力图
  9. SQL Cookbook:一、检索记录(2)从表中检索部分行
  10. GMAIL DRIVE 提供邮箱一样大小的硬盘
  11. 统计学习方法读书笔记10-决策树
  12. HackTheBox-Magic-Walkthrough
  13. 关于oracle端口映射的远程连接
  14. 苏格拉底的最后日子――柏拉图对话集
  15. meta http-equiv=refresh content=0; url=是什么意思
  16. 最全MacWin软件分享
  17. 【配电网重构】基于粒子群算法实现最小化功率损耗的配电网重构附matlab代码
  18. 没有基础怎么自学好淘宝美工设计?自学有哪些方法?
  19. 合作对策模型的简单实现
  20. 【Leetcode】1905. Count Sub Islands

热门文章

  1. 2021-09-04剑指Offer43.1~n整数中1出现的次数
  2. 一分钟了解直播电商与微商的区别
  3. 自动驾驶汽车GPS系统数字孪生建模(二)
  4. 人口普查系统_赞!新桥乡贤开发数字乡村系统,成为家乡人口普查“神器”
  5. android蓝牙耳机录音播放,android蓝牙耳机录音并播放(二)
  6. Chrome 新功能 - 录制小视频
  7. 2020年生肖码表图_2020年会发大财的生肖(图)
  8. html布局结构瀑布流,三种方式实现瀑布流布局
  9. numpy 是否为零_python数据分析入门必刷!100道题掌握numpy
  10. 数字孪生+燃气管理,开启智慧燃气管理新模式