我有一个应用程序,该应用程序在通过套接字发送数据之前调用一个子例程,并且在该子例程中,数据包正在加密。有什么方法可以使应用程序跳过该子例程,并以未加密的方式发送数据包?

评论

如果加密已就位,则用NOP替换呼叫,否则,修改功能以仅复制输入。没有有关程序和调用如何工作的更多信息,很难为您提供进一步的帮助。

这是IDA的屏幕截图:i.imgur.com/zurZc9f.png

屏幕快照中有两个呼叫。编辑:我想这是encoder_func

是的,这是我要跳过的子例程。

#1 楼

正如Dillinur所写,您需要取消此呼叫。为此,您可能需要一个十六进制编辑器,例如WinHex。要NOP子程序,您必须确定从哪个地址调用它。要查看该地址,请在IDA中转到选项->常规,然后标记行前缀。

也很高兴看到您想要NOP的哪些操作码。转到选项->常规,然后在操作码字节数字段中写入6。然后您的IDA图形模式将如下所示:



在我的示例中,如果我想在执行时跳过foo子例程,则需要设置操作码字节E8 DF E6 FF FF到90 90 90 90 90(E8是调用助记符,其余是偏移字节)。 0x90是NOP操作码。要NOP这些字节,我在WinHex中打开可执行文件并搜索偏移量0x31CC(而不是0x4031CC,因为0x400000是我的IDA中可执行文件的加载地址)。最后,当我找到偏移量0x31CC时,我寻找字节序列E8 DF E6 FF FF,然后将其编辑为90 90 90 9090。保存它。为了避免后续代码中的错误,请在子例程之前的PUSH指令中删除该内容。

评论


仅需注意,还可以在Ollydbg中编辑函数,然后保存修改后的(“修补”)可执行文件。 olly的优点是您可以看到要更改的指令,而使用普通的十六进制编辑器则很困难。

–多米尼克·安塔尔(Dominik Antal)
15/09/14在11:25



我不知道它是否仍然很流行(在DEP的日子里-防止数据执行),但是对于许多旧的程序,虽然您可以在执行过程中找到这样的代码块,但是在磁盘上不会以这种方式出现,因此您不能(轻松)进行永久更改(本质上,“代码”是在启动阶段解密的数据块)。另外,加号esp,8不能平衡推送,因此它们应该保留吗?

– TripeHound
2015年9月14日在16:12



您无需在前面的推送中点按,因为在函数调用之后添加了一个esp,即8。

–Milhous
2015年9月23日在3:26



通常,如果被调用函数使用stdcall作为调用约定,则可能需要NOP前面的推送,其中被调用函数负责清理堆栈。这就是为什么我写了“您可能会想到NOPing”的原因。

– 0xDEADC0DE
2015年9月23日在8:48



#2 楼

有一个ida标记,但是您的问题没有提及,所以让我们使用radare2代替;)在当前函数中,aa写入十六进制对,pdf再次检查结果。如果您更喜欢编写指令,或者甚至更好地使用神奇的wx命令,也可以使用pdf代替当前的
操作码,以nop代替。