w$ý The values in yellow are directions of memory within the code of our feasible one, the values in green are the bytes that will be written in the zones that indicate the yellow bytes,
Trang 1Vùng này có thể khác trên máy bạn, nếu chú ý đến giá trị đánh dấu đầu tiên nó
là direction mà ở đó 4 bytes đã đươc thay thế của lệnh jump đầu tiên goto đến 031C0000, 4 bytes theo sau trong zone này của memory (2002DBEB) là giá trị
đã được viết vào vùng đã đươc chỉ định bởi 4 bytes trước (004014C4) đó, kết luận lại ta có như sau
00EC5908 C4 14 40 00 38 EB DB 02 20 00 1C 03 A4 14 24 FD Ä@.8ëÛ1[1]
¤$ý
00EC5918 D7 14 40 00 49 EB DB 02 31 00 1C 03 A6 14 24 FD
×@.IëÛ1[1]1
¦$ý
00EC5928 F3 14 40 00 3E EB DB 02 51 00 1C 03 A2 14 24 FD ó@.>ëÛ1[1]Q
¢$ý
00EC5938 06 15 40 00 4B EB DB 02 6A 00 1C 03 9C 14 24 FD
@.KëÛ1[1]j
œ$ý
00EC5948 1F 15 40 00 4B EB DB 02 8C 00 1C 03 93 14 24 FD
-@.KëÛ1[1]Œ
“$ý
00EC5958 2C 15 40 00 60 EB DB 02 B5 00 1C 03 77 14 24 FD ,@.`ëÛ1[1]µ
w$ý
The values in yellow are directions of memory within the code of our feasible one, the values in green are the bytes that will be written in the zones that indicate the yellow bytes, corresponding one to one, the same happens with the values in turquesa, single that these are in the zone of the code of the CodeSplicing and their corresponding values are those that are in fucsia
Gía trị màu vàng (yellow) là directions của memory chứa code có thể thực thi của chúng ta, các gtrị màu xanh lá cây (green) là các bytes sẽ đươc written vào vùng zones đươc chỉ định bởi các bytes màu vàng (yellow) trước đó, tương tự
Trang 2tương ứng một- một như xảy ra với các giá trị màu ngọc lam (turquesa), đơn giản là chúng ở trong vùng code của CodeSplicing (ghép nối code) và tương ứng các giá trị của chúng là các giá trị màu hồng đỏ (fucsia)
With this table we can redirigir the jumps of the zone of code of our feasible one and that correspond with the jumps of the code of the CodeSplicing in any zone of memory which we choose, this table weapon in run time, so we put a Breakpoint, Hardware, on write, Dword in the direction 00EC595C, I choose a direction but under the beginning of the table so that sometimes this table moves a little upwards
or downwards, therefore if the table moves bytes downwards the Breakpoint will even be in a good zone
Với bảng table này, chúng ta có thể redirect lại các lệnh jumps của vùng code trong vùng memory có thể thực thi đươc, và tương hợp với các jumps của vùng code của CodeSplicing trong bất kỳ vùng nhớ nào mà chúng ta muốn chọn lựa, table này sinh ra lúc chương trình run time, vì vậy chúng ta put một Breakpoint, Hardware, on write, Dword tại direction 00EC595C, tôi chọn một direction nằm dưới điểm đầu của table do đôi khi table này dịch chuyển lên trên hay xuống dưới 1 chút, vì vậy nếu table dịch chuyển xuống dưới các bytes một chút thì bp sẽ nằm ngay tại vùng good zone tức là vùng set bp có tác dụng
Let us close the Olly, we return to open it, we load ours app, we hide dbg, we give
a F9 and for some times putting values sweepings, we continue pressing F9 until it stops in
Chúng ta close olly, mở lại olly một lần nữa, load app vào, hide dbg, nhấn F9 và vài lần chương put các giá trị vào tại vị trí chúng ta set bp và chúng ta tiếp tục nhấn F9 cho đến khi dừng lại tại
003D4DB0 8985 4CC6FFFF MOV DWORD PTR SS:[EBP-39B4],EAX
003D4DB6 8B85 4CC6FFFF MOV EAX,DWORD PTR SS:[EBP-39B4]
003D4DBC 8B8D 2CC6FFFF MOV ECX,DWORD PTR SS:[EBP-39D4]
003D4DC2 8908 MOV DWORD PTR DS:[EAX],ECX
003D4DC4 8B85 4CC6FFFF MOV EAX,DWORD PTR SS:[EBP-39B4]
003D4DCA 83C0 04 ADD EAX,4
003D4DCD 8985 4CC6FFFF MOV DWORD PTR SS:[EBP-39B4],EAX
003D4DD3 8B85 24C6FFFF MOV EAX,DWORD PTR SS:[EBP-39DC]
003D4DD9 8B8D 08C7FFFF MOV ECX,DWORD PTR SS:[EBP-38F8]
003D4DDF 8D4401 04 LEA EAX,DWORD PTR DS:[ECX+EAX+4]
Trang 300EC5940 B5 00 DE 02 77 14 62 FD µ.Þ1[1]wbý
00EC5948 DF 16 40 00 D6 E9 9D 02 ß@.Öé 1[1]
00EC5950 CD 00 DE 02 12 16 62 FD Í.Þ1[1]bý
00EC5958 EC 16 40 00 E1 E9 9D 02 ì@.áé 1[1]
00EC5960 0D F0 AD BA 0D F0 AD BA ðº.ðº
00EC5968 0D F0 AD BA 0D F0 AD BA ðº.ðº
00EC5970 0D F0 AD BA 0D F0 AD BA ðº.ðº
This is the zone that we looked for, in the desensamblado one we press F8 until arriving a
Đây là vùng chúng ta đã tìm thấy lúc trước, trong cửa sổ deassembler chúng ta nhấn F8 cho đến
003D4D4D 8985 44C6FFFF MOV DWORD PTR SS:[EBP-39BC],EAX
003D4D53 8B85 44C6FFFF MOV EAX,DWORD PTR SS:[EBP-39BC]
003D4D59 8B00 MOV EAX,DWORD PTR DS:[EAX]
003D4D5B 8985 28C6FFFF MOV DWORD PTR SS:[EBP-39D8],EAX
003D4D61 8B85 44C6FFFF MOV EAX,DWORD PTR SS:[EBP-39BC]
003D4D67 83C0 04 ADD EAX,4
003D4D6A 8985 44C6FFFF MOV DWORD PTR SS:[EBP-39BC],EAX
003D4D70 A1 B0F13E00 MOV EAX,DWORD PTR DS:[3EF1B0]
003D4D75 0385 20C6FFFF ADD EAX,DWORD PTR SS:[EBP-39E0]
003D4D7B 8B8D 24C6FFFF MOV ECX,DWORD PTR SS:[EBP-39DC]
003D4D81 8B95 08C7FFFF MOV EDX,DWORD PTR SS:[EBP-38F8]
003D4D87 8D4C0A 04 LEA ECX,DWORD PTR DS:[EDX+ECX+4]
003D4D8B 2BC1 SUB EAX,ECX
003D4D8D 8985 2CC6FFFF MOV DWORD PTR SS:[EBP-39D4],EAX
In the noticeable line it is where the value is taken bases of the zone of memory where it is the code of the CodeSplicing and with this base the table was created to redirigir the jumps of the two zones so that they correspond, a little but down there are but references to this zone of memory [003EF1B0], but we single looked for first that this in the direction 003D4D70, let us clear the Breakpoint Hardware that
we put in 00EC595C, let us put a Breakpoint Hardware on execution in the line where the base is taken from the CodeSplicing that is 003D4D70, before closing the Olly we put another Breakpoint Hardware on execution in the direction where the curl of the creation of the table of the CodeSplicing finishes that is in
Trang 4Trong dòng ghi chú màu vàng trên chính là nơi lấy giá trị Base của vùng nhớ ở
đó chứa code của CodeSplicing và với base này table đươc redirect lại các jumps của 2 vùng tương ứng nhau như ta đã biết ở trên, xít xuống dưới 1 chút có các tham chiếu đến vùng nhớ này [003EF1B0], nhưng chúng ta chỉ đơn giản là cần quan tâm đến chỉ thị đầu tiên tham chiếu đến nó mà thôi đó là dòng chỉ thị tại addr 003D4D70, chúng ta sẽ clear các BPH mà chúng ta put tại 00EC595C, chúng ta sẽ put Breakpoint Hardware on execution tại chỉ thị mà base đươc lấy
từ CodeSplicing là 003D4D70, trước khi đóng olly chúng ta put một bp khác Breakpoint Hardware on execution tại direction mà ở đó vòng lặp cài đặt table của CodeSplicing kết thúc, chính là direction sau:
003D4E2B 8B85 4CC6FFFF MOV EAX,DWORD PTR SS:[EBP-39B4]
003D4E31 83C0 04 ADD EAX,4
003D4E34 8985 4CC6FFFF MOV DWORD PTR SS:[EBP-39B4],EAX
003D4E3A ^E9 C8FEFFFF JMP 003D4D07
003D4E3F 8B85 4CC6FFFF MOV EAX,DWORD PTR SS:[EBP-39B4]
003D4E45 8320 00 AND DWORD PTR DS:[EAX],0
003D4E48 8B85 4CC6FFFF MOV EAX,DWORD PTR SS:[EBP-39B4]
003D4E4E 83C0 04 ADD EAX,4
003D4E51 8985 4CC6FFFF MOV DWORD PTR SS:[EBP-39B4],EAX
003D4E57 FF15 80F03D00 CALL DWORD PTR DS:[3DF080] ; kernel32.GetTickCount
Now we closed the Olly, we return it to open, we loaded ours app, we hide dbg, we give F9 and stops in
Bây giờ chúng ta close olly, chúng ta quay trở lại open nó, load app vào, hide dbg, nhấn F9 và dừng lại tại :
003D4D67 83C0 04 ADD EAX,4
003D4D6A 8985 44C6FFFF MOV DWORD PTR SS:[EBP-39BC],EAX
003D4D70 A1 B0F13E00 MOV EAX,DWORD PTR DS:[3EF1B0]
003D4D75 0385 20C6FFFF ADD EAX,DWORD PTR SS:[EBP-39E0]
003D4D7B 8B8D 24C6FFFF MOV ECX,DWORD PTR SS:[EBP-39DC]
In the Dump we go to the zone of memory 003EF1B0 and we will see
Trong Dump chúng ta goto đến vùng nhớ 003EF1B0 và chúng ta sẽ thấy
Trang 5003EF1B0 00 00 96 01 00 00 00 00 –
003EF1B8 00 00 00 00 00 00 00 00
003EF1C0 00 00 00 00 00 00 00 00
003EF1C8 00 00 00 00 00 00 00 00
003EF1D0 00 00 00 00 00 00 00 00
This is new base 01960000, now is necessary to modify this value so that it aims at
a zone within our feasible one, we see the Memory Map to see that section we can use
Đây là một new base 01960000 (máy của người dịch khác, chúng ta nên nhớ base này), bây giờ chúng ta cần thiết thay đổi giá trị này đê nó trỏ đến vùng nhớ
có khả năng thực thi của chúng ta, chúng ta thấy trong win Memory Map các section chúng ta có thể dùng
Memory map Address Size Owner Section Contains Type Access Initial
00400000 00001000 uedit32 PE header Imag R RWE
00401000 0015D000 uedit32 .text Imag R RWE
0055E000 00039000 uedit32 .rdata Imag R RWE
00597000 0004A000 uedit32 .data Imag R RWE
005E1000 00001000 uedit32 .SHARED data Imag R RWE 005E2000 00030000 uedit32 .text1 code Imag R RWE
00612000 00010000 uedit32 .adata code Imag R RWE
00622000 00020000 uedit32 .data1 imports Imag R RWE
00642000 00110000 uedit32 .pdata Imag R RWE
00752000 0006F000 uedit32 .rsrc resources Imag R RWE
We cannot use the section adata since in that memory the IAT was armed, we cannot use data1 so that there there are imports that we needed, the obvious section
is text1, as they remembered we used the zone of memory that goes from 005E2000 even 005F0000, exactly for that it clears it until arriving at I number now that it finished in 4 zeros, if see the size is 30000 and we single used E000 reason why still we have left 22000 and the code of the single CodeSplicing measures 20000 so we have 2000 bytes very well
Chúng ta ko thể dùng section adata vì nó đã chứa IAT, chúng ta ko thể dùng section data1 vì ở đó có các imports mà chúng ta cần dùng , rõ ràng là chỉ còn section text1, chúng hảy nhớ lại một chút, chúng ta đã sử dụng vùng nhớ này từ addr 005E2000 đến 005F0000, bây giờ tôi sẽ tính tóan một cách chính xác để
Trang 6bạn hiểu rõ ràng hơn vấn đề,addr có các số sau cùng là 4 số zeros, size của section như ta thấy là 30000 và chúng ta chỉ sử dụng E000 bytes (005F0000-005E2000=E000), vậy còn dư là 22000 bytes (30000-E000=22000) và code của CodeSplicing cần 20000 bytes , vì vậy chúng ta còn dư thừa đến 2000 bytes, quá tốt rồi
Let us modify the memory in 003EF1B0 so that it points a 005F0000 and it is thus
Chúng ta thay đổi vùng nhớ tại 003EF1B0 để nó trỏ đến 005F0000 và vì vậy sẽ
là
003EF1B0 00 00 5F 00 00 00 00 00 _
003EF1B8 00 00 00 00 00 00 00 00
003EF1C0 00 00 00 00 00 00 00 00
003EF1C8 00 00 00 00 00 00 00 00