単純な暗号化シェルコード解析

00438450> 55のPUSH EBP 
00438451 8becのMOV EBP ESP、
00438453 83EC 0℃SUB ESP、から0xC
//最初の呼び出しがパラメータを認められなかっ戻り値のEAXが使用されていない、我々は、この呼び出しはパラメータはありませんし、値を返さない見ることができ
、//すなわちC言語==、ボイド楽しい(無効)で、観測に入ります。(CALL-004383A0注1)
00438456 E8 45FFFFFF CALL 02.004383A0、初期化関数アドレス
0043845B A1 40804300 MOV EAX、DWORD PTR DS:[0x438040]; 画像ベース取得
00438460 0305 44804300のADD EAX、DWORD PTR DSを:; [0x438044] プレゼントRVAのコード
機能後//推測は、このデータに先立って初期化されなければなりません。F8 MOV DWORD PTR 8945 00438466 SS:[EBP-0x8という]、EAX 00438469 C745 0000000 FC> MOV DWORD PTR SS:[EBP-を0x4]、0x0の00438470 8D4D LEA ECX FC、PTR DWORD SS:[EBP-を0x4]




51 ECX PUSH 00438473さ
00438474 40(a)0x40のPUSH
00438476 8B15 4C804300 MOV EDX、PTR DWORD DS:[0x43804C]
//変更されたアドレスコードベース
0043847C 52はPUSH EDXある
[EBP-0x8という:0043847D EAX MOV 8B45 F8、PTR DWORD SS ]
00438480 50 PUSH EAX
//ここでは、あなたがそのパラメータです数行のコードに推測ページのプロパティを、変更する可能性があることを示す、VirtualProtct機能を確認してください。
C0924300 CALL DWORD PTR FF15 00438481 DS:[0x4392C0]; DS:[004392C0] = 764750AB(kernel32.VirtualProtect)
00438487 E8 04FEFFFF CALL 02.00438290
0043848C FC 8D4D ECX LEA、PTR DWORD SS:[EBP-を0x4]
PUSH 51は0043848F ECX
00438490 8B55 MOV EDX FC、PTR DWORD SS:[EBP-を0x4]
00438493 52は、PUSH EDXあります
A1は4C804300 EAX MOV 00438494、PTR DWORD DS:[0x43804C]
00438499 50 PUSH EAX
0043849A MOV 8B4D ECX F8、PTR DWORD SS:[EBP-0x8という]
0043849D 51は、ECXがPUSHである
//フルーツ予期せVirtualProtectもあり、これがなければなりませんこれは、プロパティページを復元することです。
//最初のVirtualProtectは、コードが変更された見つけるために、その上にステップ次いで、それを監視、コードベースを変更し、そしてので。
//中間これら二つの関数がコール00438290は、に入る変更してもよい(呼び出し00438290注2)
0043849E PTR FF15 C0924300 CALLのDWORD DS:[0x4392C0]; DS:[004392C0] = 764750AB(kernel32.VirtualProtect)を//ここでは、メッセージボックスで004384A4 6A 04 PUSHの0x4には、004384A6 68 2C814300 PUSH 02.004381​​2C; ASCIIは"こんにちは15PB"




004384AB 68 38814300 PUSH 02.004381​​38; ASCII "は?メインプログラムを実行している、パッカーを解放するためにようこそ"
004384B0 6A 00 PUSH 0x0の
004384B2 CALL DWORD PTR DS FF15 BC924300:[0x4392BC]; user32.MessageBoxA
004384B8 MOV DWORD PTR SS 8945 F4:[ 0xC-EBP]、EAX
004384BB 837D CMP DWORD PTR SS 06 F4:[EBP-から0xC]、0x6に;そうかどうかを判断するために戻る
004384BF 75 0B JNZ SHORT 02.004384CC
//ここでは、メッセージボックスの終わりである004384C1 E8 1A000000 CALL 02.004384E0 //しかし、この発見は、IAT(4-IAT図の暗号化注)暗号化されているとき、(図の点に注意してください。3-OEP)OEPにここにある//そして、この中間はコール004384E0暗号化の前にあってもよいです。(注-CALL 004384E0 5)に入るOEP入口; 0x43803C]:FF25 3C804300 JMP DWORD PTR DS - 004384C6






004384CC 6A 00 PUSHの0x0の
004384CE FF15 B8924300 CALL DWORD PTR DS:[0x4392B8]。kernel32.ExitProcess
004384D4 8BE5 MOV ESP、EBP
004384D6 5D POP EBP
004384D7 C3 RETN

注1-CALL 004383A0

//この関数は、所望であれば、アクセスレジスタは、一緒に取得KERNEL32ベースアドレスリストと、一般的にアクセス可能FsのTEB及びPEBスレッド構造であり、アクセスモジュールPEB構造をFSソースオペレーティング・レジスタを発見しました。PEBとFSレジスタの上記の理解から、コードはほとんどkernel32のベースアドレスを発見されました。おなじみの機能を参照してくださいdown'll見えます。このパラメータを使用してステップの後、観測ステップは、初期化関数のアドレスである前に、私たちは推測していました。
004383A0 55 EBP PUSH
004383A1 8bec MOV EBP、ESP
004383A3 51 PUSH ECXある
004383A4 56はPUSH ESIある
004383A5 C745 FC 0000000は> MOV DWORD PTR SS:[EBP-を0x4]を0x0の
004383AC 50 PUSH EAX
004383AD 64:A1 30000000 MOV EAX、DWORD PTR FS :[0x30から]; PEB得る
004383B3 8B40 0C MOVをEAX、DWORD PTR DS:[EAX +から0xC]
004383B6 8B40 1C MOV EAX、DWORD PTR DS:[EAX + 0x1cに]
004383B9 8B00 MOV EAX、DWORD PTR DS:[EAX]
004383BB 8B00 MOV EAX、DWORD PTR DS: [EAX]
004383BD 8B40 08 MOV EAX、DWORD PTR DS:[EAX + 0x8という]
004383C0 8945 FC MOV DWORD PTR SS:[EBP-を0x4]、EAX
004383C3 58 POP EAX
004383C4 8B75 FC MOV ESI、DWORD PTR SS:[EBP-を0x4]
004383C7 E8 F4FEFFFF CALL 02.004382C0
004383CC 68 C4804300のPUSH 02.004380C4。ASCII "LoadLibraryA"
004383D1 56 PUSH ESI
004383D2 A3 CC924300 MOV DWORD PTR DS:[0x4392CC]、EAX
004383D7 FFD0 CALL EAX
004383D9 68 D4804300 PUSH 02.004380D4。ASCII "GetModuleHandleA"
004383DE 56 PUSH ESI
004383DF A3 C8924300 MOV DWORD PTR DS:[0x4392C8]、EAX
004383E4 FF15 CC924300 CALL DWORD PTR DS:[0x4392CC]
004383EA 68 E8804300 PUSH 02.004380E8。ASCII "VirtualProtect"
004383EF 56 PUSH ESI
004383F0 A3 C4924300 MOV DWORD PTR DS:[0x4392C4]、EAX
004383F5 FF15 CC924300 CALL DWORD PTR DS:[0x4392CC]
004383FB 68 F8804300 PUSH 02.004380F8。ASCII "user32.dllの"
00438400 A3 C0924300 MOV DWORD PTR DS:[0x4392C0]、EAX
00438405 FF15 C8924300 CALL DWORD PTR DS:[0x4392C8]
0043840B 68 04814300 PUSH 02.004381​​04。ASCII "MessageBoxA"
00438410 50 PUSHのEAX
00438411 FF15 CC924300 CALL DWORD PTR DS:[0x4392CC]
00438417 68 10814300 PUSH 02.004381​​10。ASCII "のExitProcess"
0043841C 56 PUSH ESI
0043841D A3 BC924300 MOV DWORD PTR DS:[0x4392BC]、EAX
00438422 FF15 CC924300 CALL DWORD PTR DS:[0x4392CC]
00438428 68 1C814300 PUSH 02.004381​​1C。ASCII "VirtualAllocの"
0043842D 56 PUSH ESI
0043842E A3 B8924300 MOV DWORD PTR DS:[0x4392B8]、EAX
00438433 FF15 CC924300 CALL DWORD PTR DS:[0x4392CC]
00438439 A3 B4924300 MOV DWORD PTR DS:[0x4392B4]、EAX
0043843E 5E POP ESI
0043843F 8BE5 MOV ESP、EBP
00438441 5D POP EBP
00438442 C3のRETN

遂に

00438439 A3 B4924300 MOV DWORD PTR DS:[0x4392B4]、EAX

データウィンドウに従って、いくつかの初期化関数を見つけました

1564729714614 [4]

00438290 2-コールコメント

コード// XOR機能の明確なラインは、このコール解読コードスニペットは明白であるがあります
00438290 8B0D 44804300 MOV ECX、DWORD PTR DS:[0x438044]; コードセグメントRVA取得
00438296を33C0 XOR EAX、EAX
00438298 030D 40804300 ADD ECX、DWORD PTR DS:[0x438040];コードベースコードセグメントRVA + =画像ベース
0043829E 3905 4C804300 CMP DWORD PTR DS: [0x43804C]、EAX; コードセグメント長
。004382A4 17 76 SHORT 02.004382BD JBE
004382A6 EB 08 JMP SHORT 02.004382B0
004382A8 00000000 ESP LEA 8DA424、PTR DWORD SS:[ESP]
004382AF 90 NOP
004382B0 XOR 15 803 408 BYTE PTR DS:[EAX ECX +]、0x15の、コードセグメント・ベース・アドレス+排他的オフセット又はコード
004382B4 EAX INC 40。
004382B5 CMP 3B05 4C804300 EAX 、DWORD PTR DS:[0x43804C]
^ 72 F3 JB SHORT 02.004382B0 004382BB
004382BD C3 RETN

3-OEP図に注意してください。

1564730529962 [4]

図4の暗号化-IATを注意してください

1564730515519 [4]

注5-CALL 004384E0

//IAT填充,需要先获取函数地址,于是在GetProcAddress下断,找到它,然后跟踪它分析,发现,有一行代码对它的返回值异或,之后将这个值保存在局部变量,紧接申请一个内存,将局部缓冲区的一块原本准备好的内容+刚刚加密的值宝贝走,然后填充到IAT地址。
004385B9    FF15 CC924300   CALL DWORD PTR DS:[0x4392CC]             ; kernel32.GetProcAddress
004385BF    6A 40           PUSH 0x40
004385C1    68 00300000     PUSH 0x3000
004385C6    6A 20           PUSH 0x20
004385C8    35 15151515     XOR EAX,0x15151515                       ; 修改IAT函数
004385CD    6A 00           PUSH 0x0
004385CF    8945 DB         MOV DWORD PTR SS:[EBP-0x25],EAX         ; 保存加密之后的iat函数
004385D2    FF15 B4924300   CALL DWORD PTR DS:[0x4392B4]             ; kernel32.VirtualAlloc
004385D8    F30F6F45 D0     MOVDQU XMM0,DQWORD PTR SS:[EBP-0x30]     ; 移位64位到数据到mm0
004385DD 8B55 CC MOV EDX、DWORD PTR SS:[EBP-0x34の]
004385E0 F30F7F00 MOVDQU DQWORD PTR DS:[EAX]、XMM0;アプリケーションに割り当てられたスペース
004385E4 F30F6F45 E0 MOVDQU XMM0、DQWORD PTR SS:[EBP-の0x20]
004385E9 F30F7F40 10 MOVDQU DQWORD PTR DS:[EAX + 0x10の]、XMM0
004385EE 8907 MOV DWORD PTR DS:[EDI]、EAX、機能スタックに
ECX、DWORD PTRはDS 004385F0 8B4E 04 MOV [ESI +を0x4]
004385F3 83C6 04 ADD ESI、0x4の
004385F6 8BFE MOV EDI、ESI
004385F8 TEST 85C9 ECX、ECX

1564735088148 [4]

おすすめ

転載: www.cnblogs.com/ltyandy/p/11289565.html