A Aldeia Numaboa ancestral ainda está disponível para visitação. É a versão mais antiga da Aldeia que eu não quis simplesmente descartar depois de mais de 10 milhões de pageviews. Como diz a Sirley, nossa cozinheira e filósofa de plantão: "Misericórdia, ai que dó!"

Se você tiver curiosidade, o endereço é numaboa.net.br.

Leia mais...

Oficina

kiTo KGNmeAGAiN (C-1)

Seg

28

Ago

2006


10:20

(7 votos, média 5.00 de 5) 


Debugando passo a passo

A rotina que nos interessa é mostrada a seguir:

00401115  |. 6A 32          PUSH 32                        ; /Count = 32 (50.)
00401117  |. 68 70324000    PUSH kiToKGNm.00403270         ; |Buffer = kiToKGNm.00403270
0040111C  |. 68 E9030000    PUSH 3E9                       ; |ControlID = 3E9 (1001.)
00401121  |. FF75 08        PUSH DWORD PTR SS:[EBP+8]      ; |hWnd
00401124  |. E8 E3080000    CALL <JMP.&user32.GetDlgItemTextA> ; \GetDlgItemTextA
00401129  |. 68 A2324000    PUSH kiToKGNm.004032A2
0040112E  |. 50             PUSH EAX
0040112F  |. 68 70324000    PUSH kiToKGNm.00403270
00401134  |. E8 67070000    CALL kiToKGNm.004018A0
00401139  |. 68 A2324000    PUSH kiToKGNm.004032A2         ; /StringToAdd = ""
0040113E  |. 68 D4324000    PUSH kiToKGNm.004032D4         ; |ConcatString = ""
00401143  |. E8 A0080000    CALL <JMP.&kernel32.lstrcatA>  ; \lstrcatA
00401148  |. 68 3E324000    PUSH kiToKGNm.0040323E         ; /StringToAdd = "NTE0MDA4MjhOVEUwTURBNE=="
0040114D  |. 68 D4324000    PUSH kiToKGNm.004032D4         ; |ConcatString = ""
00401152  |. E8 91080000    CALL <JMP.&kernel32.lstrcatA>  ; \lstrcatA
00401157  |. 68 D4324000    PUSH kiToKGNm.004032D4         ; /String = ""
0040115C  |. E8 93080000    CALL <JMP.&kernel32.lstrlenA>  ; \lstrlenA
00401161  |. A3 A0314000    MOV DWORD PTR DS:[4031A0],EAX
00401166  |. E8 3D060000    CALL kiToKGNm.004017A8
0040116B  |. FF35 A0314000  PUSH DWORD PTR DS:[4031A0]
00401171  |. 68 D4324000    PUSH kiToKGNm.004032D4
00401176  |. E8 6D060000    CALL kiToKGNm.004017E8
0040117B  |. E8 C8060000    CALL kiToKGNm.00401848
00401180  |. 33DB           XOR EBX,EBX
00401182  |. 0318           ADD EBX,DWORD PTR DS:[EAX]
00401184  |. 0358 04        ADD EBX,DWORD PTR DS:[EAX+4]
00401187  |. 0358 08        ADD EBX,DWORD PTR DS:[EAX+8]
0040118A  |. 0358 0C        ADD EBX,DWORD PTR DS:[EAX+C]
0040118D  |. 53             PUSH EBX                       ; /<%X>
0040118E  |. 68 00304000    PUSH kiToKGNm.00403000         ; |Format = "%X"
00401193  |. 68 38334000    PUSH kiToKGNm.00403338         ; |s = kiToKGNm.00403338
00401198  |. E8 5D080000    CALL <JMP.&user32.wsprintfA>  ; \wsprintfA
0040119D  |. 83C4 0C        ADD ESP,0C
004011A0  |. C605 3C334000 >MOV BYTE PTR DS:[40333C],2D
004011A7  |. 6A 32          PUSH 32                        ; /Count = 32 (50.)
004011A9  |. 68 6A334000    PUSH kiToKGNm.0040336A         ; |Buffer = kiToKGNm.0040336A
004011AE  |. 68 EA030000    PUSH 3EA                       ; |ControlID = 3EA (1002.)
004011B3  |. FF75 08        PUSH DWORD PTR SS:[EBP+8]      ; |hWnd
004011B6  |. E8 51080000    CALL <JMP.&user32.GetDlgItemTextA> ; \GetDlgItemTextA
004011BB  |. 68 6A334000    PUSH kiToKGNm.0040336A         ; /String2 = ""
004011C0  |. 68 38334000    PUSH kiToKGNm.00403338         ; |String1 = ""
004011C5  |. E8 24080000    CALL <JMP.&kernel32.lstrcmpA> ; \lstrcmpA
004011CA  |. C9             LEAVE
004011CB  \. C2 0400        RETN 4

Acompanhe o passo a passo:

  1. F7 - Põe o valor 32h (50 decimal) na pilha (o painel da pilha é o inferior direito).
  2. F7 - Põe na pilha o endereço do buffer.
  3. F7 - Põe na pilha o ID de controle 3E9.
  4. F7 - Põe na pilha o manipulador da janela do executável.
  5. F8 - Tudo o que foi feito nos passos anteriores foi para preparar uma chamada à função GetDlgItemTextA. Use F8 para executar a função sem sair da linha de execução na qual nos encontramos. Observe que logo depois de retornar, a linha 0040112F mostra uma string com o nome do usuário,
    0040112F  |. 68 70324000    PUSH kiToKGNm.00403270
       mostra
    0040112F  |. 68 70324000    PUSH kiToKGNm.00403270         ;  ASCII "teste"
      
    que a pilha foi realinhada com a retirada dos valores previamente inseridos e que o registrador EAX mostra o comprimento do nome.
  6. F7 - Põe na pilha o endereço 004032A2.
  7. F7 - Põe na pilha o valor de EAX (comprimento do nome).
  8. F7 - Põe na pilha o nome do usuário (teste).
  9. F8 - Chama uma subrotina em 004018A0. Na volta da subrotina a pilha está novamente alinhada e agora a linha
  10. 00401139  |. 68 A2324000    PUSH kiToKGNm.004032A2                   ; /StringToAdd = ""
       mostra
    00401139  |. 68 A2324000    PUSH kiToKGNm.004032A2                   ; /StringToAdd = "dGVzdGU="
      

Pausa para meditação: depois desta chamada, a string que deve ser adicionada é dGVzdGU=. Novamente está com jeito de codificação Base64 e meu palpite é que o nome do usuário foi codificado. Mais uma vez, rode o Base64 Enconder & Decoder e confira. UAU! É isto mesmo! Base64 de "teste" é "dGVzdGU=". Neste caso, a rotina que faz a codificação deve estar localizada no endereço 004018A0. Vamos guardar este endereço e explorá-lo mais tarde.

Informações adicionais