第58章 调用宏assert()(中文称为断言)

一般来讲,assert()宏在可执行文件中保留了源代码的文件名、行数以及执行条件。

最有价值的信息是assert()宏的执行条件。我们可以通过它们来推断出变量名或者结构体的字段名称。另外一个有用的信息是文件名,通过它我们可以推断出源代码是采用什么语言编写的。同时我们还可能通过文件名来识别出其是否采用了知名的开放源代码库。

指令清单58.1 调用assert()宏的例子

.text:107D4B29   mov    dx, [ecx+42h]
.text:107D4B2D   cmp    edx, 1
.text:107D4B30   jz     short loc_107D4B4A
.text:107D4B32   push   1ECh
.text:107D4B37   push   offset aWrite_c ; "write.c"
.text:107D4B3C   push   offset aTdTd_planarcon ; "td->td_planarconfig == PLANARCONFIG_CON"...
.text:107D4B41   call   ds:_assert

...

.text:107D52CA   mov    edx, [ebp-4]
.text:107D52CD   and    edx, 3
.text:107D52D0   test   edx, edx
.text:107D52D2   jz     short loc_107D52E9
.text:107D52D4   push   58h
.text:107D52D6   push   offset aDumpmode_c ; "dumpmode.c"
.text:107D52DB   push   offset aN30    ; "(n & 3) == 0"
.text:107D52E0   call   ds:_assert

...

.text:107D6759   mov    cx, [eax+6]
.text:107D675D   cmp    ecx, 0Ch
.text:107D6760   jle    short loc_107D677A
.text:107D6762   push   2D8h
.text:107D6767   push   offset aLzw_c    ; "lzw.c"
.text:107D676C   push   offset aSpLzw_nbitsBit ; "sp->lzw_nbits <= BITS_MAX"
.text:107D6771   call   ds:_assert

最简单的分析方法就是用google来搜索条件和文件名。搜索结果显示这与开源的库文件有关。比如说,搜索字符串“sp->lzw_nbits <= BITS_MAX”,我们就它与压缩算法LZW的开源代码相关。