找出这个snipette的客观c代码


0

我对逆向工程非常新,但我正尝试从iOS的ARM程序集创建objective-c代码。我走了很长的一段路,但现在我陷入了一个困境。谁能告诉我什么(从IDA亲取)下面的代码方式:

__text:0050F428     PUSH   {R4-R7,LR} 
__text:0050F42A     ADD    R7, SP, #0xC 
__text:0050F42C     PUSH.W   {R8,R10,R11} 

__text:0050F430     MOVW   R2, #(:lower16:(aNNYnnQsJNFsQFs - 0x50F440)) ; "¦;(+;¡+\r\r+¡(;\r|Y¡¡+ƒs+j¦\r¡¦+;¦fs+¦+"... 

__text:0050F434     MOVS   R1, #0 

__text:0050F436     MOVT.W   R2, #(:upper16:(aNNYnnQsJNFsQFs - 0x50F440)) ; "¦;(+;¡+\r\r+¡(;\r|Y¡¡+ƒs+j¦\r¡¦+;¦fs+¦+"... 

__text:0050F43A     MOVS   R3, #0x36 

__text:0050F43C     ADD    R2, PC ; "¦;(+;¡+\r\r+¡(;\r|Y¡¡+ƒs+j¦\r¡¦+;¦fs+¦+"... 

__text:0050F43E     MOV.W   R9, #0x32 

__text:0050F442     MOV.W   R12, #0x65 

__text:0050F446     MOV.W   LR, #0x39 

__text:0050F44A     MOVS   R4, #0x62 

__text:0050F44C     MOV.W   R10, #0x34 

__text:0050F450     MOV.W   R11, #0x64 

__text:0050F454     MOVS   R6, #0x31 

__text:0050F456 loc_50F456        ; CODE XREF: sub_50F428+154j 

__text:0050F456     LDRB.W   R8, [R2,R1] 

__text:0050F45A     STRB.W   R8, [R0,R1] 

__text:0050F45E     CMP.W   R8, #0x3A 

__text:0050F462     BGT    loc_50F46E 

__text:0050F464     CMP.W   R8, #0xD 

__text:0050F468     IT EQ 

__text:0050F46A     STREQB   R3, [R0,R1] 

__text:0050F46C     B    loc_50F578 ; jumptable 0050F522 default case 

从料斗中的伪代码:

r2 = ""\\xB1;\\xF4\\xB8;\\xAD\\xBB\\r\\r\\xB8\\xAD\\xF4;\\r|Y\\xAD\\xAD\\xB8\\x9Fs\\xBBj\\xB2\\r\\xAD\\xB3\\xD8;\\xB3fs\\xD8\\xB2\\xB8\\xD8\\x9F\\xF4fs|Yj\\xBBY\\xD8\\xBB\\xF4\\xF4\\xB1j\\xB1\\xAD\\xF4f\\xAD\\xB1\\xD8Y;\\xB8\\xF4\\xBB\\xF4";" 

r8 = *(r2 + r1); 
*(r0 + r1) = r8; 
if (r8 > 0x3a) goto loc_50f46e; 

我不明白的是变量,其类型值将被加载到r2寄存器中。如果r2包含一个十六进制字符串,那么我应该将其转换为NSData?当与0x3A进行比较时,这意味着什么?他们是否将数据的大小与0x3A进行比较(假设为十进制数为58)。

对不起,如果这是非常天真的。正如我所说我是新人,并试图学习。

1

你要看到三个指令

MOVW   R2, #(:lower16:(aNNYnnQsJNFsQFs - 0x50F440)) ; "¦;(+;¡+\r\r+¡(;\r|Y¡¡+ƒs+j¦\r¡¦+;¦fs+¦+"... 
MOVT.W   R2, #(:upper16:(aNNYnnQsJNFsQFs - 0x50F440)) ; "¦;(+;¡+\r\r+¡(;\r|Y¡¡+ƒs+j¦\r¡¦+;¦fs+¦+"... 
ADD    R2, PC ; "¦;(+;¡+\r\r+¡(;\r|Y¡¡+ƒs+j¦\r¡¦+;¦fs+¦+"... 

在一起。 MOVWMOVT.W将字符串的相对地址加载到R2;在ARM上添加PC是使代码和数据位置无关的标准方式,因此加载器不必调整到加载地址。

因此,这些指令使R2指向字符串。 '|(+; ......'

还要注意的是R1被初始化为0。

loc_50F456 - 我假设是循环开始 - 指令从R2字符串获得一个字节到R8,并将该字节写入另一个字符串R0。由于R0还没有初始化,所以它可能是一个函数参数请注意,LDRBSTRB操作码索引与R1中除了R0。这是典型的循环,从R2复制到R0R1每次增加。

之后,R8仍然保存来自R2字符串的字节。将它与0x3A比较意味着将它与十进制58进行比较,是的。但是,由于该字节源自一个由ASCII字符组成的字符串,因此应该查找用于0x3A的ASCII字符,即:。所以BGT是在任何字符'比'更大,包括字母和一些标点符号,但不包括数字。接下来,代码将字符与0x0D进行比较 - 回车 - 这是\r,并且会在您的字符串中出现好几次。如果它\r,则它将被替换为R3的值,该值早先已经初始化为0x36,这是ASCII数字6

loc_50F46E,你可能会有更多的代码以某种方式破坏你的信件。

在我看来,这似乎是密码检查程序或序列号检查程序的一部分,其中密码在代码中被加密,所以简单的strings命令不会显示它。

顺便说一句,如果您正在学习,在调试器中单步运行并检查每个步骤后每个寄存器包含的内容通常要简单得多。根据我的经验,这可以帮助您更快地了解发生的事情,而不仅仅是查看代码,特别是如果您不熟悉每个操作码的作用。

另外,不要依靠重新编译到C或类似的东西。无论反编译器产生什么是近似值,并且通常不会很好地与原始代码相似。一旦你能够读取程序集,C语言编译将使你更快地理解代码结构,但是如果你不了解程序集并尝试使用它,它将会令你非常困惑。

  0

非常感谢您的回答和快速回复。我相信这会帮助我学习更多东西。我会尝试调试它,但我不确定是否可以在使用IDA pro的ios应用程序上执行它(即使我有越狱设备)。如果可能的话,让我知道它是,我会花时间做这件事,因为我真的想学习这些东西。它是如此令人兴奋。再次感谢您的详细解答。 30 6月. 152015-06-30 09:15:57

  0

IDA pro不附带ios调试服务器,但它也可以使用gdbserver。互联网上有一些关于gdbserver和ios的资源。但是,我从来没有使用ios或苹果设备,所以我不能真正说出它的效果如何。 30 6月. 152015-06-30 10:06:31

  0

好的没问题。你有很大的帮助。非常感谢。请不要介意当我再次陷入某处时我是否会误报你。 :) 30 6月. 152015-06-30 10:11:58

  0

不要bug我,问一个新的问题。我一整天都不在这里,根据问题,其他人可能会提供比我更好的帮助。 30 6月. 152015-06-30 10:16:16