devflow.kr@:~#

connection still allocated 오류 해결 방법

ANDROID

HttpClient 를 사용중 아래와 같은 오류가 발생 한다.


W/SingleClientConnManager(22006): Invalid use of SingleClientConnManager: connection still allocated


또는



Exception in thread java.lang.IllegalStateException: Invalid use of SingleClientConnManager: connection still allocated.

Make sure to release the connection before allocating another one.



연결중에 앱이 종료됬다던가 여차저차 기존 HttpClient가 할당되어있을때 발생한다..

그래서 HttpClient를 새롭게 할당하는 부분을 바꿔주어야한다..


아래 함수를 이용한다.


public static DefaultHttpClient getThreadSafeClient()  {

        DefaultHttpClient client = new DefaultHttpClient();
        ClientConnectionManager mgr = client.getConnectionManager();
        HttpParams params = client.getParams();
        client = new DefaultHttpClient(new ThreadSafeClientConnManager(params, 

                mgr.getSchemeRegistry()), params);
        return client;
}


보통 HttpClient = New DefaultHttpClient(); 처럼 Client를 새로 할당해주는 부분을


httpclient = getThreadSafeClient(); 로 바꾸어주면 이미 할당되어 있으면 할당된 Client를 반환해 이후에 문제는 발생하지 않습니다.





위 getThreadSafeClient함수는 http://foo.jasonhudgins.com/2010/03/http-connections-revisited.html에서 발췌하였습니다.

Flash Tracer를 오픈소스로 공개하였습니다.

PHP






별로 어렵지도 않은 내용이라 공개했습니다.


GPLv3를 따릅니다..


https://github.com/devflow/Flash_Tracer

Viewholder 사용하기

ANDROID

보통 C/C++와같은 Native 언어에서 필드로 하여, 직접적으로 접근하는 것은 좋은 코드이긴 하나 안드로이드에서는 그렇지 않습니다.



객체에 접근하는 것은 지역 변수에 접근하는 것 보다 매우. 확실히  더 느립니다. 



그러기에 객체에 접근하는걸 Cache화 해야하는데.. 이런기능은 이미 제작되어있습니다..



그런데 별로 설명해주는곳이 없더군요.. 그건 ViewHolder라는 것을 사용하면 됩니다.



이름 그대로 View를 홀더에 꼽는다. 혹은 View에 홀더를 꼽아서 꺼내기 편하게 한다..



 즉. 참조하기 빠르게 미리 꼽아둔다는 겁니다.



제가 사용한 ViewHolder를 보며 예를 들어보겠습니다.


import java.util.ArrayList;

import android.content.Context;
import android.text.Html;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
 
class ViewHolder
{
    ImageView ivThumbnail;
    TextView tvScreenName;
    TextView tvCreatedAt;
    TextView tvText;
}

public class CustomAdapter extends ArrayAdapter<TweetInfo>
{
    private Context mContext;
    private int mResource;
    private ArrayList<TweetInfo> mList;
    private LayoutInflater mInflater;
    public CustomAdapter(Context context, int layoutResource, ArrayList<TweetInfo> objects)
    {
        super(context, layoutResource, objects);
        this.mContext = context;
        this.mResource = layoutResource;
        this.mList = objects;
        this.mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        ViewHolder holder = null;
        TweetInfo tweet = mList.get(position);
 
        if(convertView == null)
        {
            convertView = View.inflate(mContext, R.layout.lst_view_row, null);                
            holder = new ViewHolder();
            holder.ivThumbnail = (ImageView) convertView.findViewById(R.id.list_view_row_profile_thumbnail);
            holder.tvScreenName = (TextView) convertView.findViewById(R.id.list_view_row_user_screen_name);
            holder.tvCreatedAt = (TextView) convertView.findViewById(R.id.list_view_row_create_at);
            holder.tvText = (TextView) convertView.findViewById(R.id.list_view_row_text);
            convertView.setTag(holder);
        }else{
            holder = (ViewHolder)convertView.getTag();
        }
        
        if (tweet != null) 
        {
            holder.tvScreenName.setText(tweet.getFrom_user());
            holder.tvCreatedAt.setText(tweet.getCreated_at());
            holder.tvText.setText(tweet.getText());
        }
        
  
        return convertView;
    }
}

간단하게 보면


아직 convertView가 캐시화(뷰홀더)에 저장이 안되어있으면, 새롭게 ViewHolder를 선언해 그곳에 꼽아(?) 보관해 줍니다.

다음에 사용할때 바로 멤버로 엑세스가 가능하게끔 접근성을 높여줍니다.


이렇게 사용하고 나면 많은 양의 Row가 잇어도 Listview는 힘들어 하지 않을겁니다.




저의 설명이 매우 부실하기 때문에 [여기][여기]를 참조해주시면 더욱 좋습니다. :)





Pull To Refresh listview (내려서 새로고침)

ANDROID


This project aims to provide a reusable Pull to Refresh widget for Android. It was originally based on Johan Nilsson's 
library (mainly for graphics, strings and animations), but these have been replaced since.


Features

  • Supports both Pulling Down from the top, and Pulling Up from the bottom (or even both).
  • Animated Scrolling for all devices (Tested on 1.6+)
  • Works for all AbsListView derived classes. ListView, ExpandableListView & GridView have been implemented.
  • Also Works with WebView!
  • Integrated End of List Listener for use of detecting when the user has scrolled to the bottom.
  • Maven Support (thanks to Stefano Dacchille)
  • Indicators to show the user when a Pull-to-Refresh is available
  • Lots of Customisation options!

Repository at https://github.com/chrisbanes/Android-PullToRefresh.







다른 Pull to refresh 컨틀로보다 좋은거같습니다.

쓰기도 나름 편하고 기능도 많고요.. 또 잡기능은 없고요 추천합니다.



https://github.com/chrisbanes/Android-PullToRefresh



Httpclient 쿠기 유지 방법

ANDROID

보통 프로그래머분들은 HttpClient를 이용할 때에 쿠키를 사용하여 세션(로그인)유지 하려, CookieManager등 사용합니다.


하지만 HttpClient 자체만으로도 쿠키를 지원합니다.



                httpclient = new DefaultHttpClient();

                HttpPost httppost = new HttpPost("http://");


이렇게  Client를 새로 열어주시고 다음부터 사용하실때에




                HttpGet httpGet = new HttpGet("http://i");

                HttpResponse response = httpclient.execute(httpGet);


이런식으로 Client를 새로 정의만 해주지 않으면 쿠키가 유지됩니다.

이 점에서 많은 삽질을 했네요..

XE 회원정보 특정 항목만 보여주며 출력하기.

PHP

XE에서는 기본으로 공개/비공개 할 수 있는 기능이 없습니다.

그러기에 직접 PHP을 수정해서 표시를 제한해줘야합니다.


저의 경우 본인과 관리자외 다른사람이 이메일과 아이디를 조회할 수 없도록 작성하겠습니다..



일단 불안정한 방법이지만 조금은 신뢰가 가는 방법을 택했습니다.



modules/member/skins/스킨이름/member_info.html 를 수정하기로합니다.


스킨마다 다를 수 잇긴합니다만.. 저는 sketchbook5 원월모듈 스킨을 사용중입니다.



회원목록에서 기본필드(*)을 표시해주는 구간을 아래와 같이 수정하시면 됩니다.



<!--@if((!($memberInfo[member_srl] == $logged_info->member_srl || $logged_info->is_admin == 'Y') && $formInfo->name == 'user_id') || (!($memberInfo[member_srl] == $logged_info->member_srl || $logged_info->is_admin == 'Y') && $formInfo->name == 'email_address'))-->

{@$value = '비공개'}

<!--@else-->

{@$value = $memberInfo[$formInfo->name]}

<!--@end-->



$memberInfo[member_srl] == $logged_info->member_srl 는 현재 로그인한 회원과 조회하려는 회원의 번호가 같는지 확인입니다.

$logged_info->is_admin == 'Y' 는 현재 로그인한 회원이 관리자인지 확인합니다.

$formInfo->name == 'user_id' 는 현재 읽어드리려는 기본필드중에 항목이 유저 ID인지 확인합니다.

$formInfo->name == 'email_address') 이것 또한 기본필드중 항목이 이메일주소인지 확인합니다.


이렇게 확인한 후 ,  자신의정보가 아니거나 관리자가 아니며 유저 id가 표시될때에는 비공개로 표시 그렇지 않을때에는 올바른값 표시.

이메일도 같은 방법으로 자신의정보가 아니거나 관리자가 아니며 이메일이 표시될때에는 비공개로 표시 그렇지 않을때에는 올바른값 표시.

RewriteEngine를 이용해 한서버로 여러 게시판 돌리기

HTML/CSS

보통 가난한 저와같은 사람들은 서버 여러대 사면서 까지 여러서버를 돌릴 순 없습니다.


그러기에 꼼수를 조금 이용해서 한 서버에서 여러 게시판, 즉 여러 홈페이지를 사용하는 방법을 알아보면..


그중 대표적으로 XE에서는 CafeXE라고.. 사용해보지는 않았지만.. 서브 도메인이나, /~~/ 서브  폴더로 구분하여,


운영을 할 수 잇는 기능을 제공합니다.. 이 부분에 대해서는 나중에 따로 포스팅하겠습니다..



RewriteEngine(htaccess) 을 이용해서 서브도메인으로 여러 게시판 접근하기를 사용하기 위해선..


일단 .htaccess 가 작동을 해야겠습니다.. 아.. 그전에 Rewrite Engine이 무엇인지 인용하겠습니다.


다시쓰기 엔진(영어: rewrite engine)은 웹 URL을 변경하는(URL 다시쓰기) 소프트웨어다. 다시 쓰여진 URL은 일반적으로 원래의 URL보다 더 짧고 깔끔하며(깔끔 URL) 검색 엔진에 최적화 되어있고 웹페이지 내용과 연관이 있다. 아파치 에서는 mod_rewrite 모듈로 구현이 되어 있다. 출저 : 위키피디아



보통 호스팅이라 이름을 붙이고 운영해주는 서버에서는 99%로 RewriteEngine를 지원합니다..


하지만 윈도우서버에서 IIS를 이용한 서버일시 .htaccess는 그냥 작동하진 않습니다.


재작성 모듈을 따로 설치하시고, 서버에 등록을 수동으로 시켜줘야 합니다.. 번거롭..



여튼 .htaccess에 아래와 같은 내용을 입력해주시면 됩니다..




RewriteEngine On


RewriteBase /

RewriteCond $1 !^(서브도메인)/

RewriteCond %{HTTP_HOST} ^서브도메인\.도메인\.도메인종류 [NC] 

RewriteRule ^(.*)$ /이동할폴더/$1 [L]




각 문법은 어떤역할을 하는지 아시겠죠?


Flash Tracer

분류없음






쓰플 또는 JWPlayer의 영상리스트 또는 영상 주소를 뽑아줍니다. (SWF 내장 주소는 추후 지원)




http://lab.devflow.kr/lab/flashtracer/index.php

devflow lab을 오픈하였습니다.

NEWS

devflow lab으로 이동 를 클릭하시면 됩니다..



개인적으로 공부하려고 만든 사이트며. 배우면서 남주는게 목표입니다.. 도움이 많이 될 자료를 업로드하겠습니다.



PHP, 게시판솔루션(XE, 그누보드), Weblogic등 많은 종류를 다룹니다.

윈도우 서버에 그누보드 설치하기

HTML/CSS

 Windows Server 2008 R2 의 IIS 7.5 with PHP 에서 그누보드를 설치해보기로 햇다..


XE는 문제없이 잘 운용이 되는데 이놈의 그누보드 설치부터 막힌다.


바로 short_tag 혹은 shrot_opem_tag값이 0이라 그런다.. 어쩔 수 없다.. 서버에서 설정을 바꿔주지 않기때문에.


사용자가 직접문제를 해결해야됬다. 일단 편법으로 모든 파일의 <?를 <?php 로 변경해보기로  하였다.


간단히 프로그램을 만들었다..  


폴더를 선탁하면, php확장자를 가진 <?가 있으먀 <?php 가 존재하지않는 파일의 모든 텍스트중 <?를 <?php 로 변화해주었다.


일단은 설치화면 까지는 별 에러없이 나왔다.



그런데 또 문제가 발생하였다.. 바로 <?=$변수?>와 같은 바로 변수를 출력해주는 문법..


<?php=$변수?>는 올바른 방법이 아니기 때문이다.. 또 모든 파일중 <?php= 를 <?php echo로 변경해주기로 햇다..


모두 설치되고 작동까지 하였다..



또 날 조롱하듯ㅋㅋㅋ 관리자 아이디가 생성되지도 않았다.. 어영부영 php를 작성하여, 관리자아이디를 만들었다..


그런데 또 이번엔 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 설정변경이 되지않는다.


또 강제로 <? <?= 를 longtag로 바꾼게 문제인거같았다.. 해결하려 했으나,, 그냥 그누보드를 버렸다..


무거워도 표준으로 제작된 XE를 사용하기로 하였다.



결론은 그누보드는 표준을 따르자. 안써 엿머겅





P.S 직접 만든 shrot_tag가 있는 php를 long_tag로 변경해주는 프로그램이다. (관리자 권한 실행과, .Net framework 2.0 이상이 필요)


shorttag2longtag.exe


Alpha-blend transparency form (PNG 파일 alpha로 form투명화)

VB

아래는 class입니다.

Imports System

Imports System.Drawing

Imports System.Drawing.Imaging

Imports System.Windows.Forms

Imports System.Runtime.InteropServices

'Translation from C# by Dj Den4ik

Public Class PerPixelAlphaForm

    'Implements Windows.Forms.IWin32Window


    Public Structure ARGB

        Public Blue As Byte

        Public Green As Byte

        Public Red As Byte

        Public Alpha As Byte

    End Structure


    Public Structure BLENDFUNCTION

        Public BlendOp As Byte

        Public BlendFlags As Byte

        Public SourceConstantAlpha As Byte

        Public AlphaFormat As Byte

    End Structure


    Public Const ULW_COLORKEY As Int32 = &H1

    Public Const ULW_ALPHA As Int32 = &H2

    Public Const ULW_OPAQUE As Int32 = &H4


    Public Const AC_SRC_OVER As Byte = &H0

    Public Const AC_SRC_ALPHA As Byte = &H1


    Public Declare Function UpdateLayeredWindow Lib "user32" Alias "UpdateLayeredWindow" (ByVal hwnd As IntPtr, ByVal hdcDst As IntPtr, ByRef pptDst As Point, ByRef psize As Size, ByVal hdcSrc As IntPtr, ByRef pprSrc As Point, ByVal crKey As Int32, ByRef pblend As BLENDFUNCTION, ByVal dwFlags As Int32) As Boolean

    Public Declare Function GetDC Lib "user32" Alias "GetDC" (ByVal hWnd As IntPtr) As IntPtr

    Public Declare Function ReleaseDC Lib "user32" Alias "ReleaseDC" (ByVal hWnd As IntPtr, ByVal hDC As IntPtr) As Integer

    Public Declare Function CreateCompatibleDC Lib "gdi32.dll" Alias "CreateCompatibleDC" (ByVal hDC As IntPtr) As IntPtr

    Public Declare Function DeleteDC Lib "gdi32.dll" Alias "DeleteDC" (ByVal hDC As IntPtr) As Boolean

    Public Declare Function SelectObject Lib "gdi32.dll" Alias "SelectObject" (ByVal hDC As IntPtr, ByVal hObject As IntPtr) As IntPtr

    Public Declare Function DeleteObject Lib "gdi32.dll" Alias "DeleteObject" (ByVal hObject As IntPtr) As Boolean


    Public Sub SetBitmap(ByVal bitmap As Bitmap, ByVal opacity As Byte, ByVal frm As Form)

        If bitmap.PixelFormat <> PixelFormat.Format32bppArgb Then Throw New ApplicationException("The bitmap must be 32ppp with alpha-channel.")


        ' The ideia of this is very simple,

        ' 1. Create a compatible DC with screen;

        ' 2. Select the bitmap with 32bpp with alpha-channel in the compatible DC;

        ' 3. Call the UpdateLayeredWindow.


        Dim screenDc As IntPtr = GetDC(IntPtr.Zero)

        Dim memDc As IntPtr = CreateCompatibleDC(screenDc)

        Dim hBitmap As IntPtr = IntPtr.Zero

        Dim oldBitmap As IntPtr = IntPtr.Zero


        Try

            hBitmap = bitmap.GetHbitmap(Color.FromArgb(0)) ' grab a GDI handle from this GDI+ bitmap

            oldBitmap = SelectObject(memDc, hBitmap)

            Dim size As New Size(bitmap.Width, bitmap.Height)

            Dim pointSource As New Point(0, 0)

            Dim topPos As New Point(frm.Left, frm.Top)

            Dim blend As New BLENDFUNCTION

            blend.BlendOp = AC_SRC_OVER

            blend.BlendFlags = 0

            blend.SourceConstantAlpha = opacity

            blend.AlphaFormat = AC_SRC_ALPHA

            UpdateLayeredWindow(frm.Handle, screenDc, topPos, size, memDc, pointSource, 0, blend, ULW_ALPHA)

        Finally

            ReleaseDC(IntPtr.Zero, screenDc)

            If hBitmap <> IntPtr.Zero Then

                SelectObject(memDc, oldBitmap)

                DeleteObject(hBitmap)

            End If

            DeleteDC(memDc)


        End Try

    End Sub

End Class


아래는 폼입니다.

Dim ppaf As New PerPixelAlphaForm

    Dim MainBack As Bitmap = My.Resources.mainback

    Dim bmp As New Bitmap(MainBack)

Protected Overrides ReadOnly Property CreateParams() As System.Windows.Forms.CreateParams

        Get

            Dim SecPerm As New Security.Permissions.SecurityPermission(Security.Permissions.PermissionState.Unrestricted)

            SecPerm.Demand()

 

            ' Extend the CreateParams property of the Button class.

            Dim cp As System.Windows.Forms.CreateParams = MyBase.CreateParams

            ' Update the button Style.

            cp.ExStyle = &H80000

 

            Return cp

        End Get

    End Property

    Public Sub redraw()

        Me.BackgroundImage = MainBack

        bmp.Dispose()

        bmp = New Bitmap(MainBack)

        For Each ctrl As Control In Me.Controls

            Application.DoEvents()

            ctrl.DrawToBitmap(bmp, ctrl.Bounds)

        Next

        Me.Region = New Region()

        ppaf.SetBitmap(bmp, 255, Me)

    End Sub

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)

        Const WM_MOUSEMOVE As Int32 = &H200

        Const WM_NCLBUTTONDOWN As Int32 = &HA1

        Const HTCAPTION As Int32 = 2

 

        If m.Msg = WM_MOUSEMOVE Then

            MyBase.Capture = False

            Dim message As New Message

            With message

                .HWnd = Me.Handle

                .Msg = WM_NCLBUTTONDOWN

                .WParam = HTCAPTION

                .LParam = 0&

            End With

            MyBase.WndProc(message)

        End If

        MyBase.WndProc(m)

    End Sub


PNG-24를 지원합니다.

Alpha-blending으로 form을 투명화합니다.



출저 : http://pastesite.com/22086 & MORE

마비노기 영웅전 (마영전) 시즌2 커밍 티저!!

NEWS

기대됩니다.


마비노기 : 영웅전 시즌2 이벤트

분류없음

마비노기 영웅전 File System error 37

NEWS

---------------------------

Error

---------------------------

File system error 37

---------------------------

확인   

---------------------------


마영전을 실행할때 위와같은 오류가 발생한다면, 게임의 재설치가 필요하다.

보통 파일시스템에서의 37에러는 이미 사용중, 즉 엑세스가 불가능할때 발생한다.

마영전의 경우에는 아마 파일을 읽어야 하는데 데이터가 손실됬거나 모자른 경우 발생하는듯 하다.

[알고리즘,꼼수]프로그램의 사용자 현황 파악하기

APPS

방금 구현했네요 ㅋㅋㅋㅋ 심심해서 해봤는데 ㅋㅋㅋ


일단 보통 프로그램을 배포한다고하면 그에대한 버전별 사용현황이나 유저의 정보를 통계적으로 알고싶을땐 

마땅히 서버도 없는데 이 정보들을 어떻게 수집하면 좋을까 하다가.


티스토리의 유입경로(Referer)를 응용하게되었습니다.


간단합니다. 따로 티스토리 블로그하나를 팝니다. 그 후 프로그램 메인에서 해당 블로그로 접속을 합니다.


단 핵심인 Referer 헤더를 넣어주면됩니다. 그냥 단어로만주면 유입경로에 표시되지 않더군요.


대충아무 사이트처럼 Referer: http://static-program.com/?ver=XXXX&os=XX ....


이런식으로 하면됩니다. 참 쉽져??



ㅋㅋㅋ

아 이거 왜케 웃긴지 ㅋㅋㅋ




방송국 로고처럼 만들어보자

CG


먼저 포토샵을 켭니다..

File -> New 를 클릭하여 새로운 이미지를 만듭니다.



다음 화면은 사이즈와 각종 이미지의 속성을 정합니다.

크기는 사용자 능력껏 설정해주시고, Background Contents를 반드시 Trasparent(투명)으로 해주세요.

그래야 반투명하게 사용 할 수 있습니다.



그리고 이대로 작업하면 눈이 아프기때문에.. 레이어를 하나 만들어주고 Layer1 보다 아랫쪽에 위치해줍시다.



검은색을 팔렛트에서 선택하셔서



alt + del키를 눌러 채우기를 해줍니다.



그 후 Text 툴을 클릭해줍시다.



적절한 위치에 텍스트입력할 공간을 지정해줍니다.



원하는 글자 입력후 화살표키로 잘 이동시켜 자리잡아줍니다.



그리고 저렇게 생긴 Rounded Rectagle Tool(맞나...)를 클릭으로 선택해줍니다.



위 쪽 툴 설정에서 Pixels 를 선턱해줍니다. 



이후 Radius(가장자리) 정도를 3px정도로 잡아줍니다. 너무 크면 너무 둥글둥글해지거든요.



이것도 적절한 위치에 잡아줍시다.



그리고 Text Tool로 검음색이든 어느 색이든 보일만한 색으로 원하는 문자열을 갈겨줍니다.

갈겨 주신다음에 Layer1을 선택(주황색박스)를 선택한 채로, Ctrl 키를 눌러 HD텍스트 문자열의 'T'모양(하늘색박스)

를 클릭해줍니다.



그러면 위 처럼 글자가 선택됩니다. 그후 Del키를 눌러 구멍을 뚫어줍니다.

( !! Layer1을 선택한 채로 del키를 눌러주세요 )



이젠 필요없는 HD문자 레이어를 아래 delete layer버튼으로 지워줍니다.



삭제 후, Layer1과 DeV(맨처음만든 글자)를 Ctrl로 모두 선택하신 후, Opacity(투명도)를 설정해줍니다.

저는 50%로 했습니다.



투명도를 설정하신 후 Layer2 (검은배경)을 삭제해줍니다.



이젠 저장하기위해 File -> Save for Web 을 눌러줍니다.



오른쪽 상단에 콤보박스에서 PNG-24를 선택해야 불투명(Alpha-Blend)를 사용 할 수 있습니다.



이젠 Save 버튼을 눌러 저장합니다.



이젠 능력껏 활용하시면 됩니다.


쓰플이나 JWPlayer에 박는방법은 검색해보세요.




AOBSCAN Function at vb.net

VB

    Public Declare Function OpenProcess Lib "KERNEL32" _

        (ByVal DesiredAccess As Int32, _

         ByVal InheritHandle As Boolean, _

         ByVal ProcessId As Int32) _

        As Int32


    Private Declare Function ReadProcessMemory Lib "KERNEL32" _

    (ByVal Handle As Int32, _

     ByVal address As Int32, _

     ByRef Value As Int32, _

     Optional ByVal Size As Int32 = 4, _

     Optional ByVal lpNumberOfBytesWritten As Int64 = 0) _

    As Long


    Public PROCESS_VM_OPERATION As Int32 = 8

    Public PROCESS_VM_READ As Int32 = 16

    Public PROCESS_VM_WRITE As Int32 = 32


    Private process_id As Int32 = 0

    Public pHandle As Integer = 0


    Public Function GetProcessId(ByVal game_name As String) As Boolean

        Dim Processes() As Process = Process.GetProcesses

        Dim process_name As String

        Dim i As Byte

        For i = LBound(Processes) To UBound(Processes)

            process_name = Processes(i).ProcessName

            If process_name = game_name Then

                process_id = Processes(i).Id

                pHandle = OpenProcess(PROCESS_VM_OPERATION + PROCESS_VM_WRITE + PROCESS_VM_READ, False, process_id)

                Return True

            End If

        Next

        If process_id = 0 Then

            Return False

        End If

        Return False

    End Function


    Public Function ReadByte(ByVal address As Int32) As Integer

        Dim value As Integer

        ReadProcessMemory(pHandle, address, value, 1, 0)

        Return value

    End Function


    Public Function AOBSCAN(ByVal GameName As String, ByVal ModuleName As String, ByVal Signature As Byte()) As Integer

        Dim BaseAddress, EndAddress As Int32

        For Each PM As ProcessModule In Process.GetProcessesByName(GameName)(0).Modules

            If ModuleName = PM.ModuleName Then

                BaseAddress = PM.BaseAddress

                EndAddress = BaseAddress + PM.ModuleMemorySize

            End If

        Next

        Dim curAddr As Int32 = BaseAddress

        Do

            For i As Long = 0 To Signature.Length - 1

                If ReadByte(curAddr + i) = Signature(i) Then

                    If i = Signature.Length - 1 Then

                        Return curAddr

                    End If

                    Continue For

                End If

                Exit For

            Next

            curAddr += 1

        Loop While curAddr < EndAddress

        Return 0

    End Function

-----------


                Dim MyByteArray() As Byte = New Byte() {&H75, &H12}

                Dim pos As Integer = AOBSCAN("", "", MyByteArray)

                WriteMem(Proc.Handle, pos, New Byte() {&H74}, 1, 1)

vb.net 프로세스 리스트 가져오기

VB



.net으로 전향되면서 많은 기능들이 자체적으로 생겼습니다.

   

        Dim ProcessList As System.Diagnostics.Process()

        ProcessList = System.Diagnostics.Process.GetProcesses()

        Dim Proc As System.Diagnostics.Process


        For Each Proc In ProcessList

            If Proc.ProcessName = "notepad" Then MsgBox("Detected")

        Next



Proc의 멤버로 통해 pid, handle, path 등등 많은 정보를 얻을 수 있습니다.

.net(C#, vb)으로 작성된 exe 디컴파일 보호하기

REVERSING

[사진1- 필자의 프로그램인 2012/05/30 - [유용한 자료] - XML 자동 업로더기 XmLeader v1.0를 reflector로 디컴파일 한결과 소스가 전부 그대로 나와버린다.)


.net의 특성상, reflector로 exe를 열면 소스코드가 그대로 나오는 대참사가 발생한다.ㅜ

이를 방지하기 위하여 많은 방법이 있는데 그 방법을 소개하기로 한다.


1. 프로그래머의 노력(?)

 - 말 그대로 노력이다. 그것은 바로 최대한 디컴파일 후 해커가 알아보기 어렵도록 소스를 작성한다던가.

   그런 종류의 일이다.

 - 근데 이건 좀 너무하는것 같다.


2. CryptoObfuscator 의 이용.


(사진2. Crypto Obfuscator for .Net v2011의 메인화면)


- 위와 같이 생긴 툴이다. 엄청난 기능을 제공한다.

- 메서드의 이름을 간단화 (ex A, B, ab1, ab2 ... 등)으로 바꾸어 주거나, String의 암호화, Text로 표현할 수 없게끔 변경하여 준다, 

- 이 툴은 정말 유용하며, 사용도 편리하고, 많은 기능이 제공된다.

- 자세한 사항 또는 무료 체험판 다운로드는 (http://www.ssware.com/cryptoobfuscator/obfuscator-net.htm)

- 그외 VS제품군에게 유용한 기능을 제공하는 소프트웨어가 있다.


3. exe의 packing.

 - 단순하지만 또한 강력하다.

 - exe packer는 매우 다양하므로 직접 검색하여 찾아보기를 권장한다.


 4. 다른 언어의 이용..

  - 이라곤 하지만 어느 언어든 디컴파일은 어느정도의 수준까지 가능하다. 하지만 이런식으로 전체소스가 다 나오는 정도의 대형 참사는 발생하지는 않을 것이다.



* 프로그램의 요청은 받지않습니다, 구글링 몇번만 하면 됩니다.



[vb.net] Listview 정렬하기 (오름차순 내림차순)

VB

보통 listview는 자체적으로 sort를 통하여 none과 오룸, 내림순으로 정렬할 수 있다.

하지만 sort에 none이 아닌 다른설정을 주게된다면.. 사용자 임의로 리스트 재정렬(?)을 할 수 없다.

즉, 값이 바뀔때마다 계속 listview는 아이템을 sort해준다.


필요에따라 위치를 변경 할 수 있게끔 자동 sort를 대체할만한 메서드를 만들어보았다.



    Public Sub ListViewSort(ByRef lv As ListView, ByVal col As Integer, ByVal AceDec As Boolean)

        Dim lvTempItem As ListViewItem

        Dim i As Integer

        If AceDec Then

            For i = 0 To lv.Items.Count - 2 

                If CStr(lv.Items(i).SubItems(col).Text) > CStr(lv.Items(i + 1).SubItems(col).Text) Then

                    lvTempItem = lv.Items(i)

                    lv.Items(i).Remove()

                    lv.Items.Insert((i + 1), lvTempItem)

                    i = -1

                End If

            Next i

        Else

            For i = 0 To lv.Items.Count - 2 

                If CStr(lv.Items(i).SubItems(col).Text) < CStr(lv.Items(i + 1).SubItems(col).Text) Then

                    lvTempItem = lv.Items(i)

                    lv.Items(i).Remove()

                    lv.Items.Insert((i + 1), lvTempItem)

                    i = -1

                End If

            Next i

        End If

    End Sub


사용법은 아래와 같다.


 ListViewSort(byref 정렬할listview,byval 정렬을 기준할 칼럼번호,byval 1은 오름차순, 그외 내림차순)


그후 반드시 해당 리스트뷰를 refresh해주는것을 추천한다,.