专栏首页Eureka伽罗的技术时光轴delphi字符串数据结构逆向

delphi字符串数据结构逆向

为了验证设计可行性,一般我会先快速建模,用delphi实验一下,因为VCL和编译器以及OO的思想使得模型实现起来非常快,尤其自带基础类型String非常好用而且速度极快,但是源码里是看不到的,编译器自动支持,然而在测试大规模hook api的时候,字符串操作会偶尔缺失中间的某个字节,这就是我为何不相信第三方库的原因了,在追影C实现的挂钩模块中,我没有使用任何第三方库(记录模块使用了cuckoo monitor,挂钩模块和记录器是两个东西),甚至连memcpy这些都自己用汇编做了实现,使得挂钩模块中的一切可控,随时知道问题出在哪里。在底层的开发中,任何黑箱对我来说都是一种隐患,当出问题的时候我不得不打开每个黑箱,去审计大量的第三方代码,事实上也不止一次发现第三方代码中存在大量问题。也是带着这种怀疑精神,我逆向了编译器是如何实现其自带的string类型。

结果如下:

struct unicodestring{

dword reference;

dword length;

word content[];

}

跟COM的做法有点类似。每次进入有字符串类型的函数前,编译器自动加上一个增加引用的调用,退出函数前减少引用。我推测在引用为0的时候会释放内存,跟COM的做法一样。而通过反汇编发现,实际上字符串变量内的地址指向的是content的地址,而不是unicodestring的地址,编译器通过content地址的偏移去操作reference和length,由于提前知道了长度,比通过检查\0结尾,把整个串撸一遍的字符串操作要快的多。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 过TP保护的最佳方法(最新整理)

    https://wenku.baidu.com/view/eecc906148d7c1c708a145aa.html

    战神伽罗
  • Delphi xe10对json的解析应用

    {"code":100,"state":"true","data":["hero","npc","pet"]}

    战神伽罗
  • NT6上的获取进程全路径

    战神伽罗
  • 二维数组取最大最小值

    return max($temp);最大值//改成return min($temp)就是最小值 

    双面人
  • 【Bit String Reordering UVALive - 6832 】【模拟】

    题目讲的主要是给你一个01串,然后给你要变成的01串格式,问你要转换成这一格式最少需要移动的步数。 题目不难,但当时并没有AC,3个小时的个人赛1道没AC,归...

    _DIY
  • 服务端JSON内容中有富文本时

    如果使用的Newtonsoft等第三方库,请无视此问题,第三方库已经帮你处理好了,不会存在此问题。 由于数据中存在复杂的富文本,包含各种引号和特殊字符,导致后...

    从今若
  • FPGA程序升级续

    fpga掉电丢失,一般使用外部flash存储代码,flash有spi、bpi、qspi等接口,外部存储器的时钟管脚一般与fpga的CCLK_0连接,当使用远程更...

    anytao
  • Flutter中的轮播图组件

    今天我们来介绍一款Flutter的第三方组件库——flutter_swiper。

    拉维
  • 融资7.5亿美金后,40问旷视CEO印奇

    创立旷视7年后,刚刚宣布D轮7.5亿美元新融资,继续担当中国AI创业的实力派代表。

    量子位
  • scrapy遇上ajax,抓取QQ音乐周杰伦专辑与歌词

    zone同学最近在上线小程序好久没写文章了,他说早就手痒痒了,所以挤出时间写了这篇,这是下面这五篇文章的连载文章:

    小小詹同学

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动