了解汇编代码

时间:2013-06-07 20:34:40

标签: linux assembly xor bootloader mbr

任何人都可以对以下汇编代码提供一些见解:

更多信息:

引导加载程序实际上是一个小型的16位引导加载程序,它使用Xor解密进行解密,一个更大的解密器,一个位于第3到34区的linux引导加载程序。(该扇区中有1个扇区是512字节)

整个事情是在嵌入式Linux上运行的exec的保护系统。

删除保护的版本已经破解了linux引导加载程序(我们能够使用IDA将其反转)所以我们假设xor密钥必须在没有保护的版本中仅使用零。

如果我们在保护被删除的版本中查看偏移0x800到0x8FF它没有填充零,所以这不能是密钥,否则这个版本无法加载,它会清除普通数据并加载垃圾。< / p>

扇区3-> 34在原始版本中加密并在我们的版本中清除(保护已删除)但MBR代码(小型预引导加载程序)在两个版本中都是相同的。

那么MBR的汇编代码中是否有一个小细节可以稍微改变xor键的位置?

这只是我正在做的一项练习,可以更好地理解汇编代码加载器,我发现这个是一个很难接受的挑战。到目前为止,我感谢你的意见!

1 个答案:

答案 0 :(得分:0)

好吧,阅读汇编代码是很多工作。我会坚持回答“钥匙”的来源。

  • BIOS将MBR加载到0000:7C00并将DL设置为加载它的驱动器。
  • 首先,您的MBR设置了从0000:7C00开始的堆栈。
  • 然后,它将自身复制到0000:0600-0000:07ff并进行远程跳转,我假设是下一条指令,但复制版本为0000:061D。 (编辑:这个副本对于MBR来说是一个非常标准的事情,通常是这个地址,它使地址空间高于免费)(编辑:它完全自我复制,我误读)。
  • 然后,尝试5次将扇区2读入0000:0700-0000:08ff,如果失败则停止并显示错误消息(loc_78)。
  • 然后,尝试5次读取从扇区3开始到2000的32个扇区:0-2000:3FFF(绝对地址20000-23FFF,16kB从128kB开始)。
  • 如果一切顺利,我们在loc_60,我们知道我们在记忆中有什么。
  • loc_68上的循环将使用包含这32个扇区的缓冲区作为目标。
  • 它将使用从0000:0800开始的缓冲区作为源(这是我们读入0:0700-0:08ff的缓冲区的第二个256字节,磁盘扇区2的第二个256字节)。
  • 在每次迭代中,LODSW将2添加到SI。
  • 当SI达到840时,由AND设置回800。因此,“密钥”缓冲区从800到83F,也就是说从磁盘扇区2的字节256开始的64字节。
  • 我的印象是XORing缩短了一个字节...... CX应该设置为4000h,而不是3FFF。我认为这是代码中的一个错误。
  • 在物理地址20000处的16kB缓冲区与该“密钥”缓冲区进行循环异或后,我们跳远到2000:0。

右?合身吗?关键在那里?