Page 10
Under the Hashing section, both MD5 sums are missing their final digit. They read 373e7a863a1a345c60edb9e20ec3231
, but should instead read 373e7a863a1a345c60edb9e20ec32311
.
Page 54
Figure 3-10 should look like this:

Page 66
In Figure 4-1, "move" should be "mov".
Page 74
The text "...instruction such as lea ebx, [eax*5+5], where eax is a number, rather than a memory address. This instruction is the functional equivalent of ebx = (eax+1)*5, but the former is shorter or more efficient for the compiler to use instead of a total of four instructions (for example inc eax; mov ecx, 5; mul ecx; mov ebx, eax)."
should read as:
"instruction such as lea ebx, [eax*4+4], where eax is a number, rather than a memory address. This instruction is the functional equivalent of ebx = (eax+1)*4, but the former is shorter or more efficient for the compiler to use instead of a total of four instructions (for example inc eax; mov ecx, 4; mul ecx; mov ebx, eax)."
Page 76
xhcg eax, eax
should be xchg eax, eax.
Page 79
In Figure 4-8, the stack layout reads
Local Variable N
...
Local Variable 1
Local Variable 2
Old EBP
Return Address
Argument 1
Argument 2
...
Argument N
It should read
Local Variable N
...
Local Variable 2
Local Variable 1
Old EBP
Return Address
Argument 1
Argument 2
...
Argument N
Page 82
In the last paragraph, "This works in the same way as cmpsb, but it compares the byte located at address ESI to AL, rather than to EDI" should read "This works in the same way as cmpsb, but it compares the byte located at address EDI to AL, rather than to ESI."
Page 110
In Listing 6-1, the word "Total" should be "total" with a lowercase 't'.
Page 111
In Listing 6-2, the word "Total" should be "total" with a lowercase 't'.
And in Listing 6-4, the first two lines read:
00401006 mov dword ptr [ebp-4], 0
0040100D mov dword ptr [ebp-8], 1
They should instead read:
00401006 mov dword ptr [ebp-4], 1
0040100D mov dword ptr [ebp-8], 2
Page 112
In Listing 6-5, the first two lines read:
00401006 mov dword ptr [ebp-4], 0
0040100D mov dword ptr [ebp-8], 1
They should instead read:
00401006 mov dword ptr [ebp-4], 1
0040100D mov dword ptr [ebp-8], 2
Page 148
Paragraph 3 reads, "The lpStartupInfo
structure for the process stores the standard output (1), standard input (2), and standard error (3) that will be used for the new process." It should instead read, "The lpStartupInfo
structure for the process stores the standard output (2), standard input (3), and standard error (1) that will be used for the new process."
Page 178
"and 0x411001
if the language is Chinese" should read "and 0x41100A
if the language is Chinese".
Page 237
For technical accuracy, Listing 11-2 should include 5 additional "..." breaks. It currently reads:
1000123F push offset LibFileName ; "samsrv.dll"
10001244 call esi ; LoadLibraryA
10001248 push offset aAdvapi32_dll_0 ; "advapi32.dll"
...
10001251 call esi ; LoadLibraryA
...
1000125B push offset ProcName ; "SamIConnect"
10001260 push ebx ; hModule
10001265 call esi ; GetProcAddress
...
10001281 push offset aSamrqu ; "SamrQueryInformationUser"
10001286 push ebx ; hModule
1000128C call esi ; GetProcAddress
...
100012C2 push offset aSamigetpriv ; "SamIGetPrivateData"
100012C7 push ebx ; hModule
100012CD call esi ; GetProcAddress
...
100012CF push offset aSystemfuncti ; "SystemFunction025"
100012D4 push edi ; hModule
100012DA call esi ; GetProcAddress
100012DC push offset aSystemfuni_0 ; "SystemFunction027"
100012E1 push edi ; hModule
100012E7 call esi ; GetProcAddress
But it should look like the following:
1000123F push offset LibFileName ; "samsrv.dll"
10001244 call esi ; LoadLibraryA
...
10001248 push offset aAdvapi32_dll_0 ; "advapi32.dll"
...
10001251 call esi ; LoadLibraryA
...
1000125B push offset ProcName ; "SamIConnect"
10001260 push ebx ; hModule
...
10001265 call esi ; GetProcAddress
...
10001281 push offset aSamrqueryinfor ; "SamrQueryInformationUser"
10001286 push ebx ; hModule
...
1000128C call esi ; GetProcAddress
...
100012C2 push offset aSamigetprivate ; "SamIGetPrivateData"
100012C7 push ebx ; hModule
...
100012CD call esi ; GetProcAddress
100012CF push offset aSystemfunction ; "SystemFunction025"
100012D4 push edi ; hModule
...
100012DA call esi ; GetProcAddress
100012DC push offset aSystemfuncti_0 ; "SystemFunction027"
100012E1 push edi ; hModule
...
100012E7 call esi ; GetProcAddress
Page 258
In the first line of Listing 12-3, CREATE_SUSPEND
should read CREATE_SUSPENDED
.
Page 263
In the first paragraph, in the second to last sentence, "Sleep" should instead read "SleepEx".
Page 290
In Listing 13-10, it should be cbuf = cfile.read()
instead of cbuf = f.read()
Page 338
The "JZ -7" in Figure 15-5 should be "JZ -6" and the opcodes underneath that text should be "74 FA" instead of "74 F9".
The 3rd line of the bottom listing should read 74 FA jz short near ptr sub_4011C0+2
instead of 74 F9 jz short near ptr sub_4011C0+1
.
Page 339
The 7th line of the top listing should read FA db 0FAh
instead of F9 db 0F9h.
Page 363
In the "Inserting INT 2D" section, Listing 16-10 is referenced. It should reference Listing 16-9.
Page 376
Tthe text "0x5668" should be "0x5658". This happens twice on the page once in the first paragraph and once in the third paragraph.
Page 440
In Question #3, the text reads “At 0x4036F0, there is a function call that takes the string…” but it should read “The function 0x4036F0 is called multiple times and each time it takes the string…”.
Page 447
Change the two instances of "\WOW64" to "\SysWOW64"
Page 448
Change the "C:\Windows\WOW64" to "C:\Windows\SysWOW64"
Page 471
The link to download PEview reads "http://www.magma.ca/~wjr/"; it has been updated and should now read "http://wjradburn.com/software/"
Page 499
In the first paragraph, "View -> Graphs -> Xrefs From" should read "View -> Graphs -> User Xrefs Chart".
Page 514
The last sentence of the page should read "If the call succeeds, the program exits" instead of "If the call fails, the program exits".
Page 523
The middle paragraph should read "function to sleep for about 394 seconds" instead of "function to sleep for 60 seconds."
Page 566
"If you perform a full analysis of 0x4025120
" should be "If you perform a full analysis of 0x402510
"
Page 649
At the beginning of the second paragraph, "The two functions (sub_4012F2 and sub_401369)
" should instead read "The two functions (sub_40130F and sub_401386)
".
Page 651
In Listing 15-12L (as well as in the disassembly of the corresponding lab) there was a bug in the original program. There should be an add edx, 8
between lines 00401202
and 00401208
.
Page 675
The text "0x5668" should be "0x5658".
Page 680
End of paragraph 2 should read “…on page 678.” instead of “…on page 670.”