文本字符串

我发现在文本字符串使用可能会很有用,程序员意识某字符串不想被逆向工程的时候,可能会试图隐藏掉该字符串,让IDA或者其他十六进制编辑器无法找到。 这里说明一个简单的方法,那就是怎么去构造这样的字符串的实现方式:

  1. mov byte ptr [ebx], h
  2. mov byte ptr [ebx+1], e
  3. mov byte ptr [ebx+2], l
  4. mov byte ptr [ebx+3], l
  5. mov byte ptr [ebx+4], o
  6. mov byte ptr [ebx+5],
  7. mov byte ptr [ebx+6], w
  8. mov byte ptr [ebx+7], o
  9. mov byte ptr [ebx+8], r
  10. mov byte ptr [ebx+9], l
  11. mov byte ptr [ebx+10], d

当两个字符串进行比较的时候看起来是这样:

  1. mov ebx, offset username
  2. cmp byte ptr [ebx], j
  3. jnz fail
  4. cmp byte ptr [ebx+1], o
  5. jnz fail
  6. cmp byte ptr [ebx+2], h
  7. jnz fail
  8. cmp byte ptr [ebx+3], n
  9. jnz fail
  10. jz it_is_john

在这两种情况下,是不可能通过十六进制编辑器中找到这些字符串的。

顺便提一下,这种方法使得字符串不可能被分配到程序的代码段中。在某些场合可能会用到,比如,在PIC或者在shellcode中。

另一种方法是,我曾经看到用sprintf()构造字符串。

sprintf(buf, "%s%c%s%c%s", "hel",’l’,"o w",’o’,"rld");

代码看起来比较怪异,但是做为一个简单的防止逆向工程确实一个有用的方法。 文本字符串也可能存在于加密的形式,那么所有字符串在使用前比较闲将字符串解密了。